THEBET_TOKEN

Deploy on Alchemy
Verified
Ethereum
Verified, Token, Oracle, Router
Solidity
Verified
Ethereum

Contract Information

The following smart contract is called THEBET_TOKEN. It is an ERC20 token with additional features such as transaction limits, blacklisting, and automatic liquidity provision. The contract uses the Uniswap V2 router for swapping tokens and adding liquidity. The contract also includes a fee system where a percentage of each transaction is taken as a fee and distributed to the fee receiver. The contract owner can update fees, swap thresholds, and the fee receiver address.
More Info

THEBET_TOKEN Source Code

// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, 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 from, address to, 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); } interface IERC20Metadata is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function decimals() public view virtual override returns (uint8) { return 18; } function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } 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; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } 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); } 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); } } } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); } interface IUniswapV2Router02 is IUniswapV2Router01 { function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() { _transferOwnership(_msgSender()); } 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 { _transferOwnership(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } library SafeMath { 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 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; } } } contract THEBET_TOKEN is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 private uniswapV2Router; address private uniswapV2Pair; uint256 public maxTransactionAmount; uint256 public maxWallet; uint256 public swapTokensThreshold; bool public limitsInEffect = true; bool private _isSwapping; uint256 private _swapFee = 6; uint256 private _tokensForFee; address private _feeReceiver; // exlcude from fees and max transaction amount mapping (address => bool) public isExcludedFromFees; mapping (address => bool) private _isExcludedMaxTransactionAmount; // for bots mapping (address => bool) public isBlacklisted; // any transfer *to* these addresses could be subject to a maximum transfer amount mapping (address => bool) private _automatedMarketMakerPairs; // to stop bot spam buys and sells on launch mapping(address => uint256) private _holderLastTransferBlock; /** * @dev Throws if called by any account other than the _feeReceiver */ modifier teamOROwner() { require(_feeReceiver == _msgSender() || owner() == _msgSender(), "Caller is not the _feeReceiver address nor owner."); _; } constructor() ERC20("The BET", "BET") payable { IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); _isExcludedMaxTransactionAmount[address(_uniswapV2Router)] = true; uniswapV2Router = _uniswapV2Router; uint256 totalSupply = 1e7 * 1e18; // 10M uint256 totalLiquidity = 65e5 * 1e18; // 6.5M maxTransactionAmount = totalSupply * 325 / 100000; maxWallet = totalSupply * 65 / 10000; swapTokensThreshold = totalSupply * 1 / 1000; _feeReceiver = owner(); // exclude from paying fees or having max transaction amount excludeFromFees(owner(), true); excludeFromFees(address(this), true); excludeFromFees(address(0xdead), true); _isExcludedMaxTransactionAmount[owner()] = true; _isExcludedMaxTransactionAmount[address(this)] = true; _isExcludedMaxTransactionAmount[address(0xdead)] = true; _mint(address(this), totalLiquidity); _mint(msg.sender, totalSupply.sub(totalLiquidity)); } /** * @dev Once live, can never be switched off */ function startTrading() external teamOROwner { uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH()); _isExcludedMaxTransactionAmount[address(uniswapV2Pair)] = true; _automatedMarketMakerPairs[address(uniswapV2Pair)] = true; _approve(address(this), address(uniswapV2Router), balanceOf(address(this))); uniswapV2Router.addLiquidityETH{value: address(this).balance} ( address(this), balanceOf(address(this)), 0, 0, owner(), block.timestamp ); } /** * @dev Remove limits after token is somewhat stable */ function removeLimits() external teamOROwner { limitsInEffect = false; } /** * @dev Exclude from fee calculation */ function excludeFromFees(address account, bool excluded) public teamOROwner { isExcludedFromFees[account] = excluded; } /** * @dev Blacklist certain addresses from transfering */ function blacklistAddress(address[] memory addrs, bool state) external teamOROwner { for (uint i = 0; i < addrs.length; i++) { if (addrs[i] != uniswapV2Pair && addrs[i] != address(uniswapV2Router)) isBlacklisted[addrs[i]] = state; } } /** * @dev Update token fees (max set to initial fee) */ function updateFees(uint256 fee) external onlyOwner { _swapFee = fee; require(_swapFee <= 6, "Must keep fees at 6% or less"); } /** * @dev Update wallet that receives fees and newly added LP */ function updateFeeReceiver(address newWallet) external teamOROwner { _feeReceiver = newWallet; } /** * @dev Very important function. * Updates the threshold of how many tokens that must be in the contract calculation for fees to be taken */ function updateSwapTokensThreshold(uint256 newThreshold) external teamOROwner returns (bool) { require(newThreshold >= totalSupply() * 1 / 100000, "Swap threshold cannot be lower than 0.001% total supply."); require(newThreshold <= totalSupply() * 5 / 1000, "Swap threshold cannot be higher than 0.5% total supply."); swapTokensThreshold = newThreshold; return true; } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "_transfer:: Transfer from the zero address not allowed."); require(to != address(0), "_transfer:: Transfer to the zero address not allowed."); require(!isBlacklisted[from], "_transfer:: Your address has been marked as blacklisted."); if (amount == 0) { super._transfer(from, to, 0); return; } // all to secure a smooth launch if (limitsInEffect) { if ( from != owner() && to != owner() && !_isSwapping ) { if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){ require(_holderLastTransferBlock[tx.origin] < block.number, "_transfer:: Transfer Delay enabled. Only one purchase per block allowed."); _holderLastTransferBlock[tx.origin] = block.number; } // on buy if (_automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) { require(amount <= maxTransactionAmount, "_transfer:: Buy transfer amount exceeds the maxTransactionAmount."); require(amount.add(balanceOf(to)) <= maxWallet, "_transfer:: Max wallet exceeded"); } // on sell else if (_automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) { require(amount <= maxTransactionAmount, "_transfer:: Sell transfer amount exceeds the maxTransactionAmount."); } else if (!_isExcludedMaxTransactionAmount[to]) { require(amount.add(balanceOf(to)) <= maxWallet, "_transfer:: Max wallet exceeded"); } } } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensThreshold; if ( canSwap && !_isSwapping && !_automatedMarketMakerPairs[from] && !isExcludedFromFees[from] && !isExcludedFromFees[to] ) { _isSwapping = true; swapBack(); _isSwapping = false; } bool takeFee = !_isSwapping; // if any addy belongs to _isExcludedFromFee or isn't a swap then remove the fee if ( isExcludedFromFees[from] || isExcludedFromFees[to] || (!_automatedMarketMakerPairs[from] && !_automatedMarketMakerPairs[to]) ) takeFee = false; uint256 fees = 0; if (takeFee) { fees = amount.mul(_swapFee).div(100); _tokensForFee = amount.mul(_swapFee).div(100); if (fees > 0) super._transfer(from, address(this), fees); amount -= fees; } super._transfer(from, to, amount); } function _swapTokensForEth(uint256 tokenAmount) internal { 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) internal { _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, 0, _feeReceiver, block.timestamp ); } function swapBack() internal { uint256 contractBalance = balanceOf(address(this)); uint256 tokensForLiquidity = _tokensForFee.div(4); // 1/4th of the fee uint256 tokensForFee = _tokensForFee.sub(tokensForLiquidity); if (contractBalance == 0 || _tokensForFee == 0) return; if (contractBalance > swapTokensThreshold) contractBalance = swapTokensThreshold; // Halve the amount of liquidity tokens uint256 liquidityTokens = contractBalance * tokensForLiquidity / _tokensForFee / 2; uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens); uint256 initialETHBalance = address(this).balance; _swapTokensForEth(amountToSwapForETH); uint256 ethBalance = address(this).balance.sub(initialETHBalance); uint256 ethFee = ethBalance.mul(tokensForFee).div(_tokensForFee); uint256 ethLiquidity = ethBalance - ethFee; _tokensForFee = 0; payable(_feeReceiver).transfer(ethFee); if (liquidityTokens > 0 && ethLiquidity > 0) _addLiquidity(liquidityTokens, ethLiquidity); } /** * @dev Transfer eth stuck in contract to _feeReceiver */ function withdrawContractETH() external { payable(_feeReceiver).transfer(address(this).balance); } /** * @dev In case swap wont do it and sells/buys might be blocked */ function forceSwap() external teamOROwner { _swapTokensForEth(balanceOf(address(this))); } receive() external payable {} }
< // SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, 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 from,
        address to,
        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);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    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;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    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);
    }

    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);
            }
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() {
        _transferOwnership(_msgSender());
    }

    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 {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

library SafeMath {
    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 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;
        }
    }
}

