Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
- Contract name:
- HASHBITDOGE
- Optimization enabled
- false
- Compiler version
- v0.8.17+commit.8df45f5f
- EVM Version
- default
- Verified at
- 2023-01-25T21:00:58.113417Z
Contract source code
// SPDX-License-Identifier: Unlicensed pragma solidity 0.8.17; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); } library SafeMath { 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); } } function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; return msg.data; } } library Address { function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } 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" ); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } 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" ); } function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return _verifyCallResult(success, returndata, errorMessage); } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() { _owner = _msgSender(); emit OwnershipTransferred(address(0), _owner); } function owner() public view virtual returns (address) { return _owner; } modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); 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(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } contract HASHBITDOGE is Context, IERC20, Ownable { using SafeMath for uint256; using Address for address; mapping(address => uint256) private _rOwned; mapping(address => uint256) private _tOwned; mapping(address => mapping(address => uint256)) private _allowances; mapping(address => bool) public _isExcludedFromFee; mapping(address => bool) private _isExcluded; address[] private _excluded; address public _marketingWalletAddress; uint256 private constant MAX = ~uint256(0); uint256 private _tTotal = 1000000000 * 10**18; uint256 private _rTotal = (MAX - (MAX % _tTotal)); uint256 private _tFeeTotal; string private _name = "HashbitDoge"; string private _symbol = "HbDoge"; uint8 private _decimals = 18; uint256 public _taxFee = 20; uint256 private _previousTaxFee = _taxFee; uint256 public _developmentFee = 10; uint256 private _previousDevelopmentFee = _developmentFee; uint256 public _liquidityFee = 30; uint256 private _previousLiquidityFee = _liquidityFee; mapping(address => bool) private _isPairAddress; IUniswapV2Router02 public uniswapV2Router; // address public uniswapV2Pair; bool inSwapAndLiquify; bool public swapAndLiquifyEnabled = true; uint256 public _maxTxAmount = 1000000000 * 10**18; uint256 public numTokensSellToAddToLiquidity = 100000 * 10**18; uint256 public maxTokenAllowance; uint256 private maxTokenPercentage; event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap); event SwapAndLiquifyEnabledUpdated(bool enabled); event MaxAllowance(uint256 percentage, uint256 MaxTokenAllowance); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); modifier lockTheSwap() { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } constructor() { _rOwned[owner()] = _rTotal; _marketingWalletAddress = 0x9f0Ec520F1706A2B7095F4279d0cd37208AE78eB; maxTokenPercentage = 100; // 10% maxTokenAllowance = _tTotal.mul(maxTokenPercentage).div(1000); _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; emit Transfer(address(0), owner(), _tTotal); } function initializer() public onlyOwner returns (bool isInit) { // Change this for testing and depl. IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02( 0x3BAb21D55Bc77995943c61588decCAa9c56CF634 ); uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; _isPairAddress[uniswapV2Pair] = true; isInit = true; } // Here 1% = 10 , 2% = 20, 5% = 50 etc... function modifyMaxTokenPercentage(uint256 _newPercent) public onlyOwner { maxTokenPercentage = _newPercent; maxTokenAllowance = _tTotal.mul(maxTokenPercentage).div(1000); uint256 inPercent = maxTokenPercentage.div(10); emit MaxAllowance(inPercent, maxTokenAllowance); } function setMarketingWalletAddress(address _Address) public onlyOwner { _marketingWalletAddress = payable(_Address); } function modifynumTokensSellToAddToLiquidity(uint256 _newNum) public onlyOwner { numTokensSellToAddToLiquidity = _newNum; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { if (_isExcluded[account]) return _tOwned[account]; return tokenFromReflection(_rOwned[account]); } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, 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) { _approve(_msgSender(), spender, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub( amount, "ERC20: transfer amount exceeds allowance" ) ); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue) ); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].sub( subtractedValue, "ERC20: decreased allowance below zero" ) ); return true; } function isExcludedFromReward(address account) public view returns (bool) { return _isExcluded[account]; } function totalFees() public view returns (uint256) { return _tFeeTotal; } function deliver(uint256 tAmount) public { address sender = _msgSender(); require( !_isExcluded[sender], "Excluded addresses cannot call this function" ); (uint256 rAmount, , , , , , ) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rTotal = _rTotal.sub(rAmount); _tFeeTotal = _tFeeTotal.add(tAmount); } function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns (uint256) { require(tAmount <= _tTotal, "Amount must be less than supply"); if (!deductTransferFee) { (uint256 rAmount, , , , , , ) = _getValues(tAmount); return rAmount; } else { (, uint256 rTransferAmount, , , , , ) = _getValues(tAmount); return rTransferAmount; } } function tokenFromReflection(uint256 rAmount) public view returns (uint256) { require( rAmount <= _rTotal, "Amount must be less than total reflections" ); uint256 currentRate = _getRate(); return rAmount.div(currentRate); } function excludeFromReward(address account) public onlyOwner { require(!_isExcluded[account], "Account is already excluded"); if (_rOwned[account] > 0) { _tOwned[account] = tokenFromReflection(_rOwned[account]); } _isExcluded[account] = true; _excluded.push(account); } function includeInReward(address account) external onlyOwner { require(_isExcluded[account], "Account is already included"); for (uint256 i = 0; i < _excluded.length; i++) { if (_excluded[i] == account) { _excluded[i] = _excluded[_excluded.length - 1]; _tOwned[account] = 0; _isExcluded[account] = false; _excluded.pop(); break; } } } function _transferBothExcluded( address sender, address recipient, uint256 tAmount ) private { ( uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tDevelopment ) = _getValues(tAmount); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _takeDevelopment(tDevelopment); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function excludeFromFee(address account) public onlyOwner { _isExcludedFromFee[account] = true; } function includeInFee(address account) public onlyOwner { _isExcludedFromFee[account] = false; } function setTaxFeePercent(uint256 taxFee) external onlyOwner { _taxFee = taxFee; } function setDevelopmentFeePercent(uint256 developmentFee) external onlyOwner { _developmentFee = developmentFee; } function setLiquidityFeePercent(uint256 liquidityFee) external onlyOwner { _liquidityFee = liquidityFee; } function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner { _maxTxAmount = _tTotal.mul(maxTxPercent).div(10**3); } function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner { swapAndLiquifyEnabled = _enabled; emit SwapAndLiquifyEnabledUpdated(_enabled); } receive() external payable {} function _reflectFee(uint256 rFee, uint256 tFee) private { _rTotal = _rTotal.sub(rFee); _tFeeTotal = _tFeeTotal.add(tFee); } function _getValues(uint256 tAmount) private view returns ( uint256, uint256, uint256, uint256, uint256, uint256, uint256 ) { ( uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tDevelopment ) = _getTValues(tAmount); (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues( tAmount, tFee, tLiquidity, tDevelopment, _getRate() ); return ( rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity, tDevelopment ); } function _getTValues(uint256 tAmount) private view returns ( uint256, uint256, uint256, uint256 ) { uint256 tFee = calculateTaxFee(tAmount); uint256 tLiquidity = calculateLiquidityFee(tAmount); uint256 tDevelopment = calculateDevelopmentFee(tAmount); uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity).sub( tDevelopment ); return (tTransferAmount, tFee, tLiquidity, tDevelopment); } function _getRValues( uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 tDevelopment, uint256 currentRate ) private pure returns ( uint256, uint256, uint256 ) { uint256 rAmount = tAmount.mul(currentRate); uint256 rFee = tFee.mul(currentRate); uint256 rLiquidity = tLiquidity.mul(currentRate); uint256 rDevelopment = tDevelopment.mul(currentRate); uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity).sub( rDevelopment ); return (rAmount, rTransferAmount, rFee); } function _getRate() private view returns (uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply.div(tSupply); } function _getCurrentSupply() private view returns (uint256, uint256) { uint256 rSupply = _rTotal; uint256 tSupply = _tTotal; for (uint256 i = 0; i < _excluded.length; i++) { if ( _rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply ) return (_rTotal, _tTotal); rSupply = rSupply.sub(_rOwned[_excluded[i]]); tSupply = tSupply.sub(_tOwned[_excluded[i]]); } if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal); return (rSupply, tSupply); } function _takeLiquidity(uint256 tLiquidity) private { uint256 currentRate = _getRate(); uint256 rLiquidity = tLiquidity.mul(currentRate); _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity); if (_isExcluded[address(this)]) _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity); } function _takeDevelopment(uint256 tDevelopment) private { uint256 currentRate = _getRate(); uint256 rDevelopment = tDevelopment.mul(currentRate); _rOwned[_marketingWalletAddress] = _rOwned[_marketingWalletAddress].add( rDevelopment ); if (_isExcluded[_marketingWalletAddress]) _tOwned[_marketingWalletAddress] = _tOwned[_marketingWalletAddress] .add(tDevelopment); } function calculateTaxFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_taxFee).div(10**3); } function calculateDevelopmentFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_developmentFee).div(10**3); } function calculateLiquidityFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_liquidityFee).div(10**3); } function removeAllFee() private { if (_taxFee == 0 && _liquidityFee == 0) return; _previousTaxFee = _taxFee; _previousDevelopmentFee = _developmentFee; _previousLiquidityFee = _liquidityFee; _taxFee = 0; _developmentFee = 0; _liquidityFee = 0; } function restoreAllFee() private { _taxFee = _previousTaxFee; _developmentFee = _previousDevelopmentFee; _liquidityFee = _previousLiquidityFee; } function isExcludedFromFee(address account) public view returns (bool) { return _isExcludedFromFee[account]; } function _approve( address owner, address spender, uint256 amount ) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer( address from, address to, uint256 amount ) private { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); if (from != owner() && to != owner()) require( amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount." ); uint256 contractTokenBalance = balanceOf(address(this)); // if (contractTokenBalance >= _maxTxAmount) { // contractTokenBalance = _maxTxAmount; // } bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity; if ( overMinTokenBalance && !inSwapAndLiquify && from != uniswapV2Pair && swapAndLiquifyEnabled ) { // contractTokenBalance = numTokensSellToAddToLiquidity; swapAndLiquify(contractTokenBalance); } bool takeFee = true; if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) { takeFee = false; } _tokenTransfer(from, to, amount, takeFee); } function isGreaterThanMaxAllowance(address _to) internal view returns (bool) { if (_isPairAddress[_to]) { return false; } uint256 recieverCurrentBal = balanceOf(_to); if (recieverCurrentBal > maxTokenAllowance) { return true; } else { return false; } } function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap { uint256 half = contractTokenBalance.div(2); uint256 otherHalf = contractTokenBalance.sub(half); uint256 initialBalance = address(this).balance; swapTokensForEth(half); uint256 newBalance = address(this).balance.sub(initialBalance); addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } function swapTokensForEth(uint256 tokenAmount) private { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, 0, owner(), block.timestamp ); } function _tokenTransfer( address sender, address recipient, uint256 amount, bool takeFee ) private { if (!takeFee) removeAllFee(); if (_isExcluded[sender] && !_isExcluded[recipient]) { _transferFromExcluded(sender, recipient, amount); } else if (!_isExcluded[sender] && _isExcluded[recipient]) { _transferToExcluded(sender, recipient, amount); } else if (!_isExcluded[sender] && !_isExcluded[recipient]) { _transferStandard(sender, recipient, amount); } else if (_isExcluded[sender] && _isExcluded[recipient]) { _transferBothExcluded(sender, recipient, amount); } else { _transferStandard(sender, recipient, amount); } if (!takeFee) restoreAllFee(); } function _transferStandard( address sender, address recipient, uint256 tAmount ) private { ( uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tDevelopment ) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _takeDevelopment(tDevelopment); _reflectFee(rFee, tFee); bool checkMaxWallet = true; if (_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]) { checkMaxWallet = false; } if (checkMaxWallet){ require( !isGreaterThanMaxAllowance(recipient), "Reciever balance > MaxAllowance" ); } emit Transfer(sender, recipient, tTransferAmount); } function _transferToExcluded( address sender, address recipient, uint256 tAmount ) private { ( uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tDevelopment ) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _takeDevelopment(tDevelopment); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _transferFromExcluded( address sender, address recipient, uint256 tAmount ) private { ( uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tDevelopment ) = _getValues(tAmount); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _takeDevelopment(tDevelopment); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MaxAllowance","inputs":[{"type":"uint256","name":"percentage","internalType":"uint256","indexed":false},{"type":"uint256","name":"MaxTokenAllowance","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MinTokensBeforeSwapUpdated","inputs":[{"type":"uint256","name":"minTokensBeforeSwap","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SwapAndLiquify","inputs":[{"type":"uint256","name":"tokensSwapped","internalType":"uint256","indexed":false},{"type":"uint256","name":"ethReceived","internalType":"uint256","indexed":false},{"type":"uint256","name":"tokensIntoLiqudity","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapAndLiquifyEnabledUpdated","inputs":[{"type":"bool","name":"enabled","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_developmentFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_isExcludedFromFee","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_liquidityFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"_marketingWalletAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTxAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_taxFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deliver","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromFee","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeInFee","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeInReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"isInit","internalType":"bool"}],"name":"initializer","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFee","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxTokenAllowance","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"modifyMaxTokenPercentage","inputs":[{"type":"uint256","name":"_newPercent","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"modifynumTokensSellToAddToLiquidity","inputs":[{"type":"uint256","name":"_newNum","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"numTokensSellToAddToLiquidity","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectionFromToken","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"},{"type":"bool","name":"deductTransferFee","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDevelopmentFeePercent","inputs":[{"type":"uint256","name":"developmentFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLiquidityFeePercent","inputs":[{"type":"uint256","name":"liquidityFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMarketingWalletAddress","inputs":[{"type":"address","name":"_Address","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxTxPercent","inputs":[{"type":"uint256","name":"maxTxPercent","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapAndLiquifyEnabled","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTaxFeePercent","inputs":[{"type":"uint256","name":"taxFee","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapAndLiquifyEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenFromReflection","inputs":[{"type":"uint256","name":"rAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"uniswapV2Pair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router02"}],"name":"uniswapV2Router","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Deployed ByteCode
0x60806040526004361061026b5760003560e01c80636bc87c3a11610144578063a457c2d7116100b6578063d12a76881161007a578063d12a768814610975578063d1475185146109a0578063d543dbeb146109cb578063dd62ed3e146109f4578063ea2f0b3714610a31578063f2fde38b14610a5a57610272565b8063a457c2d714610880578063a9059cbb146108bd578063c3bc4622146108fa578063c49b9a8014610923578063cc9551271461094c57610272565b806388f820201161010857806388f820201461076e5780638da5cb5b146107ab5780638ee88c53146107d657806395d89b41146107ff5780639ce110d71461082a5780639f044f6c1461085557610272565b80636bc87c3a1461068757806370a08231146106b2578063715018a6146106ef578063768dc710146107065780637d1db4a51461074357610272565b80633b124fe7116101dd5780634680ff35116101a15780634680ff351461057957806349bd5a5e146105a25780634a74bb02146105cd5780634cb80fd5146105f857806352390c02146106215780635342acb41461064a57610272565b80633b124fe7146104945780633bd5d173146104bf5780634144d9e4146104e8578063437823ec146105135780634549b0391461053c57610272565b806318160ddd1161022f57806318160ddd1461035e57806323b872dd146103895780632d838119146103c6578063313ce567146104035780633685d4191461042e578063395093511461045757610272565b8063061c82d01461027757806306fdde03146102a0578063095ea7b3146102cb57806313114a9d146103085780631694505e1461033357610272565b3661027257005b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906148aa565b610a83565b005b3480156102ac57600080fd5b506102b5610b09565b6040516102c29190614967565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed91906149e7565b610b9b565b6040516102ff9190614a42565b60405180910390f35b34801561031457600080fd5b5061031d610bb9565b60405161032a9190614a6c565b60405180910390f35b34801561033f57600080fd5b50610348610bc3565b6040516103559190614ae6565b60405180910390f35b34801561036a57600080fd5b50610373610be9565b6040516103809190614a6c565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab9190614b01565b610bf3565b6040516103bd9190614a42565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e891906148aa565b610ccc565b6040516103fa9190614a6c565b60405180910390f35b34801561040f57600080fd5b50610418610d3a565b6040516104259190614b70565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190614b8b565b610d51565b005b34801561046357600080fd5b5061047e600480360381019061047991906149e7565b611086565b60405161048b9190614a42565b60405180910390f35b3480156104a057600080fd5b506104a9611139565b6040516104b69190614a6c565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e191906148aa565b61113f565b005b3480156104f457600080fd5b506104fd6112bb565b60405161050a9190614bc7565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190614b8b565b6112e1565b005b34801561054857600080fd5b50610563600480360381019061055e9190614c0e565b6113b8565b6040516105709190614a6c565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b91906148aa565b61143e565b005b3480156105ae57600080fd5b506105b76114c4565b6040516105c49190614bc7565b60405180910390f35b3480156105d957600080fd5b506105e26114ea565b6040516105ef9190614a42565b60405180910390f35b34801561060457600080fd5b5061061f600480360381019061061a9190614b8b565b6114fd565b005b34801561062d57600080fd5b5061064860048036038101906106439190614b8b565b6115bd565b005b34801561065657600080fd5b50610671600480360381019061066c9190614b8b565b611858565b60405161067e9190614a42565b60405180910390f35b34801561069357600080fd5b5061069c6118ae565b6040516106a99190614a6c565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d49190614b8b565b6118b4565b6040516106e69190614a6c565b60405180910390f35b3480156106fb57600080fd5b5061070461199f565b005b34801561071257600080fd5b5061072d60048036038101906107289190614b8b565b611ad9565b60405161073a9190614a42565b60405180910390f35b34801561074f57600080fd5b50610758611af9565b6040516107659190614a6c565b60405180910390f35b34801561077a57600080fd5b5061079560048036038101906107909190614b8b565b611aff565b6040516107a29190614a42565b60405180910390f35b3480156107b757600080fd5b506107c0611b55565b6040516107cd9190614bc7565b60405180910390f35b3480156107e257600080fd5b506107fd60048036038101906107f891906148aa565b611b7e565b005b34801561080b57600080fd5b50610814611c04565b6040516108219190614967565b60405180910390f35b34801561083657600080fd5b5061083f611c96565b60405161084c9190614a42565b60405180910390f35b34801561086157600080fd5b5061086a611f8a565b6040516108779190614a6c565b60405180910390f35b34801561088c57600080fd5b506108a760048036038101906108a291906149e7565b611f90565b6040516108b49190614a42565b60405180910390f35b3480156108c957600080fd5b506108e460048036038101906108df91906149e7565b61205d565b6040516108f19190614a42565b60405180910390f35b34801561090657600080fd5b50610921600480360381019061091c91906148aa565b61207b565b005b34801561092f57600080fd5b5061094a60048036038101906109459190614c4e565b612188565b005b34801561095857600080fd5b50610973600480360381019061096e91906148aa565b612258565b005b34801561098157600080fd5b5061098a6122de565b6040516109979190614a6c565b60405180910390f35b3480156109ac57600080fd5b506109b56122e4565b6040516109c29190614a6c565b60405180910390f35b3480156109d757600080fd5b506109f260048036038101906109ed91906148aa565b6122ea565b005b348015610a0057600080fd5b50610a1b6004803603810190610a169190614c7b565b612398565b604051610a289190614a6c565b60405180910390f35b348015610a3d57600080fd5b50610a586004803603810190610a539190614b8b565b61241f565b005b348015610a6657600080fd5b50610a816004803603810190610a7c9190614b8b565b6124f6565b005b610a8b6126ca565b73ffffffffffffffffffffffffffffffffffffffff16610aa9611b55565b73ffffffffffffffffffffffffffffffffffffffff1614610aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af690614d07565b60405180910390fd5b80600e8190555050565b6060600b8054610b1890614d56565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4490614d56565b8015610b915780601f10610b6657610100808354040283529160200191610b91565b820191906000526020600020905b815481529060010190602001808311610b7457829003601f168201915b5050505050905090565b6000610baf610ba86126ca565b84846126d2565b6001905092915050565b6000600a54905090565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600854905090565b6000610c0084848461289b565b610cc184610c0c6126ca565b610cbc8560405180606001604052806028815260200161594f60289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610c726126ca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bf49092919063ffffffff16565b6126d2565b600190509392505050565b6000600954821115610d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0a90614df9565b60405180910390fd5b6000610d1d612c49565b9050610d3281846126b490919063ffffffff16565b915050919050565b6000600d60009054906101000a900460ff16905090565b610d596126ca565b73ffffffffffffffffffffffffffffffffffffffff16610d77611b55565b73ffffffffffffffffffffffffffffffffffffffff1614610dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc490614d07565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090614e65565b60405180910390fd5b60005b600680549050811015611082578173ffffffffffffffffffffffffffffffffffffffff1660068281548110610e9457610e93614e85565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361106f5760066001600680549050610eee9190614ee3565b81548110610eff57610efe614e85565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660068281548110610f3e57610f3d614e85565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600680548061103557611034614f17565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055611082565b808061107a90614f46565b915050610e5c565b5050565b600061112f6110936126ca565b8461112a85600360006110a46126ca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7490919063ffffffff16565b6126d2565b6001905092915050565b600e5481565b60006111496126ca565b9050600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf90615000565b60405180910390fd5b60006111e383612c8a565b505050505050905061123d81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cf290919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061129581600954612cf290919063ffffffff16565b6009819055506112b083600a54612c7490919063ffffffff16565b600a81905550505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6112e96126ca565b73ffffffffffffffffffffffffffffffffffffffff16611307611b55565b73ffffffffffffffffffffffffffffffffffffffff161461135d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135490614d07565b60405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006008548311156113ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f69061506c565b60405180910390fd5b8161142057600061140f84612c8a565b505050505050905080915050611438565b600061142b84612c8a565b5050505050915050809150505b92915050565b6114466126ca565b73ffffffffffffffffffffffffffffffffffffffff16611464611b55565b73ffffffffffffffffffffffffffffffffffffffff16146114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b190614d07565b60405180910390fd5b8060108190555050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601660159054906101000a900460ff1681565b6115056126ca565b73ffffffffffffffffffffffffffffffffffffffff16611523611b55565b73ffffffffffffffffffffffffffffffffffffffff1614611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090614d07565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6115c56126ca565b73ffffffffffffffffffffffffffffffffffffffff166115e3611b55565b73ffffffffffffffffffffffffffffffffffffffff1614611639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163090614d07565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd906150d8565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561179a57611756600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ccc565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60125481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561194f57600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061199a565b611997600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ccc565b90505b919050565b6119a76126ca565b73ffffffffffffffffffffffffffffffffffffffff166119c5611b55565b73ffffffffffffffffffffffffffffffffffffffff1614611a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1290614d07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60046020528060005260406000206000915054906101000a900460ff1681565b60175481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b866126ca565b73ffffffffffffffffffffffffffffffffffffffff16611ba4611b55565b73ffffffffffffffffffffffffffffffffffffffff1614611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf190614d07565b60405180910390fd5b8060128190555050565b6060600c8054611c1390614d56565b80601f0160208091040260200160405190810160405280929190818152602001828054611c3f90614d56565b8015611c8c5780601f10611c6157610100808354040283529160200191611c8c565b820191906000526020600020905b815481529060010190602001808311611c6f57829003601f168201915b5050505050905090565b6000611ca06126ca565b73ffffffffffffffffffffffffffffffffffffffff16611cbe611b55565b73ffffffffffffffffffffffffffffffffffffffff1614611d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0b90614d07565b60405180910390fd5b6000733bab21d55bc77995943c61588deccaa9c56cf63490508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9c919061510d565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e27919061510d565b6040518363ffffffff1660e01b8152600401611e4492919061513a565b6020604051808303816000875af1158015611e63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e87919061510d565b601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160146000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600191505090565b60195481565b6000612053611f9d6126ca565b8461204e856040518060600160405280602581526020016159776025913960036000611fc76126ca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bf49092919063ffffffff16565b6126d2565b6001905092915050565b600061207161206a6126ca565b848461289b565b6001905092915050565b6120836126ca565b73ffffffffffffffffffffffffffffffffffffffff166120a1611b55565b73ffffffffffffffffffffffffffffffffffffffff16146120f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ee90614d07565b60405180910390fd5b80601a819055506121296103e861211b601a5460085461269e90919063ffffffff16565b6126b490919063ffffffff16565b6019819055506000612147600a601a546126b490919063ffffffff16565b90507fb9e6db42f6c378dd84d40ea4c34967ca9f838d98c8c7029e100dd13f68cc2f3b8160195460405161217c929190615163565b60405180910390a15050565b6121906126ca565b73ffffffffffffffffffffffffffffffffffffffff166121ae611b55565b73ffffffffffffffffffffffffffffffffffffffff1614612204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fb90614d07565b60405180910390fd5b80601660156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1598160405161224d9190614a42565b60405180910390a150565b6122606126ca565b73ffffffffffffffffffffffffffffffffffffffff1661227e611b55565b73ffffffffffffffffffffffffffffffffffffffff16146122d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cb90614d07565b60405180910390fd5b8060188190555050565b60185481565b60105481565b6122f26126ca565b73ffffffffffffffffffffffffffffffffffffffff16612310611b55565b73ffffffffffffffffffffffffffffffffffffffff1614612366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235d90614d07565b60405180910390fd5b61238f6103e86123818360085461269e90919063ffffffff16565b6126b490919063ffffffff16565b60178190555050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6124276126ca565b73ffffffffffffffffffffffffffffffffffffffff16612445611b55565b73ffffffffffffffffffffffffffffffffffffffff161461249b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249290614d07565b60405180910390fd5b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6124fe6126ca565b73ffffffffffffffffffffffffffffffffffffffff1661251c611b55565b73ffffffffffffffffffffffffffffffffffffffff1614612572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256990614d07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d8906151fe565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081836126ac919061521e565b905092915050565b600081836126c2919061528f565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273890615332565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a7906153c4565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161288e9190614a6c565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361290a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290190615456565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612979576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612970906154e8565b60405180910390fd5b600081116129bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b39061557a565b60405180910390fd5b6129c4611b55565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612a325750612a02611b55565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612a7d57601754811115612a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a739061560c565b60405180910390fd5b5b6000612a88306118b4565b905060006018548210159050808015612aae5750601660149054906101000a900460ff16155b8015612b085750601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612b205750601660159054906101000a900460ff165b15612b2f57612b2e82612d08565b5b600060019050600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612bd65750600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612be057600090505b612bec86868684612dde565b505050505050565b6000838311158290612c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c339190614967565b60405180910390fd5b5082840390509392505050565b6000806000612c566130ef565b91509150612c6d81836126b490919063ffffffff16565b9250505090565b60008183612c82919061562c565b905092915050565b6000806000806000806000806000806000612ca48c6133a2565b93509350935093506000806000612cc58f878787612cc0612c49565b613421565b925092509250828282898989899d509d509d509d509d509d509d5050505050505050919395979092949650565b60008183612d009190614ee3565b905092915050565b6001601660146101000a81548160ff0219169083151502179055506000612d396002836126b490919063ffffffff16565b90506000612d508284612cf290919063ffffffff16565b90506000479050612d60836134d5565b6000612d758247612cf290919063ffffffff16565b9050612d818382613718565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051612db493929190615660565b60405180910390a1505050506000601660146101000a81548160ff02191690831515021790555050565b80612dec57612deb6137fd565b5b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612e8f5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612ea457612e9f84848461384b565b6130db565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612f475750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612f5c57612f57848484613ab9565b6130da565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156130005750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561301557613010848484613d27565b6130d9565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156130b75750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156130cc576130c7848484614002565b6130d8565b6130d7848484613d27565b5b5b5b5b806130e9576130e8614305565b5b50505050565b600080600060095490506000600854905060005b6006805490508110156133655782600160006006848154811061312957613128614e85565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061321757508160026000600684815481106131af576131ae614e85565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b1561322e576009546008549450945050505061339e565b6132be600160006006848154811061324957613248614e85565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484612cf290919063ffffffff16565b925061335060026000600684815481106132db576132da614e85565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483612cf290919063ffffffff16565b9150808061335d90614f46565b915050613103565b5061337d6008546009546126b490919063ffffffff16565b8210156133955760095460085493509350505061339e565b81819350935050505b9091565b60008060008060006133b386614322565b905060006133c087614354565b905060006133cd88614386565b90506000613408826133fa856133ec888e612cf290919063ffffffff16565b612cf290919063ffffffff16565b612cf290919063ffffffff16565b9050808484849750975097509750505050509193509193565b60008060008061343a858a61269e90919063ffffffff16565b90506000613451868a61269e90919063ffffffff16565b90506000613468878a61269e90919063ffffffff16565b9050600061347f888a61269e90919063ffffffff16565b905060006134ba826134ac8561349e888a612cf290919063ffffffff16565b612cf290919063ffffffff16565b612cf290919063ffffffff16565b90508481859750975097505050505050955095509592505050565b6000600267ffffffffffffffff8111156134f2576134f1615697565b5b6040519080825280602002602001820160405280156135205781602001602082028036833780820191505090505b509050308160008151811061353857613537614e85565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613603919061510d565b8160018151811061361757613616614e85565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061367e30601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846126d2565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016136e29594939291906157bf565b600060405180830381600087803b1580156136fc57600080fd5b505af1158015613710573d6000803e3d6000fd5b505050505050565b61374530601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846126d2565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613791611b55565b426040518863ffffffff1660e01b81526004016137b396959493929190615819565b60606040518083038185885af11580156137d1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906137f6919061588f565b5050505050565b6000600e5414801561381157506000601254145b61384957600e54600f819055506010546011819055506012546013819055506000600e81905550600060108190555060006012819055505b565b600080600080600080600061385f88612c8a565b96509650965096509650965096506138bf88600260008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cf290919063ffffffff16565b600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061395487600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cf290919063ffffffff16565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139e986600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7490919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613a35826143b8565b613a3e8161455d565b613a4885846147ac565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051613aa59190614a6c565b60405180910390a350505050505050505050565b6000806000806000806000613acd88612c8a565b9650965096509650965096509650613b2d87600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cf290919063ffffffff16565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613bc284600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7490919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c5786600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7490919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ca3826143b8565b613cac8161455d565b613cb685846147ac565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051613d139190614a6c565b60405180910390a350505050505050505050565b6000806000806000806000613d3b88612c8a565b9650965096509650965096509650613d9b87600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cf290919063ffffffff16565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613e3086600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7490919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613e7c826143b8565b613e858161455d565b613e8f85846147ac565b600060019050600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680613f365750600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15613f4057600090505b8015613f9057613f4f8a6147e6565b15613f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f869061592e565b60405180910390fd5b5b8973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051613fed9190614a6c565b60405180910390a35050505050505050505050565b600080600080600080600061401688612c8a565b965096509650965096509650965061407688600260008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cf290919063ffffffff16565b600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061410b87600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612cf290919063ffffffff16565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506141a084600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7490919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061423586600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7490919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614281826143b8565b61428a8161455d565b61429485846147ac565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516142f19190614a6c565b60405180910390a350505050505050505050565b600f54600e81905550601154601081905550601354601281905550565b600061434d6103e861433f600e548561269e90919063ffffffff16565b6126b490919063ffffffff16565b9050919050565b600061437f6103e86143716012548561269e90919063ffffffff16565b6126b490919063ffffffff16565b9050919050565b60006143b16103e86143a36010548561269e90919063ffffffff16565b6126b490919063ffffffff16565b9050919050565b60006143c2612c49565b905060006143d9828461269e90919063ffffffff16565b905061442d81600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7490919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156145585761451483600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7490919063ffffffff16565b600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b6000614567612c49565b9050600061457e828461269e90919063ffffffff16565b90506145f48160016000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7490919063ffffffff16565b60016000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060056000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156147a7576147418360026000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c7490919063ffffffff16565b60026000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b6147c182600954612cf290919063ffffffff16565b6009819055506147dc81600a54612c7490919063ffffffff16565b600a819055505050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615614843576000905061486a565b600061484e836118b4565b905060195481111561486457600191505061486a565b60009150505b919050565b600080fd5b6000819050919050565b61488781614874565b811461489257600080fd5b50565b6000813590506148a48161487e565b92915050565b6000602082840312156148c0576148bf61486f565b5b60006148ce84828501614895565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156149115780820151818401526020810190506148f6565b60008484015250505050565b6000601f19601f8301169050919050565b6000614939826148d7565b61494381856148e2565b93506149538185602086016148f3565b61495c8161491d565b840191505092915050565b60006020820190508181036000830152614981818461492e565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006149b482614989565b9050919050565b6149c4816149a9565b81146149cf57600080fd5b50565b6000813590506149e1816149bb565b92915050565b600080604083850312156149fe576149fd61486f565b5b6000614a0c858286016149d2565b9250506020614a1d85828601614895565b9150509250929050565b60008115159050919050565b614a3c81614a27565b82525050565b6000602082019050614a576000830184614a33565b92915050565b614a6681614874565b82525050565b6000602082019050614a816000830184614a5d565b92915050565b6000819050919050565b6000614aac614aa7614aa284614989565b614a87565b614989565b9050919050565b6000614abe82614a91565b9050919050565b6000614ad082614ab3565b9050919050565b614ae081614ac5565b82525050565b6000602082019050614afb6000830184614ad7565b92915050565b600080600060608486031215614b1a57614b1961486f565b5b6000614b28868287016149d2565b9350506020614b39868287016149d2565b9250506040614b4a86828701614895565b9150509250925092565b600060ff82169050919050565b614b6a81614b54565b82525050565b6000602082019050614b856000830184614b61565b92915050565b600060208284031215614ba157614ba061486f565b5b6000614baf848285016149d2565b91505092915050565b614bc1816149a9565b82525050565b6000602082019050614bdc6000830184614bb8565b92915050565b614beb81614a27565b8114614bf657600080fd5b50565b600081359050614c0881614be2565b92915050565b60008060408385031215614c2557614c2461486f565b5b6000614c3385828601614895565b9250506020614c4485828601614bf9565b9150509250929050565b600060208284031215614c6457614c6361486f565b5b6000614c7284828501614bf9565b91505092915050565b60008060408385031215614c9257614c9161486f565b5b6000614ca0858286016149d2565b9250506020614cb1858286016149d2565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614cf16020836148e2565b9150614cfc82614cbb565b602082019050919050565b60006020820190508181036000830152614d2081614ce4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d6e57607f821691505b602082108103614d8157614d80614d27565b5b50919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b6000614de3602a836148e2565b9150614dee82614d87565b604082019050919050565b60006020820190508181036000830152614e1281614dd6565b9050919050565b7f4163636f756e7420697320616c726561647920696e636c756465640000000000600082015250565b6000614e4f601b836148e2565b9150614e5a82614e19565b602082019050919050565b60006020820190508181036000830152614e7e81614e42565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614eee82614874565b9150614ef983614874565b9250828203905081811115614f1157614f10614eb4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000614f5182614874565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f8357614f82614eb4565b5b600182019050919050565b7f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460008201527f6869732066756e6374696f6e0000000000000000000000000000000000000000602082015250565b6000614fea602c836148e2565b9150614ff582614f8e565b604082019050919050565b6000602082019050818103600083015261501981614fdd565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b6000615056601f836148e2565b915061506182615020565b602082019050919050565b6000602082019050818103600083015261508581615049565b9050919050565b7f4163636f756e7420697320616c7265616479206578636c756465640000000000600082015250565b60006150c2601b836148e2565b91506150cd8261508c565b602082019050919050565b600060208201905081810360008301526150f1816150b5565b9050919050565b600081519050615107816149bb565b92915050565b6000602082840312156151235761512261486f565b5b6000615131848285016150f8565b91505092915050565b600060408201905061514f6000830185614bb8565b61515c6020830184614bb8565b9392505050565b60006040820190506151786000830185614a5d565b6151856020830184614a5d565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151e86026836148e2565b91506151f38261518c565b604082019050919050565b60006020820190508181036000830152615217816151db565b9050919050565b600061522982614874565b915061523483614874565b925082820261524281614874565b9150828204841483151761525957615258614eb4565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061529a82614874565b91506152a583614874565b9250826152b5576152b4615260565b5b828204905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061531c6024836148e2565b9150615327826152c0565b604082019050919050565b6000602082019050818103600083015261534b8161530f565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006153ae6022836148e2565b91506153b982615352565b604082019050919050565b600060208201905081810360008301526153dd816153a1565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006154406025836148e2565b915061544b826153e4565b604082019050919050565b6000602082019050818103600083015261546f81615433565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006154d26023836148e2565b91506154dd82615476565b604082019050919050565b60006020820190508181036000830152615501816154c5565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b60006155646029836148e2565b915061556f82615508565b604082019050919050565b6000602082019050818103600083015261559381615557565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b60006155f66028836148e2565b91506156018261559a565b604082019050919050565b60006020820190508181036000830152615625816155e9565b9050919050565b600061563782614874565b915061564283614874565b925082820190508082111561565a57615659614eb4565b5b92915050565b60006060820190506156756000830186614a5d565b6156826020830185614a5d565b61568f6040830184614a5d565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000819050919050565b60006156eb6156e66156e1846156c6565b614a87565b614874565b9050919050565b6156fb816156d0565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615736816149a9565b82525050565b6000615748838361572d565b60208301905092915050565b6000602082019050919050565b600061576c82615701565b615776818561570c565b93506157818361571d565b8060005b838110156157b2578151615799888261573c565b97506157a483615754565b925050600181019050615785565b5085935050505092915050565b600060a0820190506157d46000830188614a5d565b6157e160208301876156f2565b81810360408301526157f38186615761565b90506158026060830185614bb8565b61580f6080830184614a5d565b9695505050505050565b600060c08201905061582e6000830189614bb8565b61583b6020830188614a5d565b61584860408301876156f2565b61585560608301866156f2565b6158626080830185614bb8565b61586f60a0830184614a5d565b979650505050505050565b6000815190506158898161487e565b92915050565b6000806000606084860312156158a8576158a761486f565b5b60006158b68682870161587a565b93505060206158c78682870161587a565b92505060406158d88682870161587a565b9150509250925092565b7f52656369657665722062616c616e6365203e204d6178416c6c6f77616e636500600082015250565b6000615918601f836148e2565b9150615923826158e2565b602082019050919050565b600060208201905081810360008301526159478161590b565b905091905056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a5afa409ba93b1277d7a67bc7baf18405b5ff30af872c8b0ae9b0bf830cfcaf464736f6c63430008110033