Polygon Sponsored slots available. Book your slot here!
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 288 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 64375890 | 26 days ago | IN | 0 POL | 0.00158317 | ||||
Approve | 63598584 | 45 days ago | IN | 0 POL | 0.00225611 | ||||
Approve | 63398201 | 50 days ago | IN | 0 POL | 0.0061243 | ||||
Approve | 63194696 | 55 days ago | IN | 0 POL | 0.00194304 | ||||
Approve | 59660885 | 144 days ago | IN | 0 POL | 0.00074955 | ||||
Transfer | 59547173 | 147 days ago | IN | 0 POL | 0.03746222 | ||||
Transfer | 58741143 | 167 days ago | IN | 0 POL | 0.0021543 | ||||
Approve | 57685746 | 193 days ago | IN | 0 POL | 0.00354517 | ||||
Approve | 56333651 | 229 days ago | IN | 0 POL | 0.00357995 | ||||
Approve | 56321570 | 229 days ago | IN | 0 POL | 0.00372178 | ||||
Approve | 56258611 | 231 days ago | IN | 0 POL | 0.00568791 | ||||
Approve | 56101230 | 235 days ago | IN | 0 POL | 0.00081345 | ||||
Approve | 55982494 | 238 days ago | IN | 0 POL | 0.00186681 | ||||
Approve | 55950276 | 239 days ago | IN | 0 POL | 0.00619333 | ||||
Approve | 55630272 | 248 days ago | IN | 0 POL | 0.02862381 | ||||
Approve | 55629649 | 248 days ago | IN | 0 POL | 0.00874529 | ||||
Approve | 55629457 | 248 days ago | IN | 0 POL | 0.02016311 | ||||
Approve | 55572961 | 249 days ago | IN | 0 POL | 0.00434874 | ||||
Approve | 55572929 | 249 days ago | IN | 0 POL | 0.00434874 | ||||
Transfer | 55572863 | 249 days ago | IN | 0 POL | 0.00660652 | ||||
Transfer | 55572841 | 249 days ago | IN | 0 POL | 0.00653471 | ||||
Transfer | 55572773 | 249 days ago | IN | 0 POL | 0.00653471 | ||||
Approve | 55572681 | 249 days ago | IN | 0 POL | 0.00345063 | ||||
Approve | 55492554 | 251 days ago | IN | 0 POL | 0.00379124 | ||||
Approve | 55454738 | 252 days ago | IN | 0 POL | 0.00278048 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
55258348 | 257 days ago | 322.99060484 POL |
Loading...
Loading
Contract Name:
MiniHarambe
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Unlicensed pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol"; import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol"; contract MiniHarambe is IERC20, IERC20Metadata, Ownable { using Address for address; using SafeMath for uint8; using SafeMath for uint256; using EnumerableSet for EnumerableSet.AddressSet; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Basic ERC20 properties //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Token decimals uint8 constant private _decimals = 18; // Total circulating supply uint256 private _totalSupply; function name() public pure override returns (string memory) { return "Mini Harambe"; } function symbol() public pure override returns (string memory) { return "MHB"; } function decimals() public pure override returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Settings //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Divider for the MaxBalance based on circulating Supply (4%) uint8 public constant BalanceLimitDivider = 25; // Divider for buyLimit based on circulating Supply (4%) uint16 public constant BuyLimitDivider = 25; // Divider for sellLimit based on circulating Supply (2%) uint16 public constant SellLimitDivider = 100; // Sellers get locked for MaxSellLockTime so they can't dump repeatedly uint16 public constant MaxSellLockTime = 60 seconds; // Buyers get locked for MaxBuyLockTime so they can't buy repeatedly uint16 public constant MaxBuyLockTime = 0 seconds; // Maximum tax amount to make it impossible creating a honeypot uint16 public constant MaxTax = 20; // The time Liquidity gets locked at start and prolonged once it gets released uint256 private constant DefaultLiquidityLockTime = 0; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Public variables //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Initially false, can be set to true by the owner and not be disabled again afterwards bool public tradingEnabled = false; // Variables that track buy/sell/balance limits uint256 public balanceLimit; uint256 public buyLimit; uint256 public sellLimit; uint256 public buyLockTime; uint256 public sellLockTime; bool public buyLockDisabled; bool public sellLockDisabled; bool public isContractSwappingPaused; // Amount to swap for liquidity uint256 public liquiditySwapAmount = 200000 * 10**_decimals; // Total liquidity generated, useful for tickers uint256 public totalLiquidityGenerated; // Total funding balance uint256 public fundingBalance; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Private variables //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Tracks the current Taxes, different taxes can be applied for buy/sell/transfer uint256 private _buyTax; uint256 private _sellTax; uint256 private _transferTax; uint256 private _percentTaxUsedToBurn; uint256 private _percentTaxUsedForLiquidity; uint256 private _percentTaxUsedForFunding; address private _teamWallet; address private _liquidityAddress; //the timestamp when Liquidity unlocks uint256 private _liquidityUnlockTime; mapping (address => uint256) private _sellLock; mapping (address => uint256) private _buyLock; // Tracked addresses EnumerableSet.AddressSet private _team; EnumerableSet.AddressSet private _excluded; EnumerableSet.AddressSet private _excludedFromSellLock; EnumerableSet.AddressSet private _excludedFromBuyLock; // QuickSwap address private _routerAddress = 0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff; IUniswapV2Router02 private _router; // ERC20 values mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _initialSupply; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Initialization //////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor () { _initialSupply = 100000000 * 10**_decimals; // 500 million tokens _teamWallet = msg.sender; _mint(msg.sender, _initialSupply); _totalSupply = _initialSupply; // connect to router and create pair _router = IUniswapV2Router02(_routerAddress); _liquidityAddress = IUniswapV2Factory(_router.factory()).createPair(address(this), _router.WETH()); // sets buy/sell limits balanceLimit = _initialSupply /BalanceLimitDivider; buyLimit = _initialSupply /BuyLimitDivider; sellLimit = _initialSupply /SellLimitDivider; // sets lock times buyLockTime = MaxBuyLockTime; sellLockTime = MaxSellLockTime; // sets starting tax _buyTax=4; _sellTax=4; _transferTax=0; // and the tax usage _percentTaxUsedToBurn = 0; _percentTaxUsedForLiquidity = 50; _percentTaxUsedForFunding = 50; //Team wallet and deployer are excluded from Taxes _excluded.add(msg.sender); // set liquidity lock _liquidityUnlockTime = block.timestamp + DefaultLiquidityLockTime; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Public methods //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Resets sell lock of caller to the default sellLockTime should something go very wrong function resetSellLock() public { _sellLock[msg.sender] = block.timestamp + sellLockTime; } // Resets buy lock of caller to the default buyLockTime should something go very wrong function resetBuyLock() public { _buyLock[msg.sender] = block.timestamp + buyLockTime; } // Gets the time in seconds when liquidity is released, or zero if it is released function getLiquidityReleaseTimeInSeconds() public view returns (uint256) { if(block.timestamp < _liquidityUnlockTime) { return _liquidityUnlockTime - block.timestamp; } return 0; } // Gets the amount of tokens burned so far function getBurnedTokens() public view returns (uint256){ return _initialSupply.sub(_totalSupply); } // Gets the LP address function getLiquidityAddress() public view returns (address) { return _liquidityAddress; } // Gets a breakdown of the current taxes and how they are used function getTaxes() public view returns ( uint256 buyTax, uint256 sellTax, uint256 transferTax, uint256 percentOfTaxesUsedToBurn, uint256 percentOfTaxesUsedForLiquidity, uint256 percentOfTaxesUsedForFunding) { buyTax = _buyTax; sellTax = _sellTax; transferTax = _transferTax; percentOfTaxesUsedToBurn = _percentTaxUsedToBurn; percentOfTaxesUsedForLiquidity = _percentTaxUsedForLiquidity; percentOfTaxesUsedForFunding = _percentTaxUsedForFunding; } // How long is a given address still locked from buying function getAddressBuyLockTimeInSeconds(address _address) public view returns (uint256) { uint256 lockTime = _buyLock[_address]; if(lockTime <= block.timestamp) { return 0; } return lockTime - block.timestamp; } function getBuyLockTimeInSeconds() public view returns (uint256){ return buyLockTime; } // How long is a given address still locked from selling function getAddressSellLockTimeInSeconds(address _address) public view returns (uint256) { uint256 lockTime = _sellLock[_address]; if(lockTime <= block.timestamp) { return 0; } return lockTime - block.timestamp; } function getSellLockTimeInSeconds() public view returns (uint256){ return sellLockTime; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Owner privileges //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Enables trading for everyone function enableTrading() public onlyOwner { tradingEnabled = true; } // Sets the amount of tokens to swap for liquidity function setLiquiditySwapAmount (uint256 _amount) public onlyOwner { liquiditySwapAmount = _amount; } // Enables or disables automatic contract swapping for liquidity and funding function toggleContractSwappingPaused() public onlyOwner { isContractSwappingPaused = !isContractSwappingPaused; } // Updates the LP address function setLiquidityPoolAddress(address _address) public onlyOwner { _liquidityAddress = _address; } // Updates team wallet address function setTeamWallet(address _address) public onlyOwner { _teamWallet = _address; } // Add a wallet to team function addToTeam(address _address) public onlyOwner { require(!_isTeam(_address), "Address is already in team"); _team.add(_address); } // Remove a wallet from team function removeFromTeam(address _address) public onlyOwner { require(_isTeam(_address), "Address is not in team"); _team.remove(_address); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Team privileges //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Team doesn't have access to critical Functions that could turn this into a rug pull (except liquidity unlocks) function _isTeam(address _address) private view returns (bool){ return _address == owner() || _address == _teamWallet || _team.contains(_address); } modifier onlyTeam() { require(_isTeam(msg.sender), "Caller is not a team member"); _; } // Include / exclude wallets from taxes function teamExcludeFromTaxes(address _address) public onlyTeam { require(!_excluded.contains(_address), "Address is already excluded"); _excluded.add(_address); } function teamIncludeForTaxes(address _address) public onlyTeam { require(_excluded.contains(_address), "Address is already included"); _excluded.remove(_address); } // Include / exclude wallets from buy lock function teamExcludeFromBuyLock(address _address) public onlyTeam { require(!_excludedFromBuyLock.contains(_address), "Address is already excluded"); _excludedFromBuyLock.add(_address); } function teamIncludeForBuyLock(address _address) public onlyTeam { require(_excludedFromBuyLock.contains(_address), "Address is already included"); _excludedFromBuyLock.remove(_address); } // Include / exclude wallets from sell lock function teamExcludeFromSellLock(address _address) public onlyTeam { require(!_excludedFromSellLock.contains(_address), "Address is already excluded"); _excludedFromSellLock.add(_address); } function teamIncludeForSellLock(address _address) public onlyTeam { require(_excludedFromSellLock.contains(_address), "Address is already included"); _excludedFromSellLock.remove(_address); } // Withdraw funding balance to team wallet function teamWithdrawFundingBalance() public onlyTeam { uint256 _amount = fundingBalance; fundingBalance = 0; payable(_teamWallet).transfer(_amount); } function teamWithdrawFundingAmount(uint256 _amount) public onlyTeam{ require(_amount <= fundingBalance, "Amount to withdraw exceeds existing balance"); fundingBalance = fundingBalance.sub(_amount); payable(_teamWallet).transfer(_amount); } // Set buy and sell limits function teamSetBuyLimit(uint256 _value) public onlyTeam { buyLimit = _value; } function teamSetSellLimit(uint256 _value) public onlyTeam { sellLimit = _value; } // Toggle buy and sell locks function teamToggleBuyLock() public onlyTeam { buyLockDisabled = !buyLockDisabled; } function teamToggleSellLock() public onlyTeam { sellLockDisabled = !sellLockDisabled; } // Set buy and sell lock time function teamSetBuyLockTime(uint256 _seconds) public onlyTeam { require(_seconds <= MaxBuyLockTime, "Buy lock time exceeds maximum"); buyLockTime = _seconds; } function teamSetSellLockTime(uint256 _seconds) public onlyTeam { require(_seconds <= MaxSellLockTime, "Sell lock time exceeds maximum"); sellLockTime = _seconds; } // Set taxes and tax distribution function teamSetTaxes( uint256 _newBuyTax, uint256 _newSellTax, uint256 _newTransferTax, uint256 _newPercentOfTaxesUsedToBurn, uint256 _newPercentOfTaxesUsedForLiquidity, uint256 _newPercentOfTaxesUsedForFunding ) public onlyTeam { uint256 _newTotalTax = _newPercentOfTaxesUsedToBurn + _newPercentOfTaxesUsedForLiquidity + _newPercentOfTaxesUsedForFunding; require(_newTotalTax == 100, "Burn-, liquidity- and funding share of taxes need to sum to 100"); require(_newBuyTax <= MaxTax, "Buy tax too high"); require(_newSellTax <= MaxTax, "Sell tax too high"); require(_newTransferTax <= MaxTax, "Transfer tax too high"); _percentTaxUsedToBurn = _newPercentOfTaxesUsedToBurn; _percentTaxUsedForLiquidity = _newPercentOfTaxesUsedForLiquidity; _percentTaxUsedForFunding = _newPercentOfTaxesUsedForFunding; _buyTax = _newBuyTax; _sellTax = _newSellTax; _transferTax = _newTransferTax; } // Set buy-, sell- and balance limits function teamSetLimits( uint256 _buyLimit, uint256 _sellLimit, uint256 _balanceLimit) public onlyTeam { // Sell limit needs to be below 1% to avoid a large price impact when generating LP require(_sellLimit < _totalSupply.div(100), "Sell limit needs to be below 1% of circulating supply"); // Adds decimals to limits _balanceLimit = _balanceLimit; _sellLimit = _sellLimit; // Limits need to be at least target, to avoid setting value to 0 (avoid potential honeypot) uint256 targetBalanceLimit = _totalSupply.div(BalanceLimitDivider); uint256 targetSellLimit = _totalSupply.div(SellLimitDivider); uint256 targetBuyLimit = _totalSupply.div(BuyLimitDivider); require((_buyLimit >= targetBuyLimit), "New sell limit needs to be at least target"); require((_sellLimit >= targetSellLimit), "New sell limit needs to be at least target"); require((_balanceLimit >= targetBalanceLimit), "New balance limit needs to be at least target"); balanceLimit = _balanceLimit; sellLimit = _sellLimit; buyLimit = _buyLimit; } // Manually trigger the swapping of contract tokens for LP and funding balance function teamManuallySwapContractTokens() public onlyTeam { _swapContractToken(); } // Prolong the unlock time for the liquidity function teamSetLiquidityUnlockTime(uint256 _secondsUntilUnlock) public onlyTeam { uint256 newUnlockTime = block.timestamp.add(_secondsUntilUnlock); require(newUnlockTime > _liquidityUnlockTime, "New unlock time must be later than the previous one"); _liquidityUnlockTime = newUnlockTime; } // Release the liquidity to the team wallet function teamReleaseLiquidity() public onlyTeam { require(block.timestamp >= _liquidityUnlockTime, "Liquidity is not yet unlocked"); IERC20 liquidityToken = IERC20(_liquidityAddress); uint256 amount = liquidityToken.balanceOf(address(this)); liquidityToken.transfer(_teamWallet, amount); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Private methods //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Transfer function, every transfer runs through this function function _transfer(address sender, address recipient, uint256 amount) private { require(sender != address(0), "Transfer from zero"); require(recipient != address(0), "Transfer to zero"); //Manually Excluded addresses are transferring tax and lock free bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient)); //Transactions from and to the contract are always tax and lock free bool isContractTransfer=(sender==address(this) || recipient==address(this)); //transfers between router and pair are tax and lock free address router = address(_router); bool isLiquidityTransfer = ( (sender == _liquidityAddress && recipient == router) || (recipient == _liquidityAddress && sender == router) ); //differentiate between buy/sell/transfer to apply different taxes/restrictions bool isBuy = sender == _liquidityAddress || sender == router; bool isSell = recipient == _liquidityAddress || recipient == router; // Pick transfer if (isContractTransfer || isLiquidityTransfer || isExcluded) { _feelessTransfer(sender, recipient, amount); } else{ require(tradingEnabled,"ERC20: Trading not yet enabled"); _taxedTransfer(sender, recipient, amount, isBuy, isSell); } } // Applies taxes, checks for limits, locks generates auto LP and staking assets, and automatic stakes function _taxedTransfer(address sender, address recipient, uint256 amount, bool isBuy, bool isSell) private { uint256 recipientBalance = _balances[recipient]; uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: Transfer exceeds balance"); uint256 tax; if (isSell) { if(!_excludedFromSellLock.contains(sender)) { // If seller sold less than sellLockTime ago, sell is declined, can be disabled by Team require(_sellLock[sender] <= block.timestamp || sellLockDisabled, "ERC20: Caller in sell lock period"); // Sets the time sellers get locked _sellLock[sender] = block.timestamp + sellLockTime; } // Sells can't exceed the sell limit require(amount <= sellLimit, "ERC20: Sell limit exceeded"); tax = _sellTax; } else if (isBuy) { if (!_excludedFromBuyLock.contains(recipient)) { // If buyer bought less than buyLockTime ago, buy is declined, can be disabled by Team require(_buyLock[recipient]<=block.timestamp || buyLockDisabled,"ERC20: Caller in buy lock period"); // Sets the time buyers get locked _buyLock[recipient] = block.timestamp + buyLockTime; } // Checks if the recipient balance (excluding taxes) would exceed balance limit require(recipientBalance + amount <= balanceLimit,"ERC20: Balance limit exceeded"); require(amount <= buyLimit, "ERC20: Buy limit exceeded"); tax = _buyTax; } else { //Transfer // Checks If the recipient balance (excluding taxes) would exceed balance Limit require(recipientBalance+amount<=balanceLimit,"ERC20: Balance limit exceeded"); // Transfers are disabled in sell lock, this doesn't stop someone from transferring before // selling, but there is no satisfying solution for that, and you would need to pax additional tax if(!_excludedFromSellLock.contains(sender)) { require(_sellLock[sender]<=block.timestamp||sellLockDisabled, "ERC20: Sender in sell lock period"); } tax = _transferTax; } // Swapping auto LP and funding value is only possible if sender is not LP pair, // if its not manually disabled, if its not already swapping and if its a sell to avoid // people from causing a large price impact from repeatedly transferring when theres a large backlog of tokens if ((sender != _liquidityAddress) && (!isContractSwappingPaused) && (!_isSwappingContractModifier) && isSell) { _swapContractToken(); } // Calculates the exact token amount for each tax uint256 tokensToBeBurnt = _calculateFee(amount, tax, _percentTaxUsedToBurn); // Staking and liquidity tax get treated the same, only during conversion they get split uint256 contractToken = _calculateFee(amount, tax, _percentTaxUsedForFunding + _percentTaxUsedForLiquidity); // Subtract the taxed tokens from the amount uint256 taxedAmount = amount - (tokensToBeBurnt + contractToken); // Removes token and handles staking _removeToken(sender, amount); // Adds the taxed tokens to the contract wallet _balances[address(this)] += contractToken; // Burns tokens _burn(address(this), tokensToBeBurnt); _totalSupply = _totalSupply.sub(tokensToBeBurnt); //Adds token and handles staking _addToken(recipient, taxedAmount); emit Transfer(sender, recipient, taxedAmount); } // Feeless transfer only transfers and stakes function _feelessTransfer(address sender, address recipient, uint256 amount) private { uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: Transfer exceeds balance"); // Removes token and handles staking _removeToken(sender,amount); // Adds token and handles staking _addToken(recipient, amount); emit Transfer(sender, recipient, amount); } // Calculates the token that should be taxed function _calculateFee(uint256 amount, uint256 tax, uint256 taxPercent) private pure returns (uint256) { return (amount).mul(tax).mul(taxPercent).div(10000); } // Adds Token to balance function _addToken(address _address, uint256 amount) private { _balances[_address] = _balances[_address].add(amount); } // Removes token from balance function _removeToken(address _address, uint256 amount) private { _balances[_address] = _balances[_address].sub(amount); } // Swaps the token on the contract for funding assets and LP token. // Always swaps the sellLimit of token to avoid a large price impact function _swapContractToken() private lockTheSwap { uint256 contractBalance = _balances[address(this)]; uint256 totalTax = _percentTaxUsedForLiquidity.add(_percentTaxUsedForFunding); // only swap if contractBalance is larger than tokenToSwap, and totalTax is not equal to 0 if (contractBalance < liquiditySwapAmount || totalTax == 0) { return; } // splits the token into liquidity and funding uint256 tokenForLiquidity = liquiditySwapAmount.mul(_percentTaxUsedForLiquidity).div(totalTax); uint256 tokenForFunding = liquiditySwapAmount.sub(tokenForLiquidity); // splits tokenForLiquidity in 2 halves uint256 liqTokenShare = tokenForLiquidity.div(2); uint256 liqNativeTokenShare = tokenForLiquidity.sub(liqTokenShare); // swaps fundingToken and the liquidity token half for native token uint256 swapToken = liqNativeTokenShare.add(tokenForFunding); // gets the initial native balance, so adding liquidity won't touch any deposited native assets uint256 initialNativeBalance = address(this).balance; _swapTokenForNative(swapToken); uint256 swappedNative = (address(this).balance.sub(initialNativeBalance)); // calculates the amount of native asset belonging to the LP-Pair and converts them to LP uint256 liqNativeShare = swappedNative.mul(liqNativeTokenShare).div(swapToken); _addLiquidity(liqTokenShare, liqNativeShare); // and the rest to the funding balance fundingBalance = fundingBalance.add(swappedNative.sub(liqNativeShare)); } // Swaps tokens on the contract for native token function _swapTokenForNative(uint256 amount) private { _approve(address(this), address(_router), amount); address[] memory path = new address[](2); path[0] = address(this); path[1] = _router.WETH(); _router.swapExactTokensForETHSupportingFeeOnTransferTokens( amount, 0, path, address(this), block.timestamp ); } // Adds Liquidity directly to the contract where LP are locked (unlike SafeMoon-forks, that transfer it to the owner) function _addLiquidity(uint256 _tokens, uint256 _native) private { totalLiquidityGenerated += _native; _approve(address(this), address(_router), _tokens); _router.addLiquidityETH{value: _native}( address(this), _tokens, 0, 0, address(this), block.timestamp ); } // Creates tokens increasing the total supply function _mint(address account, uint256 amount) private { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _addToken(account, amount); emit Transfer(address(0), account, amount); } // Removes tokens decreasing the total supply function _burn(address account, uint256 amount) private { require(account != address(0), "ERC20: burn from the zero address"); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); _removeToken(account, amount); emit Transfer(account, address(0), amount); } // Grants the rights to spend owners tokens by spender function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } // Reduce the allowance of owner towards spender function _spendAllowance(address owner, address spender, uint256 amount) private { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); _approve(owner, spender, currentAllowance.sub(amount)); } } //Locks the swap if already swapping bool private _isSwappingContractModifier; modifier lockTheSwap { _isSwappingContractModifier = true; _; _isSwappingContractModifier = false; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ERC20 implementation //////////////////////////////////////////////////////////////////////////////////////////////////////////////// function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function transfer(address to, uint256 amount) public override returns (bool) { _transfer(msg.sender, to, amount); return true; } function transferFrom(address from, address to, uint256 amount) public override returns (bool) { _spendAllowance(from, msg.sender, amount); _transfer(from, to, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { uint256 currentAllowance = _allowances[msg.sender][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(msg.sender, spender, currentAllowance - subtractedValue); } return true; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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.9.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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * 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}. * * 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 default value returned by this function, unless * it's 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; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _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; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _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; // Overflow not possible: amount <= accountBalance <= totalSupply. _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 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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 (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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 (last updated v4.9.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; }
pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); }
pragma solidity >=0.6.2; import './IUniswapV2Router01.sol'; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; }
{ "evmVersion": "paris", "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BuyLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxBuyLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxSellLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addToTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fundingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getAddressBuyLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getAddressSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityReleaseTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxes","outputs":[{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","type":"uint256"},{"internalType":"uint256","name":"percentOfTaxesUsedToBurn","type":"uint256"},{"internalType":"uint256","name":"percentOfTaxesUsedForLiquidity","type":"uint256"},{"internalType":"uint256","name":"percentOfTaxesUsedForFunding","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":"isContractSwappingPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquiditySwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeFromTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setLiquidityPoolAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setLiquiditySwapAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setTeamWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"teamExcludeFromBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"teamExcludeFromSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"teamExcludeFromTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"teamIncludeForBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"teamIncludeForSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"teamIncludeForTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamManuallySwapContractTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamReleaseLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"teamSetBuyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seconds","type":"uint256"}],"name":"teamSetBuyLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyLimit","type":"uint256"},{"internalType":"uint256","name":"_sellLimit","type":"uint256"},{"internalType":"uint256","name":"_balanceLimit","type":"uint256"}],"name":"teamSetLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_secondsUntilUnlock","type":"uint256"}],"name":"teamSetLiquidityUnlockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"teamSetSellLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seconds","type":"uint256"}],"name":"teamSetSellLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBuyTax","type":"uint256"},{"internalType":"uint256","name":"_newSellTax","type":"uint256"},{"internalType":"uint256","name":"_newTransferTax","type":"uint256"},{"internalType":"uint256","name":"_newPercentOfTaxesUsedToBurn","type":"uint256"},{"internalType":"uint256","name":"_newPercentOfTaxesUsedForLiquidity","type":"uint256"},{"internalType":"uint256","name":"_newPercentOfTaxesUsedForFunding","type":"uint256"}],"name":"teamSetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamToggleBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamToggleSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"teamWithdrawFundingAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamWithdrawFundingBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleContractSwappingPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalLiquidityGenerated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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"}]
Contract Creation Code
60806040526000600260006101000a81548160ff0219169083151502179055506012600a6200002f91906200095b565b62030d406200003f9190620009ac565b60095573a5e0829caced8ffdd4de3c43696c57f7d7a678ff601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000a457600080fd5b50620000c5620000b96200046060201b60201c565b6200046860201b60201c565b6012600a620000d591906200095b565b6305f5e100620000e69190620009ac565b60238190555033601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000141336023546200052c60201b60201c565b602354600181905550601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16602060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200021b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000241919062000a61565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f1919062000a61565b6040518363ffffffff1660e01b81526004016200031092919062000aa4565b6020604051808303816000875af115801562000330573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000356919062000a61565b601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601960ff16602354620003aa919062000b00565b600381905550601961ffff16602354620003c5919062000b00565b600481905550606461ffff16602354620003e0919062000b00565b600581905550600061ffff16600681905550603c61ffff166007819055506004600c819055506004600d819055506000600e819055506000600f8190555060326010819055506032601181905550620004443360196200063960201b90919060201c565b5060004262000454919062000b38565b60148190555062000c24565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200059e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005959062000bd4565b60405180910390fd5b620005b5816001546200067160201b90919060201c565b600181905550620005cd82826200068960201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200062d919062000c07565b60405180910390a35050565b600062000669836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200072460201b60201c565b905092915050565b6000818362000681919062000b38565b905092915050565b620006dd81602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200067160201b90919060201c565b602160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60006200073883836200079e60201b60201c565b6200079357826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000798565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200084f57808604811115620008275762000826620007c1565b5b6001851615620008375780820291505b80810290506200084785620007f0565b945062000807565b94509492505050565b6000826200086a57600190506200093d565b816200087a57600090506200093d565b81600181146200089357600281146200089e57620008d4565b60019150506200093d565b60ff841115620008b357620008b2620007c1565b5b8360020a915084821115620008cd57620008cc620007c1565b5b506200093d565b5060208310610133831016604e8410600b84101617156200090e5782820a905083811115620009085762000907620007c1565b5b6200093d565b6200091d8484846001620007fd565b92509050818404811115620009375762000936620007c1565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b6000620009688262000944565b915062000975836200094e565b9250620009a47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000858565b905092915050565b6000620009b98262000944565b9150620009c68362000944565b9250828202620009d68162000944565b91508282048414831517620009f057620009ef620007c1565b5b5092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a2982620009fc565b9050919050565b62000a3b8162000a1c565b811462000a4757600080fd5b50565b60008151905062000a5b8162000a30565b92915050565b60006020828403121562000a7a5762000a79620009f7565b5b600062000a8a8482850162000a4a565b91505092915050565b62000a9e8162000a1c565b82525050565b600060408201905062000abb600083018562000a93565b62000aca602083018462000a93565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000b0d8262000944565b915062000b1a8362000944565b92508262000b2d5762000b2c62000ad1565b5b828204905092915050565b600062000b458262000944565b915062000b528362000944565b925082820190508082111562000b6d5762000b6c620007c1565b5b92915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000bbc601f8362000b73565b915062000bc98262000b84565b602082019050919050565b6000602082019050818103600083015262000bef8162000bad565b9050919050565b62000c018162000944565b82525050565b600060208201905062000c1e600083018462000bf6565b92915050565b6159298062000c346000396000f3fe608060405234801561001057600080fd5b50600436106103fc5760003560e01c806373f3109d11610215578063afbf720111610125578063df5316a9116100b8578063eb33dc7e11610087578063eb33dc7e14610b20578063eb8e886314610b3c578063ee84abeb14610b5a578063f2fde38b14610b76578063f88b0e4614610b92576103fc565b8063df5316a914610aac578063df7f568614610ab6578063dfdedf6914610ad4578063e803050c14610af0576103fc565b8063c3f4f54f116100f4578063c3f4f54f14610a36578063d0b4f46214610a54578063dc61266814610a5e578063dd62ed3e14610a7c576103fc565b8063afbf7201146109d4578063b0fd04c8146109de578063c0fc5fc1146109fa578063c3a3c03214610a18576103fc565b80638a8c523c116101a85780639c063599116101775780639c06359914610932578063a457c2d71461094e578063a8e6a0a81461097e578063a9059cbb14610988578063aaefee92146109b8576103fc565b80638a8c523c146108d05780638da5cb5b146108da57806395d89b41146108f85780639a5e580e14610916576103fc565b80638724a289116101e45780638724a2891461086e5780638728ecd114610878578063887c60fb146108a857806388b4811b146108c6576103fc565b806373f3109d146107fc5780637523f7f714610818578063762bb282146108345780638219599714610852576103fc565b80633478154b116103105780634f91e48c116102a357806363986aba1161027257806363986aba1461076c57806365abd912146107885780636c20a4a9146107a657806370a08231146107c2578063715018a6146107f2576103fc565b80634f91e48c146106f6578063589210d9146107145780635c69f690146107325780636195a3b514610750576103fc565b806344f3c83a116102df57806344f3c83a146106945780634ada218b146106b25780634e254e27146106d05780634e6baf74146106da576103fc565b80633478154b1461060e578063395093511461062c57806343696f181461065c5780634437106a14610678576103fc565b806318160ddd1161039357806323b872dd1161036257806323b872dd146105615780632973ef2d146105915780633054f8a3146105b4578063311a8697146105d2578063313ce567146105f0576103fc565b806318160ddd146104ff578063196d7bd31461051d5780631f8b845e14610527578063205063b414610545576103fc565b806312384c88116103cf57806312384c88146104895780631285073c146104a757806314ddc095146104c55780631525ff7d146104e3576103fc565b806306fdde0314610401578063095ea7b31461041f5780630d78baea1461044f5780630fd99e161461046b575b600080fd5b610409610bb0565b6040516104169190613f1c565b60405180910390f35b61043960048036038101906104349190613fd7565b610bed565b6040516104469190614032565b60405180910390f35b6104696004803603810190610464919061404d565b610c10565b005b610473610cc4565b6040516104809190614097565b60405180910390f35b610491610cc9565b60405161049e91906140c1565b60405180910390f35b6104af610cf3565b6040516104bc91906140eb565b60405180910390f35b6104cd610cfd565b6040516104da91906140eb565b60405180910390f35b6104fd60048036038101906104f8919061404d565b610d07565b005b610507610d53565b60405161051491906140eb565b60405180910390f35b610525610d5d565b005b61052f610db0565b60405161053c9190614097565b60405180910390f35b61055f600480360381019061055a9190614106565b610db5565b005b61057b60048036038101906105769190614133565b610e4f565b6040516105889190614032565b60405180910390f35b610599610e72565b6040516105ab96959493929190614186565b60405180910390f35b6105bc610ea1565b6040516105c99190614032565b60405180910390f35b6105da610eb4565b6040516105e79190614203565b60405180910390f35b6105f8610eb9565b6040516106059190614203565b60405180910390f35b610616610ec2565b6040516106239190614097565b60405180910390f35b61064660048036038101906106419190613fd7565b610ec7565b6040516106539190614032565b60405180910390f35b6106766004803603810190610671919061404d565b610f65565b005b610692600480360381019061068d9190614106565b610fce565b005b61069c6110e2565b6040516106a991906140eb565b60405180910390f35b6106ba6110e8565b6040516106c79190614032565b60405180910390f35b6106d86110fb565b005b6106f460048036038101906106ef9190614106565b61114d565b005b6106fe61115f565b60405161070b91906140eb565b60405180910390f35b61071c611165565b60405161072991906140eb565b60405180910390f35b61073a61116b565b6040516107479190614097565b60405180910390f35b61076a6004803603810190610765919061404d565b611170565b005b6107866004803603810190610781919061404d565b611224565b005b610790611270565b60405161079d91906140eb565b60405180910390f35b6107c060048036038101906107bb9190614106565b611276565b005b6107dc60048036038101906107d7919061404d565b611310565b6040516107e991906140eb565b60405180910390f35b6107fa611359565b005b6108166004803603810190610811919061404d565b61136d565b005b610832600480360381019061082d919061404d565b611421565b005b61083c6114d4565b60405161084991906140eb565b60405180910390f35b61086c6004803603810190610867919061404d565b6114da565b005b61087661158d565b005b610892600480360381019061088d919061404d565b611601565b60405161089f91906140eb565b60405180910390f35b6108b061166c565b6040516108bd9190614032565b60405180910390f35b6108ce61167f565b005b6108d8611742565b005b6108e2611767565b6040516108ef91906140c1565b60405180910390f35b610900611790565b60405161090d9190613f1c565b60405180910390f35b610930600480360381019061092b919061404d565b6117cd565b005b61094c6004803603810190610947919061421e565b611880565b005b61096860048036038101906109639190613fd7565b611a31565b6040516109759190614032565b60405180910390f35b610986611b0e565b005b6109a2600480360381019061099d9190613fd7565b611b61565b6040516109af9190614032565b60405180910390f35b6109d260048036038101906109cd9190614106565b611b78565b005b6109dc611bca565b005b6109f860048036038101906109f39190614106565b611bfe565b005b610a02611cac565b604051610a0f9190614032565b60405180910390f35b610a20611cbf565b604051610a2d91906140eb565b60405180910390f35b610a3e611ce8565b604051610a4b91906140eb565b60405180910390f35b610a5c611d06565b005b610a66611d7a565b604051610a7391906140eb565b60405180910390f35b610a966004803603810190610a9191906142ab565b611d80565b604051610aa391906140eb565b60405180910390f35b610ab4611e07565b005b610abe611fde565b604051610acb91906140eb565b60405180910390f35b610aee6004803603810190610ae9919061404d565b611fe4565b005b610b0a6004803603810190610b05919061404d565b61204c565b604051610b1791906140eb565b60405180910390f35b610b3a6004803603810190610b3591906142eb565b6120b7565b005b610b44612295565b604051610b519190614097565b60405180910390f35b610b746004803603810190610b6f9190614106565b61229a565b005b610b906004803603810190610b8b919061404d565b6122ec565b005b610b9a61236f565b604051610ba791906140eb565b60405180910390f35b60606040518060400160405280600c81526020017f4d696e6920486172616d62650000000000000000000000000000000000000000815250905090565b600080610bf8612375565b9050610c0581858561237d565b600191505092915050565b610c1933612546565b610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f9061438a565b60405180910390fd5b610c6c81601b6125f890919063ffffffff16565b15610cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca3906143f6565b60405180910390fd5b610cc081601b61262890919063ffffffff16565b5050565b606481565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600754905090565b6000600654905090565b610d0f612658565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600154905090565b60065442610d6b9190614445565b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b601981565b610dbe33612546565b610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df49061438a565b60405180910390fd5b600061ffff16811115610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c906144c5565b60405180910390fd5b8060068190555050565b6000610e5c8433846126d6565b610e67848484612772565b600190509392505050565b600080600080600080600c549550600d549450600e549350600f54925060105491506011549050909192939495565b600860009054906101000a900460ff1681565b601981565b60006012905090565b603c81565b6000610f5b338484602260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f569190614445565b61237d565b6001905092915050565b610f6d612658565b610f7681612546565b15610fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fad90614531565b60405180910390fd5b610fca81601761262890919063ffffffff16565b5050565b610fd733612546565b611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d9061438a565b60405180910390fd5b600b5481111561105b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611052906145c3565b60405180910390fd5b61107081600b54612bd290919063ffffffff16565b600b81905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156110de573d6000803e3d6000fd5b5050565b60065481565b600260009054906101000a900460ff1681565b61110433612546565b611143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113a9061438a565b60405180910390fd5b61114b612be8565b565b611155612658565b8060098190555050565b60055481565b60045481565b600081565b61117933612546565b6111b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111af9061438a565b60405180910390fd5b6111cc81601d6125f890919063ffffffff16565b1561120c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611203906143f6565b60405180910390fd5b61122081601d61262890919063ffffffff16565b5050565b61122c612658565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5481565b61127f33612546565b6112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b59061438a565b60405180910390fd5b603c61ffff16811115611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd9061462f565b60405180910390fd5b8060078190555050565b6000602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611361612658565b61136b6000612db7565b565b61137633612546565b6113b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ac9061438a565b60405180910390fd5b6113c98160196125f890919063ffffffff16565b15611409576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611400906143f6565b60405180910390fd5b61141d81601961262890919063ffffffff16565b5050565b61142a33612546565b611469576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114609061438a565b60405180910390fd5b61147d81601b6125f890919063ffffffff16565b6114bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b39061469b565b60405180910390fd5b6114d081601b612e7b90919063ffffffff16565b5050565b60035481565b6114e333612546565b611522576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115199061438a565b60405180910390fd5b6115368160196125f890919063ffffffff16565b611575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156c9061469b565b60405180910390fd5b611589816019612e7b90919063ffffffff16565b5050565b61159633612546565b6115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc9061438a565b60405180910390fd5b600860019054906101000a900460ff1615600860016101000a81548160ff021916908315150217905550565b600080601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050428111611657576000915050611667565b428161166391906146bb565b9150505b919050565b600860019054906101000a900460ff1681565b61168833612546565b6116c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116be9061438a565b60405180910390fd5b6000600b5490506000600b81905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561173e573d6000803e3d6000fd5b5050565b61174a612658565b6001600260006101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600381526020017f4d48420000000000000000000000000000000000000000000000000000000000815250905090565b6117d633612546565b611815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180c9061438a565b60405180910390fd5b61182981601d6125f890919063ffffffff16565b611868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185f9061469b565b60405180910390fd5b61187c81601d612e7b90919063ffffffff16565b5050565b61188933612546565b6118c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bf9061438a565b60405180910390fd5b60008183856118d79190614445565b6118e19190614445565b905060648114611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d90614761565b60405180910390fd5b601461ffff1687111561196e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611965906147cd565b60405180910390fd5b601461ffff168611156119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad90614839565b60405180910390fd5b601461ffff168511156119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f5906148a5565b60405180910390fd5b83600f81905550826010819055508160118190555086600c8190555085600d8190555084600e8190555050505050505050565b600080602260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed90614937565b60405180910390fd5b611b03338585840361237d565b600191505092915050565b60075442611b1c9190614445565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b6000611b6e338484612772565b6001905092915050565b611b8133612546565b611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb79061438a565b60405180910390fd5b8060058190555050565b611bd2612658565b600860029054906101000a900460ff1615600860026101000a81548160ff021916908315150217905550565b611c0733612546565b611c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3d9061438a565b60405180910390fd5b6000611c5b8242612eab90919063ffffffff16565b90506014548111611ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c98906149c9565b60405180910390fd5b806014819055505050565b600860029054906101000a900460ff1681565b6000601454421015611ce05742601454611cd991906146bb565b9050611ce5565b600090505b90565b6000611d01600154602354612bd290919063ffffffff16565b905090565b611d0f33612546565b611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d459061438a565b60405180910390fd5b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b600a5481565b6000602260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611e1033612546565b611e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e469061438a565b60405180910390fd5b601454421015611e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8b90614a35565b60405180910390fd5b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ef691906140c1565b602060405180830381865afa158015611f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f379190614a6a565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401611f96929190614a97565b6020604051808303816000875af1158015611fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd99190614aec565b505050565b60095481565b611fec612658565b611ff581612546565b612034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202b90614b65565b60405180910390fd5b612048816017612e7b90919063ffffffff16565b5050565b600080601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490504281116120a25760009150506120b2565b42816120ae91906146bb565b9150505b919050565b6120c033612546565b6120ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f69061438a565b60405180910390fd5b6121156064600154612ec190919063ffffffff16565b8210612156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214d90614bf7565b60405180910390fd5b6000612171601960ff16600154612ec190919063ffffffff16565b9050600061218f606461ffff16600154612ec190919063ffffffff16565b905060006121ad601961ffff16600154612ec190919063ffffffff16565b9050808610156121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e990614c89565b60405180910390fd5b81851015612235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222c90614c89565b60405180910390fd5b82841015612278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226f90614d1b565b60405180910390fd5b836003819055508460058190555085600481905550505050505050565b601481565b6122a333612546565b6122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d99061438a565b60405180910390fd5b8060048190555050565b6122f4612658565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235a90614dad565b60405180910390fd5b61236c81612db7565b50565b60075481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e390614e3f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361245b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245290614ed1565b60405180910390fd5b80602260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161253991906140eb565b60405180910390a3505050565b6000612550611767565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806125d65750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806125f157506125f08260176125f890919063ffffffff16565b5b9050919050565b6000612620836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612ed7565b905092915050565b6000612650836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612efa565b905092915050565b612660612375565b73ffffffffffffffffffffffffffffffffffffffff1661267e611767565b73ffffffffffffffffffffffffffffffffffffffff16146126d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cb90614f3d565b60405180910390fd5b565b60006126e28484611d80565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461276c578181101561274e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274590614fa9565b60405180910390fd5b61276b84846127668585612bd290919063ffffffff16565b61237d565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d890615015565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284790615081565b60405180910390fd5b60006128668460196125f890919063ffffffff16565b8061288157506128808360196125f890919063ffffffff16565b5b905060003073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806128ea57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b90506000602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614801561299d57508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b80612a2c5750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148015612a2b57508173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b5b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161480612ab757508273ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161480612b4257508373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b90508480612b4d5750825b80612b555750855b15612b6a57612b65898989612f6a565b612bc7565b600260009054906101000a900460ff16612bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb0906150ed565b60405180910390fd5b612bc68989898585613070565b5b505050505050505050565b60008183612be091906146bb565b905092915050565b6001602460006101000a81548160ff0219169083151502179055506000602160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000612c60601154601054612eab90919063ffffffff16565b9050600954821080612c725750600081145b15612c7e575050612d9a565b6000612ca982612c9b60105460095461372c90919063ffffffff16565b612ec190919063ffffffff16565b90506000612cc282600954612bd290919063ffffffff16565b90506000612cda600284612ec190919063ffffffff16565b90506000612cf18285612bd290919063ffffffff16565b90506000612d088483612eab90919063ffffffff16565b90506000479050612d1882613742565b6000612d2d8247612bd290919063ffffffff16565b90506000612d5684612d48878561372c90919063ffffffff16565b612ec190919063ffffffff16565b9050612d628682613985565b612d89612d788284612bd290919063ffffffff16565b600b54612eab90919063ffffffff16565b600b81905550505050505050505050505b6000602460006101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ea3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613a7c565b905092915050565b60008183612eb99190614445565b905092915050565b60008183612ecf919061513c565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000612f068383612ed7565b612f5f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612f64565b600090505b92915050565b6000602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe8906151b9565b60405180910390fd5b612ffb8483613b90565b6130058383613c29565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161306291906140eb565b60405180910390a350505050565b6000602160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000602160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508481101561313b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613132906151b9565b60405180910390fd5b600083156132955761315788601b6125f890919063ffffffff16565b6132465742601560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115806131b55750600860019054906101000a900460ff165b6131f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131eb9061524b565b60405180910390fd5b600754426132029190614445565b601560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60055486111561328b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613282906152b7565b60405180910390fd5b600d549050613546565b841561343d576132af87601d6125f890919063ffffffff16565b61339e5742601660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411158061330d5750600860009054906101000a900460ff165b61334c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334390615323565b60405180910390fd5b6006544261335a9190614445565b601660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60035486846133ad9190614445565b11156133ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e59061538f565b60405180910390fd5b600454861115613433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342a906153fb565b60405180910390fd5b600c549050613545565b600354868461344c9190614445565b111561348d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134849061538f565b60405180910390fd5b6134a188601b6125f890919063ffffffff16565b61353f5742601560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115806134ff5750600860019054906101000a900460ff165b61353e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135359061548d565b60405180910390fd5b5b600e5490505b5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141580156135b15750600860029054906101000a900460ff16155b80156135ca5750602460009054906101000a900460ff16155b80156135d35750835b156135e1576135e0612be8565b5b60006135f08783600f54613cc2565b9050600061360e88846010546011546136099190614445565b613cc2565b90506000818361361e9190614445565b8961362991906146bb565b90506136358b8a613b90565b81602160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136849190614445565b925050819055506136953084613d06565b6136aa83600154612bd290919063ffffffff16565b6001819055506136ba8a82613c29565b8973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161371791906140eb565b60405180910390a35050505050505050505050565b6000818361373a91906154ad565b905092915050565b61376f30602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361237d565b6000600267ffffffffffffffff81111561378c5761378b6154ef565b5b6040519080825280602002602001820160405280156137ba5781602001602082028036833780820191505090505b50905030816000815181106137d2576137d161551e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389d9190615562565b816001815181106138b1576138b061551e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161394f959493929190615692565b600060405180830381600087803b15801561396957600080fd5b505af115801561397d573d6000803e3d6000fd5b505050505050565b80600a60008282546139979190614445565b925050819055506139cb30602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461237d565b602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008030426040518863ffffffff1660e01b8152600401613a32969594939291906156ec565b60606040518083038185885af1158015613a50573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613a75919061574d565b5050505050565b60008083600101600084815260200190815260200160002054905060008114613b84576000600182613aae91906146bb565b9050600060018660000180549050613ac691906146bb565b9050818114613b35576000866000018281548110613ae757613ae661551e565b5b9060005260206000200154905080876000018481548110613b0b57613b0a61551e565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613b4957613b486157a0565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613b8a565b60009150505b92915050565b613be281602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bd290919063ffffffff16565b602160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b613c7b81602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612eab90919063ffffffff16565b602160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000613cfd612710613cef84613ce1878961372c90919063ffffffff16565b61372c90919063ffffffff16565b612ec190919063ffffffff16565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d6c90615841565b60405180910390fd5b6000602160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613df3906158d3565b60405180910390fd5b613e1182600154612bd290919063ffffffff16565b600181905550613e218383613b90565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613e7f91906140eb565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ec6578082015181840152602081019050613eab565b60008484015250505050565b6000601f19601f8301169050919050565b6000613eee82613e8c565b613ef88185613e97565b9350613f08818560208601613ea8565b613f1181613ed2565b840191505092915050565b60006020820190508181036000830152613f368184613ee3565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613f6e82613f43565b9050919050565b613f7e81613f63565b8114613f8957600080fd5b50565b600081359050613f9b81613f75565b92915050565b6000819050919050565b613fb481613fa1565b8114613fbf57600080fd5b50565b600081359050613fd181613fab565b92915050565b60008060408385031215613fee57613fed613f3e565b5b6000613ffc85828601613f8c565b925050602061400d85828601613fc2565b9150509250929050565b60008115159050919050565b61402c81614017565b82525050565b60006020820190506140476000830184614023565b92915050565b60006020828403121561406357614062613f3e565b5b600061407184828501613f8c565b91505092915050565b600061ffff82169050919050565b6140918161407a565b82525050565b60006020820190506140ac6000830184614088565b92915050565b6140bb81613f63565b82525050565b60006020820190506140d660008301846140b2565b92915050565b6140e581613fa1565b82525050565b600060208201905061410060008301846140dc565b92915050565b60006020828403121561411c5761411b613f3e565b5b600061412a84828501613fc2565b91505092915050565b60008060006060848603121561414c5761414b613f3e565b5b600061415a86828701613f8c565b935050602061416b86828701613f8c565b925050604061417c86828701613fc2565b9150509250925092565b600060c08201905061419b60008301896140dc565b6141a860208301886140dc565b6141b560408301876140dc565b6141c260608301866140dc565b6141cf60808301856140dc565b6141dc60a08301846140dc565b979650505050505050565b600060ff82169050919050565b6141fd816141e7565b82525050565b600060208201905061421860008301846141f4565b92915050565b60008060008060008060c0878903121561423b5761423a613f3e565b5b600061424989828a01613fc2565b965050602061425a89828a01613fc2565b955050604061426b89828a01613fc2565b945050606061427c89828a01613fc2565b935050608061428d89828a01613fc2565b92505060a061429e89828a01613fc2565b9150509295509295509295565b600080604083850312156142c2576142c1613f3e565b5b60006142d085828601613f8c565b92505060206142e185828601613f8c565b9150509250929050565b60008060006060848603121561430457614303613f3e565b5b600061431286828701613fc2565b935050602061432386828701613fc2565b925050604061433486828701613fc2565b9150509250925092565b7f43616c6c6572206973206e6f742061207465616d206d656d6265720000000000600082015250565b6000614374601b83613e97565b915061437f8261433e565b602082019050919050565b600060208201905081810360008301526143a381614367565b9050919050565b7f4164647265737320697320616c7265616479206578636c756465640000000000600082015250565b60006143e0601b83613e97565b91506143eb826143aa565b602082019050919050565b6000602082019050818103600083015261440f816143d3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061445082613fa1565b915061445b83613fa1565b925082820190508082111561447357614472614416565b5b92915050565b7f427579206c6f636b2074696d652065786365656473206d6178696d756d000000600082015250565b60006144af601d83613e97565b91506144ba82614479565b602082019050919050565b600060208201905081810360008301526144de816144a2565b9050919050565b7f4164647265737320697320616c726561647920696e207465616d000000000000600082015250565b600061451b601a83613e97565b9150614526826144e5565b602082019050919050565b6000602082019050818103600083015261454a8161450e565b9050919050565b7f416d6f756e7420746f207769746864726177206578636565647320657869737460008201527f696e672062616c616e6365000000000000000000000000000000000000000000602082015250565b60006145ad602b83613e97565b91506145b882614551565b604082019050919050565b600060208201905081810360008301526145dc816145a0565b9050919050565b7f53656c6c206c6f636b2074696d652065786365656473206d6178696d756d0000600082015250565b6000614619601e83613e97565b9150614624826145e3565b602082019050919050565b600060208201905081810360008301526146488161460c565b9050919050565b7f4164647265737320697320616c726561647920696e636c756465640000000000600082015250565b6000614685601b83613e97565b91506146908261464f565b602082019050919050565b600060208201905081810360008301526146b481614678565b9050919050565b60006146c682613fa1565b91506146d183613fa1565b92508282039050818111156146e9576146e8614416565b5b92915050565b7f4275726e2d2c206c69717569646974792d20616e642066756e64696e6720736860008201527f617265206f66207461786573206e65656420746f2073756d20746f2031303000602082015250565b600061474b603f83613e97565b9150614756826146ef565b604082019050919050565b6000602082019050818103600083015261477a8161473e565b9050919050565b7f4275792074617820746f6f206869676800000000000000000000000000000000600082015250565b60006147b7601083613e97565b91506147c282614781565b602082019050919050565b600060208201905081810360008301526147e6816147aa565b9050919050565b7f53656c6c2074617820746f6f2068696768000000000000000000000000000000600082015250565b6000614823601183613e97565b915061482e826147ed565b602082019050919050565b6000602082019050818103600083015261485281614816565b9050919050565b7f5472616e736665722074617820746f6f20686967680000000000000000000000600082015250565b600061488f601583613e97565b915061489a82614859565b602082019050919050565b600060208201905081810360008301526148be81614882565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614921602583613e97565b915061492c826148c5565b604082019050919050565b6000602082019050818103600083015261495081614914565b9050919050565b7f4e657720756e6c6f636b2074696d65206d757374206265206c6174657220746860008201527f616e207468652070726576696f7573206f6e6500000000000000000000000000602082015250565b60006149b3603383613e97565b91506149be82614957565b604082019050919050565b600060208201905081810360008301526149e2816149a6565b9050919050565b7f4c6971756964697479206973206e6f742079657420756e6c6f636b6564000000600082015250565b6000614a1f601d83613e97565b9150614a2a826149e9565b602082019050919050565b60006020820190508181036000830152614a4e81614a12565b9050919050565b600081519050614a6481613fab565b92915050565b600060208284031215614a8057614a7f613f3e565b5b6000614a8e84828501614a55565b91505092915050565b6000604082019050614aac60008301856140b2565b614ab960208301846140dc565b9392505050565b614ac981614017565b8114614ad457600080fd5b50565b600081519050614ae681614ac0565b92915050565b600060208284031215614b0257614b01613f3e565b5b6000614b1084828501614ad7565b91505092915050565b7f41646472657373206973206e6f7420696e207465616d00000000000000000000600082015250565b6000614b4f601683613e97565b9150614b5a82614b19565b602082019050919050565b60006020820190508181036000830152614b7e81614b42565b9050919050565b7f53656c6c206c696d6974206e6565647320746f2062652062656c6f772031252060008201527f6f662063697263756c6174696e6720737570706c790000000000000000000000602082015250565b6000614be1603583613e97565b9150614bec82614b85565b604082019050919050565b60006020820190508181036000830152614c1081614bd4565b9050919050565b7f4e65772073656c6c206c696d6974206e6565647320746f206265206174206c6560008201527f6173742074617267657400000000000000000000000000000000000000000000602082015250565b6000614c73602a83613e97565b9150614c7e82614c17565b604082019050919050565b60006020820190508181036000830152614ca281614c66565b9050919050565b7f4e65772062616c616e6365206c696d6974206e6565647320746f20626520617460008201527f206c656173742074617267657400000000000000000000000000000000000000602082015250565b6000614d05602d83613e97565b9150614d1082614ca9565b604082019050919050565b60006020820190508181036000830152614d3481614cf8565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614d97602683613e97565b9150614da282614d3b565b604082019050919050565b60006020820190508181036000830152614dc681614d8a565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614e29602483613e97565b9150614e3482614dcd565b604082019050919050565b60006020820190508181036000830152614e5881614e1c565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ebb602283613e97565b9150614ec682614e5f565b604082019050919050565b60006020820190508181036000830152614eea81614eae565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614f27602083613e97565b9150614f3282614ef1565b602082019050919050565b60006020820190508181036000830152614f5681614f1a565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614f93601d83613e97565b9150614f9e82614f5d565b602082019050919050565b60006020820190508181036000830152614fc281614f86565b9050919050565b7f5472616e736665722066726f6d207a65726f0000000000000000000000000000600082015250565b6000614fff601283613e97565b915061500a82614fc9565b602082019050919050565b6000602082019050818103600083015261502e81614ff2565b9050919050565b7f5472616e7366657220746f207a65726f00000000000000000000000000000000600082015250565b600061506b601083613e97565b915061507682615035565b602082019050919050565b6000602082019050818103600083015261509a8161505e565b9050919050565b7f45524332303a2054726164696e67206e6f742079657420656e61626c65640000600082015250565b60006150d7601e83613e97565b91506150e2826150a1565b602082019050919050565b60006020820190508181036000830152615106816150ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061514782613fa1565b915061515283613fa1565b9250826151625761516161510d565b5b828204905092915050565b7f45524332303a205472616e7366657220657863656564732062616c616e636500600082015250565b60006151a3601f83613e97565b91506151ae8261516d565b602082019050919050565b600060208201905081810360008301526151d281615196565b9050919050565b7f45524332303a2043616c6c657220696e2073656c6c206c6f636b20706572696f60008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000615235602183613e97565b9150615240826151d9565b604082019050919050565b6000602082019050818103600083015261526481615228565b9050919050565b7f45524332303a2053656c6c206c696d6974206578636565646564000000000000600082015250565b60006152a1601a83613e97565b91506152ac8261526b565b602082019050919050565b600060208201905081810360008301526152d081615294565b9050919050565b7f45524332303a2043616c6c657220696e20627579206c6f636b20706572696f64600082015250565b600061530d602083613e97565b9150615318826152d7565b602082019050919050565b6000602082019050818103600083015261533c81615300565b9050919050565b7f45524332303a2042616c616e6365206c696d6974206578636565646564000000600082015250565b6000615379601d83613e97565b915061538482615343565b602082019050919050565b600060208201905081810360008301526153a88161536c565b9050919050565b7f45524332303a20427579206c696d697420657863656564656400000000000000600082015250565b60006153e5601983613e97565b91506153f0826153af565b602082019050919050565b60006020820190508181036000830152615414816153d8565b9050919050565b7f45524332303a2053656e64657220696e2073656c6c206c6f636b20706572696f60008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000615477602183613e97565b91506154828261541b565b604082019050919050565b600060208201905081810360008301526154a68161546a565b9050919050565b60006154b882613fa1565b91506154c383613fa1565b92508282026154d181613fa1565b915082820484148315176154e8576154e7614416565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061555c81613f75565b92915050565b60006020828403121561557857615577613f3e565b5b60006155868482850161554d565b91505092915050565b6000819050919050565b6000819050919050565b60006155be6155b96155b48461558f565b615599565b613fa1565b9050919050565b6155ce816155a3565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61560981613f63565b82525050565b600061561b8383615600565b60208301905092915050565b6000602082019050919050565b600061563f826155d4565b61564981856155df565b9350615654836155f0565b8060005b8381101561568557815161566c888261560f565b975061567783615627565b925050600181019050615658565b5085935050505092915050565b600060a0820190506156a760008301886140dc565b6156b460208301876155c5565b81810360408301526156c68186615634565b90506156d560608301856140b2565b6156e260808301846140dc565b9695505050505050565b600060c08201905061570160008301896140b2565b61570e60208301886140dc565b61571b60408301876155c5565b61572860608301866155c5565b61573560808301856140b2565b61574260a08301846140dc565b979650505050505050565b60008060006060848603121561576657615765613f3e565b5b600061577486828701614a55565b935050602061578586828701614a55565b925050604061579686828701614a55565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061582b602183613e97565b9150615836826157cf565b604082019050919050565b6000602082019050818103600083015261585a8161581e565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006158bd602283613e97565b91506158c882615861565b604082019050919050565b600060208201905081810360008301526158ec816158b0565b905091905056fea2646970667358221220c1cff74b67169062bcd0ee1cf8d5810e9b47f58bbce553c8471dc02e141494ab64736f6c63430008140033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103fc5760003560e01c806373f3109d11610215578063afbf720111610125578063df5316a9116100b8578063eb33dc7e11610087578063eb33dc7e14610b20578063eb8e886314610b3c578063ee84abeb14610b5a578063f2fde38b14610b76578063f88b0e4614610b92576103fc565b8063df5316a914610aac578063df7f568614610ab6578063dfdedf6914610ad4578063e803050c14610af0576103fc565b8063c3f4f54f116100f4578063c3f4f54f14610a36578063d0b4f46214610a54578063dc61266814610a5e578063dd62ed3e14610a7c576103fc565b8063afbf7201146109d4578063b0fd04c8146109de578063c0fc5fc1146109fa578063c3a3c03214610a18576103fc565b80638a8c523c116101a85780639c063599116101775780639c06359914610932578063a457c2d71461094e578063a8e6a0a81461097e578063a9059cbb14610988578063aaefee92146109b8576103fc565b80638a8c523c146108d05780638da5cb5b146108da57806395d89b41146108f85780639a5e580e14610916576103fc565b80638724a289116101e45780638724a2891461086e5780638728ecd114610878578063887c60fb146108a857806388b4811b146108c6576103fc565b806373f3109d146107fc5780637523f7f714610818578063762bb282146108345780638219599714610852576103fc565b80633478154b116103105780634f91e48c116102a357806363986aba1161027257806363986aba1461076c57806365abd912146107885780636c20a4a9146107a657806370a08231146107c2578063715018a6146107f2576103fc565b80634f91e48c146106f6578063589210d9146107145780635c69f690146107325780636195a3b514610750576103fc565b806344f3c83a116102df57806344f3c83a146106945780634ada218b146106b25780634e254e27146106d05780634e6baf74146106da576103fc565b80633478154b1461060e578063395093511461062c57806343696f181461065c5780634437106a14610678576103fc565b806318160ddd1161039357806323b872dd1161036257806323b872dd146105615780632973ef2d146105915780633054f8a3146105b4578063311a8697146105d2578063313ce567146105f0576103fc565b806318160ddd146104ff578063196d7bd31461051d5780631f8b845e14610527578063205063b414610545576103fc565b806312384c88116103cf57806312384c88146104895780631285073c146104a757806314ddc095146104c55780631525ff7d146104e3576103fc565b806306fdde0314610401578063095ea7b31461041f5780630d78baea1461044f5780630fd99e161461046b575b600080fd5b610409610bb0565b6040516104169190613f1c565b60405180910390f35b61043960048036038101906104349190613fd7565b610bed565b6040516104469190614032565b60405180910390f35b6104696004803603810190610464919061404d565b610c10565b005b610473610cc4565b6040516104809190614097565b60405180910390f35b610491610cc9565b60405161049e91906140c1565b60405180910390f35b6104af610cf3565b6040516104bc91906140eb565b60405180910390f35b6104cd610cfd565b6040516104da91906140eb565b60405180910390f35b6104fd60048036038101906104f8919061404d565b610d07565b005b610507610d53565b60405161051491906140eb565b60405180910390f35b610525610d5d565b005b61052f610db0565b60405161053c9190614097565b60405180910390f35b61055f600480360381019061055a9190614106565b610db5565b005b61057b60048036038101906105769190614133565b610e4f565b6040516105889190614032565b60405180910390f35b610599610e72565b6040516105ab96959493929190614186565b60405180910390f35b6105bc610ea1565b6040516105c99190614032565b60405180910390f35b6105da610eb4565b6040516105e79190614203565b60405180910390f35b6105f8610eb9565b6040516106059190614203565b60405180910390f35b610616610ec2565b6040516106239190614097565b60405180910390f35b61064660048036038101906106419190613fd7565b610ec7565b6040516106539190614032565b60405180910390f35b6106766004803603810190610671919061404d565b610f65565b005b610692600480360381019061068d9190614106565b610fce565b005b61069c6110e2565b6040516106a991906140eb565b60405180910390f35b6106ba6110e8565b6040516106c79190614032565b60405180910390f35b6106d86110fb565b005b6106f460048036038101906106ef9190614106565b61114d565b005b6106fe61115f565b60405161070b91906140eb565b60405180910390f35b61071c611165565b60405161072991906140eb565b60405180910390f35b61073a61116b565b6040516107479190614097565b60405180910390f35b61076a6004803603810190610765919061404d565b611170565b005b6107866004803603810190610781919061404d565b611224565b005b610790611270565b60405161079d91906140eb565b60405180910390f35b6107c060048036038101906107bb9190614106565b611276565b005b6107dc60048036038101906107d7919061404d565b611310565b6040516107e991906140eb565b60405180910390f35b6107fa611359565b005b6108166004803603810190610811919061404d565b61136d565b005b610832600480360381019061082d919061404d565b611421565b005b61083c6114d4565b60405161084991906140eb565b60405180910390f35b61086c6004803603810190610867919061404d565b6114da565b005b61087661158d565b005b610892600480360381019061088d919061404d565b611601565b60405161089f91906140eb565b60405180910390f35b6108b061166c565b6040516108bd9190614032565b60405180910390f35b6108ce61167f565b005b6108d8611742565b005b6108e2611767565b6040516108ef91906140c1565b60405180910390f35b610900611790565b60405161090d9190613f1c565b60405180910390f35b610930600480360381019061092b919061404d565b6117cd565b005b61094c6004803603810190610947919061421e565b611880565b005b61096860048036038101906109639190613fd7565b611a31565b6040516109759190614032565b60405180910390f35b610986611b0e565b005b6109a2600480360381019061099d9190613fd7565b611b61565b6040516109af9190614032565b60405180910390f35b6109d260048036038101906109cd9190614106565b611b78565b005b6109dc611bca565b005b6109f860048036038101906109f39190614106565b611bfe565b005b610a02611cac565b604051610a0f9190614032565b60405180910390f35b610a20611cbf565b604051610a2d91906140eb565b60405180910390f35b610a3e611ce8565b604051610a4b91906140eb565b60405180910390f35b610a5c611d06565b005b610a66611d7a565b604051610a7391906140eb565b60405180910390f35b610a966004803603810190610a9191906142ab565b611d80565b604051610aa391906140eb565b60405180910390f35b610ab4611e07565b005b610abe611fde565b604051610acb91906140eb565b60405180910390f35b610aee6004803603810190610ae9919061404d565b611fe4565b005b610b0a6004803603810190610b05919061404d565b61204c565b604051610b1791906140eb565b60405180910390f35b610b3a6004803603810190610b3591906142eb565b6120b7565b005b610b44612295565b604051610b519190614097565b60405180910390f35b610b746004803603810190610b6f9190614106565b61229a565b005b610b906004803603810190610b8b919061404d565b6122ec565b005b610b9a61236f565b604051610ba791906140eb565b60405180910390f35b60606040518060400160405280600c81526020017f4d696e6920486172616d62650000000000000000000000000000000000000000815250905090565b600080610bf8612375565b9050610c0581858561237d565b600191505092915050565b610c1933612546565b610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f9061438a565b60405180910390fd5b610c6c81601b6125f890919063ffffffff16565b15610cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca3906143f6565b60405180910390fd5b610cc081601b61262890919063ffffffff16565b5050565b606481565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600754905090565b6000600654905090565b610d0f612658565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600154905090565b60065442610d6b9190614445565b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b601981565b610dbe33612546565b610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df49061438a565b60405180910390fd5b600061ffff16811115610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c906144c5565b60405180910390fd5b8060068190555050565b6000610e5c8433846126d6565b610e67848484612772565b600190509392505050565b600080600080600080600c549550600d549450600e549350600f54925060105491506011549050909192939495565b600860009054906101000a900460ff1681565b601981565b60006012905090565b603c81565b6000610f5b338484602260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f569190614445565b61237d565b6001905092915050565b610f6d612658565b610f7681612546565b15610fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fad90614531565b60405180910390fd5b610fca81601761262890919063ffffffff16565b5050565b610fd733612546565b611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d9061438a565b60405180910390fd5b600b5481111561105b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611052906145c3565b60405180910390fd5b61107081600b54612bd290919063ffffffff16565b600b81905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156110de573d6000803e3d6000fd5b5050565b60065481565b600260009054906101000a900460ff1681565b61110433612546565b611143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113a9061438a565b60405180910390fd5b61114b612be8565b565b611155612658565b8060098190555050565b60055481565b60045481565b600081565b61117933612546565b6111b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111af9061438a565b60405180910390fd5b6111cc81601d6125f890919063ffffffff16565b1561120c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611203906143f6565b60405180910390fd5b61122081601d61262890919063ffffffff16565b5050565b61122c612658565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5481565b61127f33612546565b6112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b59061438a565b60405180910390fd5b603c61ffff16811115611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd9061462f565b60405180910390fd5b8060078190555050565b6000602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611361612658565b61136b6000612db7565b565b61137633612546565b6113b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ac9061438a565b60405180910390fd5b6113c98160196125f890919063ffffffff16565b15611409576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611400906143f6565b60405180910390fd5b61141d81601961262890919063ffffffff16565b5050565b61142a33612546565b611469576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114609061438a565b60405180910390fd5b61147d81601b6125f890919063ffffffff16565b6114bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b39061469b565b60405180910390fd5b6114d081601b612e7b90919063ffffffff16565b5050565b60035481565b6114e333612546565b611522576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115199061438a565b60405180910390fd5b6115368160196125f890919063ffffffff16565b611575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156c9061469b565b60405180910390fd5b611589816019612e7b90919063ffffffff16565b5050565b61159633612546565b6115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc9061438a565b60405180910390fd5b600860019054906101000a900460ff1615600860016101000a81548160ff021916908315150217905550565b600080601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050428111611657576000915050611667565b428161166391906146bb565b9150505b919050565b600860019054906101000a900460ff1681565b61168833612546565b6116c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116be9061438a565b60405180910390fd5b6000600b5490506000600b81905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561173e573d6000803e3d6000fd5b5050565b61174a612658565b6001600260006101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600381526020017f4d48420000000000000000000000000000000000000000000000000000000000815250905090565b6117d633612546565b611815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180c9061438a565b60405180910390fd5b61182981601d6125f890919063ffffffff16565b611868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185f9061469b565b60405180910390fd5b61187c81601d612e7b90919063ffffffff16565b5050565b61188933612546565b6118c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bf9061438a565b60405180910390fd5b60008183856118d79190614445565b6118e19190614445565b905060648114611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d90614761565b60405180910390fd5b601461ffff1687111561196e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611965906147cd565b60405180910390fd5b601461ffff168611156119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad90614839565b60405180910390fd5b601461ffff168511156119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f5906148a5565b60405180910390fd5b83600f81905550826010819055508160118190555086600c8190555085600d8190555084600e8190555050505050505050565b600080602260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed90614937565b60405180910390fd5b611b03338585840361237d565b600191505092915050565b60075442611b1c9190614445565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b6000611b6e338484612772565b6001905092915050565b611b8133612546565b611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb79061438a565b60405180910390fd5b8060058190555050565b611bd2612658565b600860029054906101000a900460ff1615600860026101000a81548160ff021916908315150217905550565b611c0733612546565b611c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3d9061438a565b60405180910390fd5b6000611c5b8242612eab90919063ffffffff16565b90506014548111611ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c98906149c9565b60405180910390fd5b806014819055505050565b600860029054906101000a900460ff1681565b6000601454421015611ce05742601454611cd991906146bb565b9050611ce5565b600090505b90565b6000611d01600154602354612bd290919063ffffffff16565b905090565b611d0f33612546565b611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d459061438a565b60405180910390fd5b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b600a5481565b6000602260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611e1033612546565b611e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e469061438a565b60405180910390fd5b601454421015611e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8b90614a35565b60405180910390fd5b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ef691906140c1565b602060405180830381865afa158015611f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f379190614a6a565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401611f96929190614a97565b6020604051808303816000875af1158015611fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd99190614aec565b505050565b60095481565b611fec612658565b611ff581612546565b612034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202b90614b65565b60405180910390fd5b612048816017612e7b90919063ffffffff16565b5050565b600080601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490504281116120a25760009150506120b2565b42816120ae91906146bb565b9150505b919050565b6120c033612546565b6120ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f69061438a565b60405180910390fd5b6121156064600154612ec190919063ffffffff16565b8210612156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214d90614bf7565b60405180910390fd5b6000612171601960ff16600154612ec190919063ffffffff16565b9050600061218f606461ffff16600154612ec190919063ffffffff16565b905060006121ad601961ffff16600154612ec190919063ffffffff16565b9050808610156121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e990614c89565b60405180910390fd5b81851015612235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222c90614c89565b60405180910390fd5b82841015612278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226f90614d1b565b60405180910390fd5b836003819055508460058190555085600481905550505050505050565b601481565b6122a333612546565b6122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d99061438a565b60405180910390fd5b8060048190555050565b6122f4612658565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235a90614dad565b60405180910390fd5b61236c81612db7565b50565b60075481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e390614e3f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361245b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245290614ed1565b60405180910390fd5b80602260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161253991906140eb565b60405180910390a3505050565b6000612550611767565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806125d65750601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806125f157506125f08260176125f890919063ffffffff16565b5b9050919050565b6000612620836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612ed7565b905092915050565b6000612650836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612efa565b905092915050565b612660612375565b73ffffffffffffffffffffffffffffffffffffffff1661267e611767565b73ffffffffffffffffffffffffffffffffffffffff16146126d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cb90614f3d565b60405180910390fd5b565b60006126e28484611d80565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461276c578181101561274e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274590614fa9565b60405180910390fd5b61276b84846127668585612bd290919063ffffffff16565b61237d565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d890615015565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284790615081565b60405180910390fd5b60006128668460196125f890919063ffffffff16565b8061288157506128808360196125f890919063ffffffff16565b5b905060003073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806128ea57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b90506000602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614801561299d57508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b80612a2c5750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148015612a2b57508173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b5b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161480612ab757508273ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b90506000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161480612b4257508373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b90508480612b4d5750825b80612b555750855b15612b6a57612b65898989612f6a565b612bc7565b600260009054906101000a900460ff16612bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb0906150ed565b60405180910390fd5b612bc68989898585613070565b5b505050505050505050565b60008183612be091906146bb565b905092915050565b6001602460006101000a81548160ff0219169083151502179055506000602160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000612c60601154601054612eab90919063ffffffff16565b9050600954821080612c725750600081145b15612c7e575050612d9a565b6000612ca982612c9b60105460095461372c90919063ffffffff16565b612ec190919063ffffffff16565b90506000612cc282600954612bd290919063ffffffff16565b90506000612cda600284612ec190919063ffffffff16565b90506000612cf18285612bd290919063ffffffff16565b90506000612d088483612eab90919063ffffffff16565b90506000479050612d1882613742565b6000612d2d8247612bd290919063ffffffff16565b90506000612d5684612d48878561372c90919063ffffffff16565b612ec190919063ffffffff16565b9050612d628682613985565b612d89612d788284612bd290919063ffffffff16565b600b54612eab90919063ffffffff16565b600b81905550505050505050505050505b6000602460006101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ea3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613a7c565b905092915050565b60008183612eb99190614445565b905092915050565b60008183612ecf919061513c565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000612f068383612ed7565b612f5f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612f64565b600090505b92915050565b6000602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe8906151b9565b60405180910390fd5b612ffb8483613b90565b6130058383613c29565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161306291906140eb565b60405180910390a350505050565b6000602160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000602160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508481101561313b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613132906151b9565b60405180910390fd5b600083156132955761315788601b6125f890919063ffffffff16565b6132465742601560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115806131b55750600860019054906101000a900460ff165b6131f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131eb9061524b565b60405180910390fd5b600754426132029190614445565b601560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60055486111561328b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613282906152b7565b60405180910390fd5b600d549050613546565b841561343d576132af87601d6125f890919063ffffffff16565b61339e5742601660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411158061330d5750600860009054906101000a900460ff165b61334c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334390615323565b60405180910390fd5b6006544261335a9190614445565b601660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60035486846133ad9190614445565b11156133ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e59061538f565b60405180910390fd5b600454861115613433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342a906153fb565b60405180910390fd5b600c549050613545565b600354868461344c9190614445565b111561348d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134849061538f565b60405180910390fd5b6134a188601b6125f890919063ffffffff16565b61353f5742601560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115806134ff5750600860019054906101000a900460ff165b61353e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135359061548d565b60405180910390fd5b5b600e5490505b5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141580156135b15750600860029054906101000a900460ff16155b80156135ca5750602460009054906101000a900460ff16155b80156135d35750835b156135e1576135e0612be8565b5b60006135f08783600f54613cc2565b9050600061360e88846010546011546136099190614445565b613cc2565b90506000818361361e9190614445565b8961362991906146bb565b90506136358b8a613b90565b81602160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136849190614445565b925050819055506136953084613d06565b6136aa83600154612bd290919063ffffffff16565b6001819055506136ba8a82613c29565b8973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161371791906140eb565b60405180910390a35050505050505050505050565b6000818361373a91906154ad565b905092915050565b61376f30602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361237d565b6000600267ffffffffffffffff81111561378c5761378b6154ef565b5b6040519080825280602002602001820160405280156137ba5781602001602082028036833780820191505090505b50905030816000815181106137d2576137d161551e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389d9190615562565b816001815181106138b1576138b061551e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161394f959493929190615692565b600060405180830381600087803b15801561396957600080fd5b505af115801561397d573d6000803e3d6000fd5b505050505050565b80600a60008282546139979190614445565b925050819055506139cb30602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461237d565b602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008030426040518863ffffffff1660e01b8152600401613a32969594939291906156ec565b60606040518083038185885af1158015613a50573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613a75919061574d565b5050505050565b60008083600101600084815260200190815260200160002054905060008114613b84576000600182613aae91906146bb565b9050600060018660000180549050613ac691906146bb565b9050818114613b35576000866000018281548110613ae757613ae661551e565b5b9060005260206000200154905080876000018481548110613b0b57613b0a61551e565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613b4957613b486157a0565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613b8a565b60009150505b92915050565b613be281602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bd290919063ffffffff16565b602160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b613c7b81602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612eab90919063ffffffff16565b602160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000613cfd612710613cef84613ce1878961372c90919063ffffffff16565b61372c90919063ffffffff16565b612ec190919063ffffffff16565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d6c90615841565b60405180910390fd5b6000602160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613df3906158d3565b60405180910390fd5b613e1182600154612bd290919063ffffffff16565b600181905550613e218383613b90565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613e7f91906140eb565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ec6578082015181840152602081019050613eab565b60008484015250505050565b6000601f19601f8301169050919050565b6000613eee82613e8c565b613ef88185613e97565b9350613f08818560208601613ea8565b613f1181613ed2565b840191505092915050565b60006020820190508181036000830152613f368184613ee3565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613f6e82613f43565b9050919050565b613f7e81613f63565b8114613f8957600080fd5b50565b600081359050613f9b81613f75565b92915050565b6000819050919050565b613fb481613fa1565b8114613fbf57600080fd5b50565b600081359050613fd181613fab565b92915050565b60008060408385031215613fee57613fed613f3e565b5b6000613ffc85828601613f8c565b925050602061400d85828601613fc2565b9150509250929050565b60008115159050919050565b61402c81614017565b82525050565b60006020820190506140476000830184614023565b92915050565b60006020828403121561406357614062613f3e565b5b600061407184828501613f8c565b91505092915050565b600061ffff82169050919050565b6140918161407a565b82525050565b60006020820190506140ac6000830184614088565b92915050565b6140bb81613f63565b82525050565b60006020820190506140d660008301846140b2565b92915050565b6140e581613fa1565b82525050565b600060208201905061410060008301846140dc565b92915050565b60006020828403121561411c5761411b613f3e565b5b600061412a84828501613fc2565b91505092915050565b60008060006060848603121561414c5761414b613f3e565b5b600061415a86828701613f8c565b935050602061416b86828701613f8c565b925050604061417c86828701613fc2565b9150509250925092565b600060c08201905061419b60008301896140dc565b6141a860208301886140dc565b6141b560408301876140dc565b6141c260608301866140dc565b6141cf60808301856140dc565b6141dc60a08301846140dc565b979650505050505050565b600060ff82169050919050565b6141fd816141e7565b82525050565b600060208201905061421860008301846141f4565b92915050565b60008060008060008060c0878903121561423b5761423a613f3e565b5b600061424989828a01613fc2565b965050602061425a89828a01613fc2565b955050604061426b89828a01613fc2565b945050606061427c89828a01613fc2565b935050608061428d89828a01613fc2565b92505060a061429e89828a01613fc2565b9150509295509295509295565b600080604083850312156142c2576142c1613f3e565b5b60006142d085828601613f8c565b92505060206142e185828601613f8c565b9150509250929050565b60008060006060848603121561430457614303613f3e565b5b600061431286828701613fc2565b935050602061432386828701613fc2565b925050604061433486828701613fc2565b9150509250925092565b7f43616c6c6572206973206e6f742061207465616d206d656d6265720000000000600082015250565b6000614374601b83613e97565b915061437f8261433e565b602082019050919050565b600060208201905081810360008301526143a381614367565b9050919050565b7f4164647265737320697320616c7265616479206578636c756465640000000000600082015250565b60006143e0601b83613e97565b91506143eb826143aa565b602082019050919050565b6000602082019050818103600083015261440f816143d3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061445082613fa1565b915061445b83613fa1565b925082820190508082111561447357614472614416565b5b92915050565b7f427579206c6f636b2074696d652065786365656473206d6178696d756d000000600082015250565b60006144af601d83613e97565b91506144ba82614479565b602082019050919050565b600060208201905081810360008301526144de816144a2565b9050919050565b7f4164647265737320697320616c726561647920696e207465616d000000000000600082015250565b600061451b601a83613e97565b9150614526826144e5565b602082019050919050565b6000602082019050818103600083015261454a8161450e565b9050919050565b7f416d6f756e7420746f207769746864726177206578636565647320657869737460008201527f696e672062616c616e6365000000000000000000000000000000000000000000602082015250565b60006145ad602b83613e97565b91506145b882614551565b604082019050919050565b600060208201905081810360008301526145dc816145a0565b9050919050565b7f53656c6c206c6f636b2074696d652065786365656473206d6178696d756d0000600082015250565b6000614619601e83613e97565b9150614624826145e3565b602082019050919050565b600060208201905081810360008301526146488161460c565b9050919050565b7f4164647265737320697320616c726561647920696e636c756465640000000000600082015250565b6000614685601b83613e97565b91506146908261464f565b602082019050919050565b600060208201905081810360008301526146b481614678565b9050919050565b60006146c682613fa1565b91506146d183613fa1565b92508282039050818111156146e9576146e8614416565b5b92915050565b7f4275726e2d2c206c69717569646974792d20616e642066756e64696e6720736860008201527f617265206f66207461786573206e65656420746f2073756d20746f2031303000602082015250565b600061474b603f83613e97565b9150614756826146ef565b604082019050919050565b6000602082019050818103600083015261477a8161473e565b9050919050565b7f4275792074617820746f6f206869676800000000000000000000000000000000600082015250565b60006147b7601083613e97565b91506147c282614781565b602082019050919050565b600060208201905081810360008301526147e6816147aa565b9050919050565b7f53656c6c2074617820746f6f2068696768000000000000000000000000000000600082015250565b6000614823601183613e97565b915061482e826147ed565b602082019050919050565b6000602082019050818103600083015261485281614816565b9050919050565b7f5472616e736665722074617820746f6f20686967680000000000000000000000600082015250565b600061488f601583613e97565b915061489a82614859565b602082019050919050565b600060208201905081810360008301526148be81614882565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614921602583613e97565b915061492c826148c5565b604082019050919050565b6000602082019050818103600083015261495081614914565b9050919050565b7f4e657720756e6c6f636b2074696d65206d757374206265206c6174657220746860008201527f616e207468652070726576696f7573206f6e6500000000000000000000000000602082015250565b60006149b3603383613e97565b91506149be82614957565b604082019050919050565b600060208201905081810360008301526149e2816149a6565b9050919050565b7f4c6971756964697479206973206e6f742079657420756e6c6f636b6564000000600082015250565b6000614a1f601d83613e97565b9150614a2a826149e9565b602082019050919050565b60006020820190508181036000830152614a4e81614a12565b9050919050565b600081519050614a6481613fab565b92915050565b600060208284031215614a8057614a7f613f3e565b5b6000614a8e84828501614a55565b91505092915050565b6000604082019050614aac60008301856140b2565b614ab960208301846140dc565b9392505050565b614ac981614017565b8114614ad457600080fd5b50565b600081519050614ae681614ac0565b92915050565b600060208284031215614b0257614b01613f3e565b5b6000614b1084828501614ad7565b91505092915050565b7f41646472657373206973206e6f7420696e207465616d00000000000000000000600082015250565b6000614b4f601683613e97565b9150614b5a82614b19565b602082019050919050565b60006020820190508181036000830152614b7e81614b42565b9050919050565b7f53656c6c206c696d6974206e6565647320746f2062652062656c6f772031252060008201527f6f662063697263756c6174696e6720737570706c790000000000000000000000602082015250565b6000614be1603583613e97565b9150614bec82614b85565b604082019050919050565b60006020820190508181036000830152614c1081614bd4565b9050919050565b7f4e65772073656c6c206c696d6974206e6565647320746f206265206174206c6560008201527f6173742074617267657400000000000000000000000000000000000000000000602082015250565b6000614c73602a83613e97565b9150614c7e82614c17565b604082019050919050565b60006020820190508181036000830152614ca281614c66565b9050919050565b7f4e65772062616c616e6365206c696d6974206e6565647320746f20626520617460008201527f206c656173742074617267657400000000000000000000000000000000000000602082015250565b6000614d05602d83613e97565b9150614d1082614ca9565b604082019050919050565b60006020820190508181036000830152614d3481614cf8565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614d97602683613e97565b9150614da282614d3b565b604082019050919050565b60006020820190508181036000830152614dc681614d8a565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614e29602483613e97565b9150614e3482614dcd565b604082019050919050565b60006020820190508181036000830152614e5881614e1c565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ebb602283613e97565b9150614ec682614e5f565b604082019050919050565b60006020820190508181036000830152614eea81614eae565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614f27602083613e97565b9150614f3282614ef1565b602082019050919050565b60006020820190508181036000830152614f5681614f1a565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614f93601d83613e97565b9150614f9e82614f5d565b602082019050919050565b60006020820190508181036000830152614fc281614f86565b9050919050565b7f5472616e736665722066726f6d207a65726f0000000000000000000000000000600082015250565b6000614fff601283613e97565b915061500a82614fc9565b602082019050919050565b6000602082019050818103600083015261502e81614ff2565b9050919050565b7f5472616e7366657220746f207a65726f00000000000000000000000000000000600082015250565b600061506b601083613e97565b915061507682615035565b602082019050919050565b6000602082019050818103600083015261509a8161505e565b9050919050565b7f45524332303a2054726164696e67206e6f742079657420656e61626c65640000600082015250565b60006150d7601e83613e97565b91506150e2826150a1565b602082019050919050565b60006020820190508181036000830152615106816150ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061514782613fa1565b915061515283613fa1565b9250826151625761516161510d565b5b828204905092915050565b7f45524332303a205472616e7366657220657863656564732062616c616e636500600082015250565b60006151a3601f83613e97565b91506151ae8261516d565b602082019050919050565b600060208201905081810360008301526151d281615196565b9050919050565b7f45524332303a2043616c6c657220696e2073656c6c206c6f636b20706572696f60008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000615235602183613e97565b9150615240826151d9565b604082019050919050565b6000602082019050818103600083015261526481615228565b9050919050565b7f45524332303a2053656c6c206c696d6974206578636565646564000000000000600082015250565b60006152a1601a83613e97565b91506152ac8261526b565b602082019050919050565b600060208201905081810360008301526152d081615294565b9050919050565b7f45524332303a2043616c6c657220696e20627579206c6f636b20706572696f64600082015250565b600061530d602083613e97565b9150615318826152d7565b602082019050919050565b6000602082019050818103600083015261533c81615300565b9050919050565b7f45524332303a2042616c616e6365206c696d6974206578636565646564000000600082015250565b6000615379601d83613e97565b915061538482615343565b602082019050919050565b600060208201905081810360008301526153a88161536c565b9050919050565b7f45524332303a20427579206c696d697420657863656564656400000000000000600082015250565b60006153e5601983613e97565b91506153f0826153af565b602082019050919050565b60006020820190508181036000830152615414816153d8565b9050919050565b7f45524332303a2053656e64657220696e2073656c6c206c6f636b20706572696f60008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000615477602183613e97565b91506154828261541b565b604082019050919050565b600060208201905081810360008301526154a68161546a565b9050919050565b60006154b882613fa1565b91506154c383613fa1565b92508282026154d181613fa1565b915082820484148315176154e8576154e7614416565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061555c81613f75565b92915050565b60006020828403121561557857615577613f3e565b5b60006155868482850161554d565b91505092915050565b6000819050919050565b6000819050919050565b60006155be6155b96155b48461558f565b615599565b613fa1565b9050919050565b6155ce816155a3565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61560981613f63565b82525050565b600061561b8383615600565b60208301905092915050565b6000602082019050919050565b600061563f826155d4565b61564981856155df565b9350615654836155f0565b8060005b8381101561568557815161566c888261560f565b975061567783615627565b925050600181019050615658565b5085935050505092915050565b600060a0820190506156a760008301886140dc565b6156b460208301876155c5565b81810360408301526156c68186615634565b90506156d560608301856140b2565b6156e260808301846140dc565b9695505050505050565b600060c08201905061570160008301896140b2565b61570e60208301886140dc565b61571b60408301876155c5565b61572860608301866155c5565b61573560808301856140b2565b61574260a08301846140dc565b979650505050505050565b60008060006060848603121561576657615765613f3e565b5b600061577486828701614a55565b935050602061578586828701614a55565b925050604061579686828701614a55565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061582b602183613e97565b9150615836826157cf565b604082019050919050565b6000602082019050818103600083015261585a8161581e565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006158bd602283613e97565b91506158c882615861565b604082019050919050565b600060208201905081810360008301526158ec816158b0565b905091905056fea2646970667358221220c1cff74b67169062bcd0ee1cf8d5810e9b47f58bbce553c8471dc02e141494ab64736f6c63430008140033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.