contract THEBET_TOKEN is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;
    
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;
    uint256 public swapTokensThreshold;
        
    bool public limitsInEffect = true;

    bool private _isSwapping;

    uint256 private _swapFee = 6;
    uint256 private _tokensForFee;
    address private _feeReceiver;

    // exlcude from fees and max transaction amount
    mapping (address => bool) public isExcludedFromFees;
    mapping (address => bool) private _isExcludedMaxTransactionAmount;

    // for bots
    mapping (address => bool) public isBlacklisted;

    // any transfer *to* these addresses could be subject to a maximum transfer amount
    mapping (address => bool) private _automatedMarketMakerPairs;

    // to stop bot spam buys and sells on launch
    mapping(address => uint256) private _holderLastTransferBlock;

    /**
     * @dev Throws if called by any account other than the _feeReceiver
     */
    modifier teamOROwner() {
        require(_feeReceiver == _msgSender() || owner() == _msgSender(), "Caller is not the _feeReceiver address nor owner.");
        _;
    }

    constructor() ERC20("The BET", "BET") payable {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        _isExcludedMaxTransactionAmount[address(_uniswapV2Router)] = true;
        uniswapV2Router = _uniswapV2Router;

        uint256 totalSupply = 1e7 * 1e18; // 10M
        uint256 totalLiquidity = 65e5 * 1e18; // 6.5M

        maxTransactionAmount = totalSupply * 325 / 100000;
        maxWallet = totalSupply * 65 / 10000;
        swapTokensThreshold = totalSupply * 1 / 1000;

        _feeReceiver = owner();

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        _isExcludedMaxTransactionAmount[owner()] = true;
        _isExcludedMaxTransactionAmount[address(this)] = true;
        _isExcludedMaxTransactionAmount[address(0xdead)] = true;

        _mint(address(this), totalLiquidity);
        _mint(msg.sender, totalSupply.sub(totalLiquidity));
    }

    /**
    * @dev Once live, can never be switched off
    */
    function startTrading() external teamOROwner {
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        _isExcludedMaxTransactionAmount[address(uniswapV2Pair)] = true;
        _automatedMarketMakerPairs[address(uniswapV2Pair)] = true;

        _approve(address(this), address(uniswapV2Router), balanceOf(address(this)));
        uniswapV2Router.addLiquidityETH{value: address(this).balance} (
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    /**
    * @dev Remove limits after token is somewhat stable
    */
    function removeLimits() external teamOROwner {
        limitsInEffect = false;
    }

    /**
    * @dev Exclude from fee calculation
    */
    function excludeFromFees(address account, bool excluded) public teamOROwner {
        isExcludedFromFees[account] = excluded;
    }
    
    /**
    * @dev Blacklist certain addresses from transfering
    */
    function blacklistAddress(address[] memory addrs, bool state) external teamOROwner {
        for (uint i = 0; i < addrs.length; i++) {
            if (addrs[i] != uniswapV2Pair && addrs[i] != address(uniswapV2Router)) 
                isBlacklisted[addrs[i]] = state;
        }
    }

    /**
    * @dev Update token fees (max set to initial fee)
    */
    function updateFees(uint256 fee) external onlyOwner {
        _swapFee = fee;

        require(_swapFee <= 6, "Must keep fees at 6% or less");
    }

    /**
    * @dev Update wallet that receives fees and newly added LP
    */
    function updateFeeReceiver(address newWallet) external teamOROwner {
        _feeReceiver = newWallet;
    }

    /**
    * @dev Very important function. 
    * Updates the threshold of how many tokens that must be in the contract calculation for fees to be taken
    */
    function updateSwapTokensThreshold(uint256 newThreshold) external teamOROwner returns (bool) {
  	    require(newThreshold >= totalSupply() * 1 / 100000, "Swap threshold cannot be lower than 0.001% total supply.");
  	    require(newThreshold <= totalSupply() * 5 / 1000, "Swap threshold cannot be higher than 0.5% total supply.");
  	    swapTokensThreshold = newThreshold;
  	    return true;
  	}

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "_transfer:: Transfer from the zero address not allowed.");
        require(to != address(0), "_transfer:: Transfer to the zero address not allowed.");
        require(!isBlacklisted[from], "_transfer:: Your address has been marked as blacklisted.");

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        // all to secure a smooth launch
        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                !_isSwapping
            ) {
                if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                    require(_holderLastTransferBlock[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                    _holderLastTransferBlock[tx.origin] = block.number;
                }

                // on buy
                if (_automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "_transfer:: Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount.add(balanceOf(to)) <= maxWallet, "_transfer:: Max wallet exceeded");
                }
                
                // on sell
                else if (_automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "_transfer:: Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(amount.add(balanceOf(to)) <= maxWallet, "_transfer:: Max wallet exceeded");
                }
            }
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensThreshold;
        if (
            canSwap &&
            !_isSwapping &&
            !_automatedMarketMakerPairs[from] &&
            !isExcludedFromFees[from] &&
            !isExcludedFromFees[to]
        ) {
            _isSwapping = true;
            swapBack();
            _isSwapping = false;
        }

        bool takeFee = !_isSwapping;

        // if any addy belongs to _isExcludedFromFee or isn't a swap then remove the fee
        if (
            isExcludedFromFees[from] || 
            isExcludedFromFees[to] || 
            (!_automatedMarketMakerPairs[from] && !_automatedMarketMakerPairs[to])
        ) takeFee = false;
        
        uint256 fees = 0;
        if (takeFee) {
            fees = amount.mul(_swapFee).div(100);
            _tokensForFee = amount.mul(_swapFee).div(100);
            
            if (fees > 0) 
                super._transfer(from, address(this), fees);
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function _swapTokensForEth(uint256 tokenAmount) internal {
        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) internal {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            _feeReceiver,
            block.timestamp
        );
    }

    function swapBack() internal {
        uint256 contractBalance = balanceOf(address(this));
        uint256 tokensForLiquidity = _tokensForFee.div(4); // 1/4th of the fee
        uint256 tokensForFee = _tokensForFee.sub(tokensForLiquidity);
        
        if (contractBalance == 0 || _tokensForFee == 0) return;
        if (contractBalance > swapTokensThreshold) contractBalance = swapTokensThreshold;
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / _tokensForFee / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        _swapTokensForEth(amountToSwapForETH);
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethFee = ethBalance.mul(tokensForFee).div(_tokensForFee);
        uint256 ethLiquidity = ethBalance - ethFee;
        
        _tokensForFee = 0;

        payable(_feeReceiver).transfer(ethFee);
                
        if (liquidityTokens > 0 && ethLiquidity > 0) 
            _addLiquidity(liquidityTokens, ethLiquidity);
    }

    /**
    * @dev Transfer eth stuck in contract to _feeReceiver
    */
    function withdrawContractETH() external {
        payable(_feeReceiver).transfer(address(this).balance);
    }

    /**
    * @dev In case swap wont do it and sells/buys might be blocked
    */
    function forceSwap() external teamOROwner {
        _swapTokensForEth(balanceOf(address(this)));
    }

    receive() external payable {}
} < 

THEBET_TOKEN ABI

[{"inputs":[],"stateMutability":"payable","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"bool","name":"state","type":"bool"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"updateSwapTokensThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawContractETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
[{"inputs":[],"stateMutability":"payable","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"bool","name":"state","type":"bool"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"updateSwapTokensThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawContractETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

THEBET_TOKEN Bytecode

60806040526001600b60006101000a81548160ff0219169083151502179055506006600c556040518060400160405280600781526020017f54686520424554000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f42455400000000000000000000000000000000000000000000000000000000008152508160039081620000a1919062000a6d565b508060049081620000b3919062000a6d565b505050620000d6620000ca6200040f60201b60201c565b6200041760201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006a084595161401484a000000905060006a05606db4c03408968000009050620186a061014583620001bc919062000b83565b620001c8919062000c13565b600881905550612710604183620001e0919062000b83565b620001ec919062000c13565b6009819055506103e860018362000204919062000b83565b62000210919062000c13565b600a8190555062000226620004dd60201b60201c565b600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002886200027a620004dd60201b60201c565b60016200050760201b60201c565b6200029b3060016200050760201b60201c565b620002b061dead60016200050760201b60201c565b600160106000620002c6620004dd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016010600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003db30826200065960201b60201c565b6200040633620003fa8385620007d160201b62001b301790919060201c565b6200065960201b60201c565b50505062000e2c565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620005176200040f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480620005bc57506200057e6200040f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005a4620004dd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16145b620005fe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005f59062000cd2565b60405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620006cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006c29062000d44565b60405180910390fd5b620006df60008383620007e960201b60201c565b8060026000828254620006f3919062000d66565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200074a919062000d66565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620007b1919062000dd4565b60405180910390a3620007cd60008383620007ee60201b60201c565b5050565b60008183620007e1919062000df1565b905092915050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200087557607f821691505b6020821081036200088b576200088a6200082d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008f57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620008b6565b620009018683620008b6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200094e62000948620009428462000919565b62000923565b62000919565b9050919050565b6000819050919050565b6200096a836200092d565b62000982620009798262000955565b848454620008c3565b825550505050565b600090565b620009996200098a565b620009a68184846200095f565b505050565b5b81811015620009ce57620009c26000826200098f565b600181019050620009ac565b5050565b601f82111562000a1d57620009e78162000891565b620009f284620008a6565b8101602085101562000a02578190505b62000a1a62000a1185620008a6565b830182620009ab565b50505b505050565b600082821c905092915050565b600062000a426000198460080262000a22565b1980831691505092915050565b600062000a5d838362000a2f565b9150826002028217905092915050565b62000a7882620007f3565b67ffffffffffffffff81111562000a945762000a93620007fe565b5b62000aa082546200085c565b62000aad828285620009d2565b600060209050601f83116001811462000ae5576000841562000ad0578287015190505b62000adc858262000a4f565b86555062000b4c565b601f19841662000af58662000891565b60005b8281101562000b1f5784890151825560018201915060208501945060208101905062000af8565b8683101562000b3f578489015162000b3b601f89168262000a2f565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b908262000919565b915062000b9d8362000919565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000bd95762000bd862000b54565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000c208262000919565b915062000c2d8362000919565b92508262000c405762000c3f62000be4565b5b828204905092915050565b600082825260208201905092915050565b7f43616c6c6572206973206e6f7420746865205f6665655265636569766572206160008201527f646472657373206e6f72206f776e65722e000000000000000000000000000000602082015250565b600062000cba60318362000c4b565b915062000cc78262000c5c565b604082019050919050565b6000602082019050818103600083015262000ced8162000cab565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000d2c601f8362000c4b565b915062000d398262000cf4565b602082019050919050565b6000602082019050818103600083015262000d5f8162000d1d565b9050919050565b600062000d738262000919565b915062000d808362000919565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000db85762000db762000b54565b5b828201905092915050565b62000dce8162000919565b82525050565b600060208201905062000deb600083018462000dc3565b92915050565b600062000dfe8262000919565b915062000e0b8362000919565b92508282101562000e215762000e2062000b54565b5b828203905092915050565b61462c8062000e3c6000396000f3fe6080604052600436106101c65760003560e01c806384826368116100f7578063c69bebe411610095578063df778d2611610064578063df778d261461064f578063f2fde38b14610666578063f8b45b051461068f578063fe575a87146106ba576101cd565b8063c69bebe414610593578063c8c8ebe4146105bc578063cef85139146105e7578063dd62ed3e14610612576101cd565b806395d89b41116100d157806395d89b41146104c5578063a457c2d7146104f0578063a9059cbb1461052d578063c02466681461056a576101cd565b806384826368146104345780638baa63b21461045d5780638da5cb5b1461049a576101cd565b80633dd5b2da1161016457806370a082311161013e57806370a08231146103a0578063715018a6146103dd578063751039fc146103f457806378dacee11461040b576101cd565b80633dd5b2da146103215780634a62bb65146103385780634fbee19314610363576101cd565b806323b872dd116101a057806323b872dd14610265578063293230b8146102a2578063313ce567146102b957806339509351146102e4576101cd565b806306fdde03146101d2578063095ea7b3146101fd57806318160ddd1461023a576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101e76106f7565b6040516101f49190613111565b60405180910390f35b34801561020957600080fd5b50610224600480360381019061021f91906131db565b610789565b6040516102319190613236565b60405180910390f35b34801561024657600080fd5b5061024f6107ac565b60405161025c9190613260565b60405180910390f35b34801561027157600080fd5b5061028c6004803603810190610287919061327b565b6107b6565b6040516102999190613236565b60405180910390f35b3480156102ae57600080fd5b506102b76107e5565b005b3480156102c557600080fd5b506102ce610c85565b6040516102db91906132ea565b60405180910390f35b3480156102f057600080fd5b5061030b600480360381019061030691906131db565b610c8e565b6040516103189190613236565b60405180910390f35b34801561032d57600080fd5b50610336610d38565b005b34801561034457600080fd5b5061034d610da3565b60405161035a9190613236565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613305565b610db6565b6040516103979190613236565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c29190613305565b610dd6565b6040516103d49190613260565b60405180910390f35b3480156103e957600080fd5b506103f2610e1e565b005b34801561040057600080fd5b50610409610ea6565b005b34801561041757600080fd5b50610432600480360381019061042d9190613332565b610f9e565b005b34801561044057600080fd5b5061045b600480360381019061045691906134d3565b61106a565b005b34801561046957600080fd5b50610484600480360381019061047f9190613332565b6112c0565b6040516104919190613236565b60405180910390f35b3480156104a657600080fd5b506104af611474565b6040516104bc919061353e565b60405180910390f35b3480156104d157600080fd5b506104da61149e565b6040516104e79190613111565b60405180910390f35b3480156104fc57600080fd5b50610517600480360381019061051291906131db565b611530565b6040516105249190613236565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f91906131db565b61161a565b6040516105619190613236565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190613559565b61163d565b005b34801561059f57600080fd5b506105ba60048036038101906105b59190613305565b611773565b005b3480156105c857600080fd5b506105d1611892565b6040516105de9190613260565b60405180910390f35b3480156105f357600080fd5b506105fc611898565b6040516106099190613260565b60405180910390f35b34801561061e57600080fd5b5061063960048036038101906106349190613599565b61189e565b6040516106469190613260565b60405180910390f35b34801561065b57600080fd5b50610664611925565b005b34801561067257600080fd5b5061068d60048036038101906106889190613305565b611a13565b005b34801561069b57600080fd5b506106a4611b0a565b6040516106b19190613260565b60405180910390f35b3480156106c657600080fd5b506106e160048036038101906106dc9190613305565b611b10565b6040516106ee9190613236565b60405180910390f35b60606003805461070690613608565b80601f016020809104026020016040519081016040528092919081815260200182805461073290613608565b801561077f5780601f106107545761010080835404028352916020019161077f565b820191906000526020600020905b81548152906001019060200180831161076257829003601f168201915b5050505050905090565b600080610794611b46565b90506107a1818585611b4e565b600191505092915050565b6000600254905090565b6000806107c1611b46565b90506107ce858285611d17565b6107d9858585611da3565b60019150509392505050565b6107ed611b46565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610881575061084b611b46565b73ffffffffffffffffffffffffffffffffffffffff16610869611474565b73ffffffffffffffffffffffffffffffffffffffff16145b6108c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b7906136ab565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561092d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095191906136e0565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fe91906136e0565b6040518363ffffffff1660e01b8152600401610a1b92919061370d565b6020604051808303816000875af1158015610a3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5e91906136e0565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160106000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610bc730600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610bc230610dd6565b611b4e565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7194730610c1030610dd6565b600080610c1b611474565b426040518863ffffffff1660e01b8152600401610c3d9695949392919061377b565b60606040518083038185885af1158015610c5b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c8091906137f1565b505050565b60006012905090565b600080610c99611b46565b9050610d2d818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d289190613873565b611b4e565b600191505092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610da0573d6000803e3d6000fd5b50565b600b60009054906101000a900460ff1681565b600f6020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e26611b46565b73ffffffffffffffffffffffffffffffffffffffff16610e44611474565b73ffffffffffffffffffffffffffffffffffffffff1614610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9190613915565b60405180910390fd5b610ea460006127f9565b565b610eae611b46565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610f425750610f0c611b46565b73ffffffffffffffffffffffffffffffffffffffff16610f2a611474565b73ffffffffffffffffffffffffffffffffffffffff16145b610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f78906136ab565b60405180910390fd5b6000600b60006101000a81548160ff021916908315150217905550565b610fa6611b46565b73ffffffffffffffffffffffffffffffffffffffff16610fc4611474565b73ffffffffffffffffffffffffffffffffffffffff161461101a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101190613915565b60405180910390fd5b80600c819055506006600c541115611067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105e90613981565b60405180910390fd5b50565b611072611b46565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061110657506110d0611b46565b73ffffffffffffffffffffffffffffffffffffffff166110ee611474565b73ffffffffffffffffffffffffffffffffffffffff16145b611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c906136ab565b60405180910390fd5b60005b82518110156112bb57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683828151811061119d5761119c6139a1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141580156112315750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168382815181106112105761120f6139a1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b156112a857816011600085848151811061124e5761124d6139a1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80806112b3906139d0565b915050611148565b505050565b60006112ca611b46565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061135e5750611328611b46565b73ffffffffffffffffffffffffffffffffffffffff16611346611474565b73ffffffffffffffffffffffffffffffffffffffff16145b61139d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611394906136ab565b60405180910390fd5b620186a060016113ab6107ac565b6113b59190613a18565b6113bf9190613aa1565b821015611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f890613b44565b60405180910390fd5b6103e8600561140e6107ac565b6114189190613a18565b6114229190613aa1565b821115611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90613bd6565b60405180910390fd5b81600a8190555060019050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546114ad90613608565b80601f01602080910402602001604051908101604052809291908181526020018280546114d990613608565b80156115265780601f106114fb57610100808354040283529160200191611526565b820191906000526020600020905b81548152906001019060200180831161150957829003601f168201915b5050505050905090565b60008061153b611b46565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f890613c68565b60405180910390fd5b61160e8286868403611b4e565b60019250505092915050565b600080611625611b46565b9050611632818585611da3565b600191505092915050565b611645611b46565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806116d957506116a3611b46565b73ffffffffffffffffffffffffffffffffffffffff166116c1611474565b73ffffffffffffffffffffffffffffffffffffffff16145b611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170f906136ab565b60405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61177b611b46565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061180f57506117d9611b46565b73ffffffffffffffffffffffffffffffffffffffff166117f7611474565b73ffffffffffffffffffffffffffffffffffffffff16145b61184e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611845906136ab565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60085481565b600a5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61192d611b46565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806119c1575061198b611b46565b73ffffffffffffffffffffffffffffffffffffffff166119a9611474565b73ffffffffffffffffffffffffffffffffffffffff16145b611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f7906136ab565b60405180910390fd5b611a11611a0c30610dd6565b6128bf565b565b611a1b611b46565b73ffffffffffffffffffffffffffffffffffffffff16611a39611474565b73ffffffffffffffffffffffffffffffffffffffff1614611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8690613915565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af590613cfa565b60405180910390fd5b611b07816127f9565b50565b60095481565b60116020528060005260406000206000915054906101000a900460ff1681565b60008183611b3e9190613d1a565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490613dc0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2390613e52565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d0a9190613260565b60405180910390a3505050565b6000611d23848461189e565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611d9d5781811015611d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8690613ebe565b60405180910390fd5b611d9c8484848403611b4e565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0990613f50565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7890613fe2565b60405180910390fd5b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0590614074565b60405180910390fd5b60008103611f2757611f2283836000612b02565b6127f4565b600b60009054906101000a900460ff161561247e57611f44611474565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611fb25750611f82611474565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611fcb5750600b60019054906101000a900460ff16155b1561247d57611fd8611474565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156120615750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156120bb5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156121865743601360003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612141576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121389061412c565b60405180910390fd5b43601360003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156122295750601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156122d757600854811115612273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226a906141e4565b60405180910390fd5b60095461229161228284610dd6565b83612d8190919063ffffffff16565b11156122d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c990614250565b60405180910390fd5b61247c565b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561237a5750601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156123c9576008548111156123c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bb90614308565b60405180910390fd5b61247b565b601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661247a5760095461243861242984610dd6565b83612d8190919063ffffffff16565b1115612479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247090614250565b60405180910390fd5b5b5b5b5b5b600061248930610dd6565b90506000600a5482101590508080156124af5750600b60019054906101000a900460ff16155b80156125055750601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561255b5750600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156125b15750600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156125f5576001600b60016101000a81548160ff0219169083151502179055506125d9612d97565b6000600b60016101000a81548160ff0219169083151502179055505b6000600b60019054906101000a900460ff16159050600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806126ab5750600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806127565750601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156127555750601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b1561276057600090505b600081156127e4576127906064612782600c5488612f4290919063ffffffff16565b612f5890919063ffffffff16565b90506127ba60646127ac600c5488612f4290919063ffffffff16565b612f5890919063ffffffff16565b600d8190555060008111156127d5576127d4873083612b02565b5b80856127e19190613d1a565b94505b6127ef878787612b02565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600267ffffffffffffffff8111156128dc576128db613364565b5b60405190808252806020026020018201604052801561290a5781602001602082028036833780820191505090505b5090503081600081518110612922576129216139a1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ed91906136e0565b81600181518110612a0157612a006139a1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a6830600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611b4e565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612acc9594939291906143e6565b600060405180830381600087803b158015612ae657600080fd5b505af1158015612afa573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b68906144b2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd790614544565b60405180910390fd5b612beb838383612f6e565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c68906145d6565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d049190613873565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612d689190613260565b60405180910390a3612d7b848484612f73565b50505050565b60008183612d8f9190613873565b905092915050565b6000612da230610dd6565b90506000612dbc6004600d54612f5890919063ffffffff16565b90506000612dd582600d54611b3090919063ffffffff16565b90506000831480612de857506000600d54145b15612df557505050612f40565b600a54831115612e0557600a5492505b60006002600d548486612e189190613a18565b612e229190613aa1565b612e2c9190613aa1565b90506000612e438286611b3090919063ffffffff16565b90506000479050612e53826128bf565b6000612e688247611b3090919063ffffffff16565b90506000612e93600d54612e858885612f4290919063ffffffff16565b612f5890919063ffffffff16565b905060008183612ea39190613d1a565b90506000600d81905550600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612f15573d6000803e3d6000fd5b50600086118015612f265750600081115b15612f3657612f358682612f78565b5b5050505050505050505b565b60008183612f509190613a18565b905092915050565b60008183612f669190613aa1565b905092915050565b505050565b505050565b612fa530600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611b4e565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161302e9695949392919061377b565b60606040518083038185885af115801561304c573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061307191906137f1565b5050505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130b2578082015181840152602081019050613097565b838111156130c1576000848401525b50505050565b6000601f19601f8301169050919050565b60006130e382613078565b6130ed8185613083565b93506130fd818560208601613094565b613106816130c7565b840191505092915050565b6000602082019050818103600083015261312b81846130d8565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061317282613147565b9050919050565b61318281613167565b811461318d57600080fd5b50565b60008135905061319f81613179565b92915050565b6000819050919050565b6131b8816131a5565b81146131c357600080fd5b50565b6000813590506131d5816131af565b92915050565b600080604083850312156131f2576131f161313d565b5b600061320085828601613190565b9250506020613211858286016131c6565b9150509250929050565b60008115159050919050565b6132308161321b565b82525050565b600060208201905061324b6000830184613227565b92915050565b61325a816131a5565b82525050565b60006020820190506132756000830184613251565b92915050565b6000806000606084860312156132945761329361313d565b5b60006132a286828701613190565b93505060206132b386828701613190565b92505060406132c4868287016131c6565b9150509250925092565b600060ff82169050919050565b6132e4816132ce565b82525050565b60006020820190506132ff60008301846132db565b92915050565b60006020828403121561331b5761331a61313d565b5b600061332984828501613190565b91505092915050565b6000602082840312156133485761334761313d565b5b6000613356848285016131c6565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61339c826130c7565b810181811067ffffffffffffffff821117156133bb576133ba613364565b5b80604052505050565b60006133ce613133565b90506133da8282613393565b919050565b600067ffffffffffffffff8211156133fa576133f9613364565b5b602082029050602081019050919050565b600080fd5b600061342361341e846133df565b6133c4565b905080838252602082019050602084028301858111156134465761344561340b565b5b835b8181101561346f578061345b8882613190565b845260208401935050602081019050613448565b5050509392505050565b600082601f83011261348e5761348d61335f565b5b813561349e848260208601613410565b91505092915050565b6134b08161321b565b81146134bb57600080fd5b50565b6000813590506134cd816134a7565b92915050565b600080604083850312156134ea576134e961313d565b5b600083013567ffffffffffffffff81111561350857613507613142565b5b61351485828601613479565b9250506020613525858286016134be565b9150509250929050565b61353881613167565b82525050565b6000602082019050613553600083018461352f565b92915050565b600080604083850312156135705761356f61313d565b5b600061357e85828601613190565b925050602061358f858286016134be565b9150509250929050565b600080604083850312156135b0576135af61313d565b5b60006135be85828601613190565b92505060206135cf85828601613190565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061362057607f821691505b602082108103613633576136326135d9565b5b50919050565b7f43616c6c6572206973206e6f7420746865205f6665655265636569766572206160008201527f646472657373206e6f72206f776e65722e000000000000000000000000000000602082015250565b6000613695603183613083565b91506136a082613639565b604082019050919050565b600060208201905081810360008301526136c481613688565b9050919050565b6000815190506136da81613179565b92915050565b6000602082840312156136f6576136f561313d565b5b6000613704848285016136cb565b91505092915050565b6000604082019050613722600083018561352f565b61372f602083018461352f565b9392505050565b6000819050919050565b6000819050919050565b600061376561376061375b84613736565b613740565b6131a5565b9050919050565b6137758161374a565b82525050565b600060c082019050613790600083018961352f565b61379d6020830188613251565b6137aa604083018761376c565b6137b7606083018661376c565b6137c4608083018561352f565b6137d160a0830184613251565b979650505050505050565b6000815190506137eb816131af565b92915050565b60008060006060848603121561380a5761380961313d565b5b6000613818868287016137dc565b9350506020613829868287016137dc565b925050604061383a868287016137dc565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061387e826131a5565b9150613889836131a5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138be576138bd613844565b5b828201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006138ff602083613083565b915061390a826138c9565b602082019050919050565b6000602082019050818103600083015261392e816138f2565b9050919050565b7f4d757374206b6565702066656573206174203625206f72206c65737300000000600082015250565b600061396b601c83613083565b915061397682613935565b602082019050919050565b6000602082019050818103600083015261399a8161395e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006139db826131a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a0d57613a0c613844565b5b600182019050919050565b6000613a23826131a5565b9150613a2e836131a5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a6757613a66613844565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613aac826131a5565b9150613ab7836131a5565b925082613ac757613ac6613a72565b5b828204905092915050565b7f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460008201527f68616e20302e3030312520746f74616c20737570706c792e0000000000000000602082015250565b6000613b2e603883613083565b9150613b3982613ad2565b604082019050919050565b60006020820190508181036000830152613b5d81613b21565b9050919050565b7f53776170207468726573686f6c642063616e6e6f74206265206869676865722060008201527f7468616e20302e352520746f74616c20737570706c792e000000000000000000602082015250565b6000613bc0603783613083565b9150613bcb82613b64565b604082019050919050565b60006020820190508181036000830152613bef81613bb3565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613c52602583613083565b9150613c5d82613bf6565b604082019050919050565b60006020820190508181036000830152613c8181613c45565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ce4602683613083565b9150613cef82613c88565b604082019050919050565b60006020820190508181036000830152613d1381613cd7565b9050919050565b6000613d25826131a5565b9150613d30836131a5565b925082821015613d4357613d42613844565b5b828203905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613daa602483613083565b9150613db582613d4e565b604082019050919050565b60006020820190508181036000830152613dd981613d9d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e3c602283613083565b9150613e4782613de0565b604082019050919050565b60006020820190508181036000830152613e6b81613e2f565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613ea8601d83613083565b9150613eb382613e72565b602082019050919050565b60006020820190508181036000830152613ed781613e9b565b9050919050565b7f5f7472616e736665723a3a205472616e736665722066726f6d20746865207a6560008201527f726f2061646472657373206e6f7420616c6c6f7765642e000000000000000000602082015250565b6000613f3a603783613083565b9150613f4582613ede565b604082019050919050565b60006020820190508181036000830152613f6981613f2d565b9050919050565b7f5f7472616e736665723a3a205472616e7366657220746f20746865207a65726f60008201527f2061646472657373206e6f7420616c6c6f7765642e0000000000000000000000602082015250565b6000613fcc603583613083565b9150613fd782613f70565b604082019050919050565b60006020820190508181036000830152613ffb81613fbf565b9050919050565b7f5f7472616e736665723a3a20596f75722061646472657373206861732062656560008201527f6e206d61726b656420617320626c61636b6c69737465642e0000000000000000602082015250565b600061405e603883613083565b915061406982614002565b604082019050919050565b6000602082019050818103600083015261408d81614051565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b6000614116604983613083565b915061412182614094565b606082019050919050565b6000602082019050818103600083015261414581614109565b9050919050565b7f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060008201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e7460208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b60006141ce604183613083565b91506141d98261414c565b606082019050919050565b600060208201905081810360008301526141fd816141c1565b9050919050565b7f5f7472616e736665723a3a204d61782077616c6c657420657863656564656400600082015250565b600061423a601f83613083565b915061424582614204565b602082019050919050565b600060208201905081810360008301526142698161422d565b9050919050565b7f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460008201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e60208201527f742e000000000000000000000000000000000000000000000000000000000000604082015250565b60006142f2604283613083565b91506142fd82614270565b606082019050919050565b60006020820190508181036000830152614321816142e5565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61435d81613167565b82525050565b600061436f8383614354565b60208301905092915050565b6000602082019050919050565b600061439382614328565b61439d8185614333565b93506143a883614344565b8060005b838110156143d95781516143c08882614363565b97506143cb8361437b565b9250506001810190506143ac565b5085935050505092915050565b600060a0820190506143fb6000830188613251565b614408602083018761376c565b818103604083015261441a8186614388565b9050614429606083018561352f565b6144366080830184613251565b9695505050505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061449c602583613083565b91506144a782614440565b604082019050919050565b600060208201905081810360008301526144cb8161448f565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061452e602383613083565b9150614539826144d2565b604082019050919050565b6000602082019050818103600083015261455d81614521565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006145c0602683613083565b91506145cb82614564565b604082019050919050565b600060208201905081810360008301526145ef816145b3565b905091905056fea264697066735822122028bcbf3e3455db63570d124824abbee5cc90bc95ebd1490f21e8a708b10f8cc864736f6c634300080f0033
60806040526001600b60006101000a81548160ff0219169083151502179055506006600c556040518060400160405280600781526020017f54686520424554000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f42455400000000000000000000000000000000000000000000000000000000008152508160039081620000a1919062000a6d565b508060049081620000b3919062000a6d565b505050620000d6620000ca6200040f60201b60201c565b6200041760201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006a084595161401484a000000905060006a05606db4c03408968000009050620186a061014583620001bc919062000b83565b620001c8919062000c13565b600881905550612710604183620001e0919062000b83565b620001ec919062000c13565b6009819055506103e860018362000204919062000b83565b62000210919062000c13565b600a8190555062000226620004dd60201b60201c565b600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002886200027a620004dd60201b60201c565b60016200050760201b60201c565b6200029b3060016200050760201b60201c565b620002b061dead60016200050760201b60201c565b600160106000620002c6620004dd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016010600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003db30826200065960201b60201c565b6200040633620003fa8385620007d160201b62001b301790919060201c565b6200065960201b60201c565b50505062000e2c565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620005176200040f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480620005bc57506200057e6200040f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005a4620004dd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16145b620005fe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005f59062000cd2565b60405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620006cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006c29062000d44565b60405180910390fd5b620006df60008383620007e960201b60201c565b8060026000828254620006f3919062000d66565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200074a919062000d66565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620007b1919062000dd4565b60405180910390a3620007cd60008383620007ee60201b60201c565b5050565b60008183620007e1919062000df1565b905092915050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200087557607f821691505b6020821081036200088b576200088a6200082d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008f57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620008b6565b620009018683620008b6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200094e62000948620009428462000919565b62000923565b62000919565b9050919050565b6000819050919050565b6200096a836200092d565b62000982620009798262000955565b848454620008c3565b825550505050565b600090565b620009996200098a565b620009a68184846200095f565b505050565b5b81811015620009ce57620009c26000826200098f565b600181019050620009ac565b5050565b601f82111562000a1d57620009e78162000891565b620009f284620008a6565b8101602085101562000a02578190505b62000a1a62000a1185620008a6565b830182620009ab565b50505b505050565b600082821c905092915050565b600062000a426000198460080262000a22565b1980831691505092915050565b600062000a5d838362000a2f565b9150826002028217905092915050565b62000a7882620007f3565b67ffffffffffffffff81111562000a945762000a93620007fe565b5b62000aa082546200085c565b62000aad828285620009d2565b600060209050601f83116001811462000ae5576000841562000ad0578287015190505b62000adc858262000a4f565b86555062000b4c565b601f19841662000af58662000891565b60005b8281101562000b1f5784890151825560018201915060208501945060208101905062000af8565b8683101562000b3f578489015162000b3b601f89168262000a2f565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b908262000919565b915062000b9d8362000919565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000bd95762000bd862000b54565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000c208262000919565b915062000c2d8362000919565b92508262000c405762000c3f62000be4565b5b828204905092915050565b600082825260208201905092915050565b7f43616c6c6572206973206e6f7420746865205f6665655265636569766572206160008201527f646472657373206e6f72206f776e65722e000000000000000000000000000000602082015250565b600062000cba60318362000c4b565b915062000cc78262000c5c565b604082019050919050565b6000602082019050818103600083015262000ced8162000cab565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000d2c601f8362000c4b565b915062000d398262000cf4565b602082019050919050565b6000602082019050818103600083015262000d5f8162000d1d565b9050919050565b600062000d738262000919565b915062000d808362000919565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000db85762000db762000b54565b5b828201905092915050565b62000dce8162000919565b82525050565b600060208201905062000deb600083018462000dc3565b92915050565b600062000dfe8262000919565b915062000e0b8362000919565b92508282101562000e215762000e2062000b54565b5b828203905092915050565b61462c8062000e3c6000396000f3fe6080604052600436106101c65760003560e01c806384826368116100f7578063c69bebe411610095578063df778d2611610064578063df778d261461064f578063f2fde38b14610666578063f8b45b051461068f578063fe575a87146106ba576101cd565b8063c69bebe414610593578063c8c8ebe4146105bc578063cef85139146105e7578063dd62ed3e14610612576101cd565b806395d89b41116100d157806395d89b41146104c5578063a457c2d7146104f0578063a9059cbb1461052d578063c02466681461056a576101cd565b806384826368146104345780638baa63b21461045d5780638da5cb5b1461049a576101cd565b80633dd5b2da1161016457806370a082311161013e57806370a08231146103a0578063715018a6146103dd578063751039fc146103f457806378dacee11461040b576101cd565b80633dd5b2da146103215780634a62bb65146103385780634fbee19314610363576101cd565b806323b872dd116101a057806323b872dd14610265578063293230b8146102a2578063313ce567146102b957806339509351146102e4576101cd565b806306fdde03146101d2578063095ea7b3146101fd57806318160ddd1461023a576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101e76106f7565b6040516101f49190613111565b60405180910390f35b34801561020957600080fd5b50610224600480360381019061021f91906131db565b610789565b6040516102319190613236565b60405180910390f35b34801561024657600080fd5b5061024f6107ac565b60405161025c9190613260565b60405180910390f35b34801561027157600080fd5b5061028c6004803603810190610287919061327b565b6107b6565b6040516102999190613236565b60405180910390f35b3480156102ae57600080fd5b506102b76107e5565b005b3480156102c557600080fd5b506102ce610c85565b6040516102db91906132ea565b60405180910390f35b3480156102f057600080fd5b5061030b600480360381019061030691906131db565b610c8e565b6040516103189190613236565b60405180910390f35b34801561032d57600080fd5b50610336610d38565b005b34801561034457600080fd5b5061034d610da3565b60405161035a9190613236565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613305565b610db6565b6040516103979190613236565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c29190613305565b610dd6565b6040516103d49190613260565b60405180910390f35b3480156103e957600080fd5b506103f2610e1e565b005b34801561040057600080fd5b50610409610ea6565b005b34801561041757600080fd5b50610432600480360381019061042d9190613332565b610f9e565b005b34801561044057600080fd5b5061045b600480360381019061045691906134d3565b61106a565b005b34801561046957600080fd5b50610484600480360381019061047f9190613332565b6112c0565b6040516104919190613236565b60405180910390f35b3480156104a657600080fd5b506104af611474565b6040516104bc919061353e565b60405180910390f35b3480156104d157600080fd5b506104da61149e565b6040516104e79190613111565b60405180910390f35b3480156104fc57600080fd5b50610517600480360381019061051291906131db565b611530565b6040516105249190613236565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f91906131db565b61161a565b6040516105619190613236565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c9190613559565b61163d565b005b34801561059f57600080fd5b506105ba60048036038101906105b59190613305565b611773565b005b3480156105c857600080fd5b506105d1611892565b6040516105de9190613260565b60405180910390f35b3480156105f357600080fd5b506105fc611898565b6040516106099190613260565b60405180910390f35b34801561061e57600080fd5b5061063960048036038101906106349190613599565b61189e565b6040516106469190613260565b60405180910390f35b34801561065b57600080fd5b50610664611925565b005b34801561067257600080fd5b5061068d60048036038101906106889190613305565b611a13565b005b34801561069b57600080fd5b506106a4611b0a565b6040516106b19190613260565b60405180910390f35b3480156106c657600080fd5b506106e160048036038101906106dc9190613305565b611b10565b6040516106ee9190613236565b60405180910390f35b60606003805461070690613608565b80601f016020809104026020016040519081016040528092919081815260200182805461073290613608565b801561077f5780601f106107545761010080835404028352916020019161077f565b820191906000526020600020905b81548152906001019060200180831161076257829003601f168201915b5050505050905090565b600080610794611b46565b90506107a1818585611b4e565b600191505092915050565b6000600254905090565b6000806107c1611b46565b90506107ce858285611d17565b6107d9858585611da3565b60019150509392505050565b6107ed611b46565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610881575061084b611b46565b73ffffffffffffffffffffffffffffffffffffffff16610869611474565b73ffffffffffffffffffffffffffffffffffffffff16145b6108c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b7906136ab565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561092d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095191906136e0565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fe91906136e0565b6040518363ffffffff1660e01b8152600401610a1b92919061370d565b6020604051808303816000875af1158015610a3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5e91906136e0565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160106000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610bc730600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610bc230610dd6565b611b4e565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7194730610c1030610dd6565b600080610c1b611474565b426040518863ffffffff1660e01b8152600401610c3d9695949392919061377b565b60606040518083038185885af1158015610c5b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c8091906137f1565b505050565b60006012905090565b600080610c99611b46565b9050610d2d818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d289190613873565b611b4e565b600191505092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610da0573d6000803e3d6000fd5b50565b600b60009054906101000a900460ff1681565b600f6020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e26611b46565b73ffffffffffffffffffffffffffffffffffffffff16610e44611474565b73ffffffffffffffffffffffffffffffffffffffff1614610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9190613915565b60405180910390fd5b610ea460006127f9565b565b610eae611b46565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610f425750610f0c611b46565b73ffffffffffffffffffffffffffffffffffffffff16610f2a611474565b73ffffffffffffffffffffffffffffffffffffffff16145b610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f78906136ab565b60405180910390fd5b6000600b60006101000a81548160ff021916908315150217905550565b610fa6611b46565b73ffffffffffffffffffffffffffffffffffffffff16610fc4611474565b73ffffffffffffffffffffffffffffffffffffffff161461101a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101190613915565b60405180910390fd5b80600c819055506006600c541115611067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105e90613981565b60405180910390fd5b50565b611072611b46565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061110657506110d0611b46565b73ffffffffffffffffffffffffffffffffffffffff166110ee611474565b73ffffffffffffffffffffffffffffffffffffffff16145b611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c906136ab565b60405180910390fd5b60005b82518110156112bb57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683828151811061119d5761119c6139a1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141580156112315750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168382815181106112105761120f6139a1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b156112a857816011600085848151811061124e5761124d6139a1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80806112b3906139d0565b915050611148565b505050565b60006112ca611b46565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061135e5750611328611b46565b73ffffffffffffffffffffffffffffffffffffffff16611346611474565b73ffffffffffffffffffffffffffffffffffffffff16145b61139d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611394906136ab565b60405180910390fd5b620186a060016113ab6107ac565b6113b59190613a18565b6113bf9190613aa1565b821015611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f890613b44565b60405180910390fd5b6103e8600561140e6107ac565b6114189190613a18565b6114229190613aa1565b821115611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90613bd6565b60405180910390fd5b81600a8190555060019050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546114ad90613608565b80601f01602080910402602001604051908101604052809291908181526020018280546114d990613608565b80156115265780601f106114fb57610100808354040283529160200191611526565b820191906000526020600020905b81548152906001019060200180831161150957829003601f168201915b5050505050905090565b60008061153b611b46565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f890613c68565b60405180910390fd5b61160e8286868403611b4e565b60019250505092915050565b600080611625611b46565b9050611632818585611da3565b600191505092915050565b611645611b46565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806116d957506116a3611b46565b73ffffffffffffffffffffffffffffffffffffffff166116c1611474565b73ffffffffffffffffffffffffffffffffffffffff16145b611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170f906136ab565b60405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61177b611b46565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061180f57506117d9611b46565b73ffffffffffffffffffffffffffffffffffffffff166117f7611474565b73ffffffffffffffffffffffffffffffffffffffff16145b61184e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611845906136ab565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60085481565b600a5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61192d611b46565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806119c1575061198b611b46565b73ffffffffffffffffffffffffffffffffffffffff166119a9611474565b73ffffffffffffffffffffffffffffffffffffffff16145b611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f7906136ab565b60405180910390fd5b611a11611a0c30610dd6565b6128bf565b565b611a1b611b46565b73ffffffffffffffffffffffffffffffffffffffff16611a39611474565b73ffffffffffffffffffffffffffffffffffffffff1614611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8690613915565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af590613cfa565b60405180910390fd5b611b07816127f9565b50565b60095481565b60116020528060005260406000206000915054906101000a900460ff1681565b60008183611b3e9190613d1a565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490613dc0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2390613e52565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d0a9190613260565b60405180910390a3505050565b6000611d23848461189e565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611d9d5781811015611d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8690613ebe565b60405180910390fd5b611d9c8484848403611b4e565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0990613f50565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7890613fe2565b60405180910390fd5b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0590614074565b60405180910390fd5b60008103611f2757611f2283836000612b02565b6127f4565b600b60009054906101000a900460ff161561247e57611f44611474565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611fb25750611f82611474565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611fcb5750600b60019054906101000a900460ff16155b1561247d57611fd8611474565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156120615750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156120bb5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156121865743601360003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612141576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121389061412c565b60405180910390fd5b43601360003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156122295750601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156122d757600854811115612273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226a906141e4565b60405180910390fd5b60095461229161228284610dd6565b83612d8190919063ffffffff16565b11156122d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c990614250565b60405180910390fd5b61247c565b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561237a5750601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156123c9576008548111156123c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bb90614308565b60405180910390fd5b61247b565b601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661247a5760095461243861242984610dd6565b83612d8190919063ffffffff16565b1115612479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247090614250565b60405180910390fd5b5b5b5b5b5b600061248930610dd6565b90506000600a5482101590508080156124af5750600b60019054906101000a900460ff16155b80156125055750601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561255b5750600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156125b15750600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156125f5576001600b60016101000a81548160ff0219169083151502179055506125d9612d97565b6000600b60016101000a81548160ff0219169083151502179055505b6000600b60019054906101000a900460ff16159050600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806126ab5750600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806127565750601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156127555750601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b1561276057600090505b600081156127e4576127906064612782600c5488612f4290919063ffffffff16565b612f5890919063ffffffff16565b90506127ba60646127ac600c5488612f4290919063ffffffff16565b612f5890919063ffffffff16565b600d8190555060008111156127d5576127d4873083612b02565b5b80856127e19190613d1a565b94505b6127ef878787612b02565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600267ffffffffffffffff8111156128dc576128db613364565b5b60405190808252806020026020018201604052801561290a5781602001602082028036833780820191505090505b5090503081600081518110612922576129216139a1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ed91906136e0565b81600181518110612a0157612a006139a1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a6830600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611b4e565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612acc9594939291906143e6565b600060405180830381600087803b158015612ae657600080fd5b505af1158015612afa573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b68906144b2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd790614544565b60405180910390fd5b612beb838383612f6e565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c68906145d6565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d049190613873565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612d689190613260565b60405180910390a3612d7b848484612f73565b50505050565b60008183612d8f9190613873565b905092915050565b6000612da230610dd6565b90506000612dbc6004600d54612f5890919063ffffffff16565b90506000612dd582600d54611b3090919063ffffffff16565b90506000831480612de857506000600d54145b15612df557505050612f40565b600a54831115612e0557600a5492505b60006002600d548486612e189190613a18565b612e229190613aa1565b612e2c9190613aa1565b90506000612e438286611b3090919063ffffffff16565b90506000479050612e53826128bf565b6000612e688247611b3090919063ffffffff16565b90506000612e93600d54612e858885612f4290919063ffffffff16565b612f5890919063ffffffff16565b905060008183612ea39190613d1a565b90506000600d81905550600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612f15573d6000803e3d6000fd5b50600086118015612f265750600081115b15612f3657612f358682612f78565b5b5050505050505050505b565b60008183612f509190613a18565b905092915050565b60008183612f669190613aa1565b905092915050565b505050565b505050565b612fa530600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611b4e565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161302e9695949392919061377b565b60606040518083038185885af115801561304c573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061307191906137f1565b5050505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130b2578082015181840152602081019050613097565b838111156130c1576000848401525b50505050565b6000601f19601f8301169050919050565b60006130e382613078565b6130ed8185613083565b93506130fd818560208601613094565b613106816130c7565b840191505092915050565b6000602082019050818103600083015261312b81846130d8565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061317282613147565b9050919050565b61318281613167565b811461318d57600080fd5b50565b60008135905061319f81613179565b92915050565b6000819050919050565b6131b8816131a5565b81146131c357600080fd5b50565b6000813590506131d5816131af565b92915050565b600080604083850312156131f2576131f161313d565b5b600061320085828601613190565b9250506020613211858286016131c6565b9150509250929050565b60008115159050919050565b6132308161321b565b82525050565b600060208201905061324b6000830184613227565b92915050565b61325a816131a5565b82525050565b60006020820190506132756000830184613251565b92915050565b6000806000606084860312156132945761329361313d565b5b60006132a286828701613190565b93505060206132b386828701613190565b92505060406132c4868287016131c6565b9150509250925092565b600060ff82169050919050565b6132e4816132ce565b82525050565b60006020820190506132ff60008301846132db565b92915050565b60006020828403121561331b5761331a61313d565b5b600061332984828501613190565b91505092915050565b6000602082840312156133485761334761313d565b5b6000613356848285016131c6565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61339c826130c7565b810181811067ffffffffffffffff821117156133bb576133ba613364565b5b80604052505050565b60006133ce613133565b90506133da8282613393565b919050565b600067ffffffffffffffff8211156133fa576133f9613364565b5b602082029050602081019050919050565b600080fd5b600061342361341e846133df565b6133c4565b905080838252602082019050602084028301858111156134465761344561340b565b5b835b8181101561346f578061345b8882613190565b845260208401935050602081019050613448565b5050509392505050565b600082601f83011261348e5761348d61335f565b5b813561349e848260208601613410565b91505092915050565b6134b08161321b565b81146134bb57600080fd5b50565b6000813590506134cd816134a7565b92915050565b600080604083850312156134ea576134e961313d565b5b600083013567ffffffffffffffff81111561350857613507613142565b5b61351485828601613479565b9250506020613525858286016134be565b9150509250929050565b61353881613167565b82525050565b6000602082019050613553600083018461352f565b92915050565b600080604083850312156135705761356f61313d565b5b600061357e85828601613190565b925050602061358f858286016134be565b9150509250929050565b600080604083850312156135b0576135af61313d565b5b60006135be85828601613190565b92505060206135cf85828601613190565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061362057607f821691505b602082108103613633576136326135d9565b5b50919050565b7f43616c6c6572206973206e6f7420746865205f6665655265636569766572206160008201527f646472657373206e6f72206f776e65722e000000000000000000000000000000602082015250565b6000613695603183613083565b91506136a082613639565b604082019050919050565b600060208201905081810360008301526136c481613688565b9050919050565b6000815190506136da81613179565b92915050565b6000602082840312156136f6576136f561313d565b5b6000613704848285016136cb565b91505092915050565b6000604082019050613722600083018561352f565b61372f602083018461352f565b9392505050565b6000819050919050565b6000819050919050565b600061376561376061375b84613736565b613740565b6131a5565b9050919050565b6137758161374a565b82525050565b600060c082019050613790600083018961352f565b61379d6020830188613251565b6137aa604083018761376c565b6137b7606083018661376c565b6137c4608083018561352f565b6137d160a0830184613251565b979650505050505050565b6000815190506137eb816131af565b92915050565b60008060006060848603121561380a5761380961313d565b5b6000613818868287016137dc565b9350506020613829868287016137dc565b925050604061383a868287016137dc565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061387e826131a5565b9150613889836131a5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138be576138bd613844565b5b828201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006138ff602083613083565b915061390a826138c9565b602082019050919050565b6000602082019050818103600083015261392e816138f2565b9050919050565b7f4d757374206b6565702066656573206174203625206f72206c65737300000000600082015250565b600061396b601c83613083565b915061397682613935565b602082019050919050565b6000602082019050818103600083015261399a8161395e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006139db826131a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a0d57613a0c613844565b5b600182019050919050565b6000613a23826131a5565b9150613a2e836131a5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a6757613a66613844565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613aac826131a5565b9150613ab7836131a5565b925082613ac757613ac6613a72565b5b828204905092915050565b7f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460008201527f68616e20302e3030312520746f74616c20737570706c792e0000000000000000602082015250565b6000613b2e603883613083565b9150613b3982613ad2565b604082019050919050565b60006020820190508181036000830152613b5d81613b21565b9050919050565b7f53776170207468726573686f6c642063616e6e6f74206265206869676865722060008201527f7468616e20302e352520746f74616c20737570706c792e000000000000000000602082015250565b6000613bc0603783613083565b9150613bcb82613b64565b604082019050919050565b60006020820190508181036000830152613bef81613bb3565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613c52602583613083565b9150613c5d82613bf6565b604082019050919050565b60006020820190508181036000830152613c8181613c45565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ce4602683613083565b9150613cef82613c88565b604082019050919050565b60006020820190508181036000830152613d1381613cd7565b9050919050565b6000613d25826131a5565b9150613d30836131a5565b925082821015613d4357613d42613844565b5b828203905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613daa602483613083565b9150613db582613d4e565b604082019050919050565b60006020820190508181036000830152613dd981613d9d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e3c602283613083565b9150613e4782613de0565b604082019050919050565b60006020820190508181036000830152613e6b81613e2f565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613ea8601d83613083565b9150613eb382613e72565b602082019050919050565b60006020820190508181036000830152613ed781613e9b565b9050919050565b7f5f7472616e736665723a3a205472616e736665722066726f6d20746865207a6560008201527f726f2061646472657373206e6f7420616c6c6f7765642e000000000000000000602082015250565b6000613f3a603783613083565b9150613f4582613ede565b604082019050919050565b60006020820190508181036000830152613f6981613f2d565b9050919050565b7f5f7472616e736665723a3a205472616e7366657220746f20746865207a65726f60008201527f2061646472657373206e6f7420616c6c6f7765642e0000000000000000000000602082015250565b6000613fcc603583613083565b9150613fd782613f70565b604082019050919050565b60006020820190508181036000830152613ffb81613fbf565b9050919050565b7f5f7472616e736665723a3a20596f75722061646472657373206861732062656560008201527f6e206d61726b656420617320626c61636b6c69737465642e0000000000000000602082015250565b600061405e603883613083565b915061406982614002565b604082019050919050565b6000602082019050818103600083015261408d81614051565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b6000614116604983613083565b915061412182614094565b606082019050919050565b6000602082019050818103600083015261414581614109565b9050919050565b7f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060008201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e7460208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b60006141ce604183613083565b91506141d98261414c565b606082019050919050565b600060208201905081810360008301526141fd816141c1565b9050919050565b7f5f7472616e736665723a3a204d61782077616c6c657420657863656564656400600082015250565b600061423a601f83613083565b915061424582614204565b602082019050919050565b600060208201905081810360008301526142698161422d565b9050919050565b7f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460008201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e60208201527f742e000000000000000000000000000000000000000000000000000000000000604082015250565b60006142f2604283613083565b91506142fd82614270565b606082019050919050565b60006020820190508181036000830152614321816142e5565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61435d81613167565b82525050565b600061436f8383614354565b60208301905092915050565b6000602082019050919050565b600061439382614328565b61439d8185614333565b93506143a883614344565b8060005b838110156143d95781516143c08882614363565b97506143cb8361437b565b9250506001810190506143ac565b5085935050505092915050565b600060a0820190506143fb6000830188613251565b614408602083018761376c565b818103604083015261441a8186614388565b9050614429606083018561352f565b6144366080830184613251565b9695505050505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061449c602583613083565b91506144a782614440565b604082019050919050565b600060208201905081810360008301526144cb8161448f565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061452e602383613083565b9150614539826144d2565b604082019050919050565b6000602082019050818103600083015261455d81614521565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006145c0602683613083565b91506145cb82614564565b604082019050919050565b600060208201905081810360008301526145ef816145b3565b905091905056fea264697066735822122028bcbf3e3455db63570d124824abbee5cc90bc95ebd1490f21e8a708b10f8cc864736f6c634300080f0033

Check out more smart contracts

Build blockchain magic with Alchemy

Alchemy combines the most powerful web3 developer products and tools with resources, community and legendary support.