ETH Price: $3,392.26 (-1.46%)
Gas: 2 Gwei

Token

Bang Bang Bang (BBB)
 

Overview

Max Total Supply

9,997,667.26 BBB

Holders

374

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Filtered by Token Holder
domocoma.eth
Balance
1,000 BBB

Value
$0.00
0x680e8a5a1dc9499342a7bc0bfb3b99dff60ec1f9
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BangBangBang

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-25
*/

/*
   Bang Bang Bang - Play Russian Roulette directly in Discord

   Twitter/X: https://twitter.com/BangERC20
   Discord:    https://discord.gg/xUhxuzumE2
   Telegram  https://t.me/BBBPortal

*/
// SPDX-License-Identifier: MIT

pragma solidity 0.8.21;

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract BangBangBang is Ownable, ERC20 {

    IUniswapV2Router02 public router;
    IUniswapV2Factory public factory;
    IUniswapV2Pair public pair;

    uint private constant INITIAL_SUPPLY = 10_000_000 * 10**8;

    // Percent of the initial supply that will go to the LP
    uint constant LP_BPS = 9000;

    // Percent of the initial supply that will go to marketing
    uint constant MARKETING_BPS = 10_000 - LP_BPS;

    //
    // The tax to deduct, in basis points
    //
    uint public buyTaxBps = 500;
    uint public sellTaxBps = 500;
    //
    bool isSellingCollectedTaxes;

    event AntiBotEngaged();
    event AntiBotDisengaged();
    event StealthLaunchEngaged();

    address public rouletteContract;

    bool public isLaunched;

    address public myWallet;
    address public marketingWallet;
    address public revenueWallet;

    bool public engagedOnce;
    bool public disengagedOnce;

    constructor() ERC20("Bang Bang Bang", "BBB", 8) {
        if (isGoerli()) {
            router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        } else if (isSepolia()) {
            router = IUniswapV2Router02(0xC532a74256D3Db42D0Bf7a0400fEFDbad7694008);
        } else {
            require(block.chainid == 1, "expected mainnet");
            router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        }
        factory = IUniswapV2Factory(router.factory());

        // Approve infinite spending by DEX, to sell tokens collected via tax.
        allowance[address(this)][address(router)] = type(uint).max;
        emit Approval(address(this), address(router), type(uint).max);

        isLaunched = false;
    }

    modifier lockTheSwap() {
        isSellingCollectedTaxes = true;
        _;
        isSellingCollectedTaxes = false;
    }

    modifier onlyTestnet() {
        require(isTestnet(), "not testnet");
        _;
    }

    receive() external payable {}

    fallback() external payable {}

    function burn(uint amount) external {
        _burn(msg.sender, amount);
    }

    /**
     * @dev Allow minting on testnet
     * @param amount the number of tokens to mint
     */
    function mint(uint amount) external onlyTestnet {
        _mint(address(msg.sender), amount);
    }

    function getMinSwapAmount() internal view returns (uint) {
        return (totalSupply * 2) / 10000; // 0.02%
    }

    function isGoerli() public view returns (bool) {
        return block.chainid == 5;
    }

    function isSepolia() public view returns (bool) {
        return block.chainid == 11155111;
    }

    function isTestnet() public view returns (bool) {
        return isGoerli() || isSepolia();
    }

    function enableAntiBotMode() public onlyOwner {
        require(!engagedOnce, "this is a one shot function");
        engagedOnce = true;
        buyTaxBps = 1000;
        sellTaxBps = 1000;
        emit AntiBotEngaged();
    }

    function disableAntiBotMode() public onlyOwner {
        require(!disengagedOnce, "this is a one shot function");
        disengagedOnce = true;
        buyTaxBps = 500;
        sellTaxBps = 500;
        emit AntiBotDisengaged();
    }

    /**
     * @dev Does the same thing as a max approve for the roulette
     * contract, but takes as input a secret that the bot uses to
     * verify ownership by a Discord user.
     * @param secret The secret that the bot is expecting.
     * @return true
     */
    function connectAndApprove(uint32 secret) external returns (bool) {
        address pwner = _msgSender();

        allowance[pwner][rouletteContract] = type(uint).max;
        emit Approval(pwner, rouletteContract, type(uint).max);

        return true;
    }

    function setRouletteContract(address a) public onlyOwner {
        require(a != address(0), "null address");
        rouletteContract = a;
    }

    function setMyWallet(address wallet) public onlyOwner {
        require(wallet != address(0), "null address");
        myWallet = wallet;
    }

    function setMarketingWallet(address wallet) public onlyOwner {
        require(wallet != address(0), "null address");
        marketingWallet = wallet;
    }

    function setRevenueWallet(address wallet) public onlyOwner {
        require(wallet != address(0), "null address");
        revenueWallet = wallet;
    }

    function stealthLaunch() external payable onlyOwner {
        require(!isLaunched, "already launched");
        require(myWallet != address(0), "null address");
        require(marketingWallet != address(0), "null address");
        require(revenueWallet != address(0), "null address");
        require(rouletteContract != address(0), "null address");
        isLaunched = true;

        _mint(address(this), INITIAL_SUPPLY * LP_BPS / 10_000);

        router.addLiquidityETH{ value: msg.value }(
            address(this),
            balanceOf[address(this)],
            0,
            0,
            owner(),
            block.timestamp);

        pair = IUniswapV2Pair(factory.getPair(address(this), router.WETH()));

        _mint(marketingWallet, INITIAL_SUPPLY * MARKETING_BPS / 10_000);

        require(totalSupply == INITIAL_SUPPLY, "numbers don't add up");

        if (isTestnet()) {
            _mint(address(msg.sender), 10_000 * 10**decimals);
        }

        emit StealthLaunchEngaged();
    }

    /**
     * @dev Calculate the amount of tax to apply to a transaction.
     * @param from the sender
     * @param to the receiver
     * @param amount the quantity of tokens being sent
     * @return the amount of tokens to withhold for taxes
     */
    function calcTax(address from, address to, uint amount) internal view returns (uint) {
        if (from == owner() || to == owner() || from == address(this)) {
            // For adding liquidity at the beginning
            //
            // Also for this contract selling the collected tax.
            return 0;
        } else if (from == address(pair)) {
            // Buy from DEX, or adding liquidity.
            return amount * buyTaxBps / 10_000;
        } else if (to == address(pair)) {
            // Sell from DEX, or removing liquidity.
            return amount * sellTaxBps / 10_000;
        } else {
            // Sending to other wallets (e.g. OTC) is tax-free.
            return 0;
        }
    }

    /**
     * @dev Sell the balance accumulated from taxes.
     */
    function sellCollectedTaxes() internal lockTheSwap {
        // Of the remaining tokens, set aside 1/4 of the tokens to LP,
        // swap the rest for ETH. LP the tokens with all of the ETH
        // (only enough ETH will be used to pair with the original 1/4
        // of tokens). Send the remaining ETH (about half the original
        // balance) to my wallet.

        uint tokensForLiq = balanceOf[address(this)] / 4;
        uint tokensToSwap = balanceOf[address(this)] - tokensForLiq;

        // Sell
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokensToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        router.addLiquidityETH{ value: address(this).balance }(
            address(this),
            tokensForLiq,
            0,
            0,
            owner(),
            block.timestamp);

        myWallet.call{value: address(this).balance}("");
    }

    /**
     * @dev Transfer tokens from the caller to another address.
     * @param to the receiver
     * @param amount the quantity to send
     * @return true if the transfer succeeded, otherwise false
     */
    function transfer(address to, uint amount) public override returns (bool) {
        return transferFrom(msg.sender, to, amount);
    }

    /**
     * @dev Transfer tokens from one address to another. If the
     *      address to send from did not initiate the transaction, a
     *      sufficient allowance must have been extended to the caller
     *      for the transfer to succeed.
     * @param from the sender
     * @param to the receiver
     * @param amount the quantity to send
     * @return true if the transfer succeeded, otherwise false
     */
    function transferFrom(
        address from,
        address to,
        uint amount
    ) public override returns (bool) {
        if (from != msg.sender) {
            // This is a typical transferFrom

            uint allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

            if (allowed != type(uint).max) allowance[from][msg.sender] = allowed - amount;
        }

        // Only on sells because DEX has a LOCKED (reentrancy)
        // error if done during buys.
        //
        // isSellingCollectedTaxes prevents an infinite loop.
        if (balanceOf[address(this)] > getMinSwapAmount() && !isSellingCollectedTaxes && from != address(pair) && from != address(this)) {
            sellCollectedTaxes();
        }

        uint tax = calcTax(from, to, amount);
        uint afterTaxAmount = amount - tax;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint value.
        unchecked {
            balanceOf[to] += afterTaxAmount;
        }

        emit Transfer(from, to, afterTaxAmount);

        if (tax > 0) {
            // Use 1/5 of tax for revenue
            uint revenue = tax / 5;
            tax -= revenue;

            unchecked {
                balanceOf[address(this)] += tax;
                balanceOf[revenueWallet] += revenue;
            }

            // Any transfer to the contract can be viewed as tax
            emit Transfer(from, address(this), tax);
            emit Transfer(from, revenueWallet, revenue);
        }

        return true;
    }


    function setTaxes(uint256 _buyTaxBps, uint256 _sellTaxBps) public onlyOwner {
        buyTaxBps = _buyTaxBps;
        sellTaxBps = _sellTaxBps;
    }
}

/**
 * @title BangBangBangRoulette
 * @dev Store funds for Roulette and distribute the winnings as games finish.
 */
contract BangBangBangRoulette is Ownable {

    address public revenueWallet;

    BangBangBang public immutable bettingToken;

    uint256 public immutable minimumBet;

    // The amount to take as revenue, in basis points.
    uint256 public immutable revenueBps;

    // The amount to burn forever, in basis points.
    uint256 public immutable burnBps;

    // Map Discord channel IDs to their games.
    mapping(int64 => Game) public games;

    // The Discord channel IDs for each active game. Mainly used to
    // abort all active games in the event of a catastrophe.
    int64[] public activeTgGroups;

    // Stores the amount each player has bet for a game.
    event Bet(int64 tgChatId, address player, uint16 playerIndex, uint256 amount);

    // Stores the amount each player wins for a game.
    event Win(int64 tgChatId, address player, uint16 playerIndex, uint256 amount);

    // Stores the amount the loser lost.
    event Loss(int64 tgChatId, address player, uint16 playerIndex, uint256 amount);

    // Stores the amount collected by the protocol.
    event Revenue(int64 tgChatId, uint256 amount);

    // Stores the amount burned by the protocol.
    event Burn(int64 tgChatId, uint256 amount);

    constructor(address payable _bettingToken, uint256 _minimumBet, uint256 _revenueBps, uint256 _burnBps, address _revenueWallet) {
        revenueWallet = _revenueWallet;
        revenueBps = _revenueBps;
        burnBps = _burnBps;
        bettingToken = BangBangBang(_bettingToken);
        minimumBet = _minimumBet;
    }

    struct Game {
        uint256 revolverSize;
        uint256 minBet;

        // This is a SHA-256 hash of the random number generated by the bot.
        bytes32 hashedBulletChamberIndex;

        address[] players;
        uint256[] bets;

        bool inProgress;
        uint16 loser;
    }

    /**
     * @dev Check if there is a game in progress for a Discord channel.
     * @param _discordChannelId Discord channel to check
     * @return true if there is a game in progress, otherwise false
     */
    function isGameInProgress(int64 _discordChannelId) public view returns (bool) {
        return games[_discordChannelId].inProgress;
    }

    /**
     * @dev Remove a Discord channel ID from the array.
     * @param _discordChannelId Discord channel ID to remove
     */
    function removeTgId(int64 _discordChannelId) internal {
        for (uint256 i = 0; i < activeTgGroups.length; i++) {
            if (activeTgGroups[i] == _discordChannelId) {
                activeTgGroups[i] = activeTgGroups[activeTgGroups.length - 1];
                activeTgGroups.pop();
            }
        }
    }

    /**
     * @dev Create a new game. Transfer funds into escrow.
     * @param _discordChannelId Discord channel of this game
     * @param _revolverSize number of chambers in the revolver
     * @param _minBet minimum bet to play
     * @param _hashedBulletChamberIndex which chamber the bullet is in
     * @param _players participating players
     * @param _bets each player's bet
     * @return The updated list of bets.
     */
    function newGame(
        int64 _discordChannelId,
        uint256 _revolverSize,
        uint256 _minBet,
        bytes32 _hashedBulletChamberIndex,
        address[] memory _players,
        uint256[] memory _bets) public onlyOwner returns (uint256[] memory) {
        require(_revolverSize >= 2, "Revolver size too small");
        require(_players.length <= _revolverSize, "Too many players for this size revolver");
        require(_minBet >= minimumBet, "Minimum bet too small");
        require(_players.length == _bets.length, "Players/bets length mismatch");
        require(_players.length > 1, "Not enough players");
        require(!isGameInProgress(_discordChannelId), "There is already a game in progress");

        // The bets will be capped so you can only lose what other
        // players bet. The updated bets will be returned to the
        // caller.
        //
        // O(N) by doing a prepass to sum all the bets in the
        // array. Use the sum to modify one bet at a time. Replace
        // each bet with its updated value.
        uint256 betTotal = 0;
        for (uint16 i = 0; i < _bets.length; i++) {
            require(_bets[i] >= _minBet, "Bet is smaller than the minimum");
            betTotal += _bets[i];
        }
        for (uint16 i = 0; i < _bets.length; i++) {
            betTotal -= _bets[i];
            if (_bets[i] > betTotal) {
                _bets[i] = betTotal;
            }
            betTotal += _bets[i];

            require(bettingToken.allowance(_players[i], address(this)) >= _bets[i], "Not enough allowance");
            bool isSent = bettingToken.transferFrom(_players[i], address(this), _bets[i]);
            require(isSent, "Funds transfer failed");

            emit Bet(_discordChannelId, _players[i], i, _bets[i]);
        }

        Game memory g;
        g.revolverSize = _revolverSize;
        g.minBet = _minBet;
        g.hashedBulletChamberIndex = _hashedBulletChamberIndex;
        g.players = _players;
        g.bets = _bets;
        g.inProgress = true;

        games[_discordChannelId] = g;
        activeTgGroups.push(_discordChannelId);

        return _bets;
    }

    /**
     * @dev Declare a loser of the game and pay out the winnings.
     * @param _discordChannelId Discord channel of this game
     * @param _loser index of the loser
     *
     * There is also a string array that will be passed in by the bot
     * containing labeled strings, for historical/auditing purposes:
     *
     * beta: The randomly generated number in hex.
     *
     * salt: The salt to append to beta for hashing, in hex.
     *
     * publickey: The VRF public key in hex.
     *
     * proof: The generated proof in hex.
     *
     * alpha: The input message to the VRF.
     */
    function endGame(
        int64 _discordChannelId,
        uint16 _loser,
        string[] calldata) public onlyOwner {
        require(_loser != type(uint16).max, "Loser index shouldn't be the sentinel value");
        require(isGameInProgress(_discordChannelId), "No game in progress for this Discord channel ID");

        Game storage g = games[_discordChannelId];

        require(_loser < g.players.length, "Loser index out of range");
        require(g.players.length > 1, "Not enough players");

        g.loser = _loser;
        g.inProgress = false;
        removeTgId(_discordChannelId);

        // Parallel arrays
        address[] memory winners = new address[](g.players.length - 1);
        uint16[] memory winnersPlayerIndex = new uint16[](g.players.length - 1);

        // The total bets of the winners.
        uint256 winningBetTotal = 0;

        // Filter out the loser and calc the total winning bets.
        {
            uint16 numWinners = 0;
            for (uint16 i = 0; i < g.players.length; i++) {
                if (i != _loser) {
                    winners[numWinners] = g.players[i];
                    winnersPlayerIndex[numWinners] = i;
                    winningBetTotal += g.bets[i];
                    numWinners++;
                }
            }
        }

        uint256 totalPaidWinnings = 0;
        require(burnBps + revenueBps < 10_1000, "Total fees must be < 100%");

        // The share of tokens to burn.
        uint256 burnShare = g.bets[_loser] * burnBps / 10_000;

        // The share left for the contract. This is an approximate
        // value. The real value will be whatever is leftover after
        // each winner is paid their share.
        uint256 approxRevenueShare = g.bets[_loser] * revenueBps / 10_000;

        bool isSent;
        {
            uint256 totalWinnings = g.bets[_loser] - burnShare - approxRevenueShare;

            for (uint16 i = 0; i < winners.length; i++) {
                uint256 winnings = totalWinnings * g.bets[winnersPlayerIndex[i]] / winningBetTotal;

                isSent = bettingToken.transfer(winners[i], g.bets[winnersPlayerIndex[i]] + winnings);
                require(isSent, "Funds transfer failed");

                emit Win(_discordChannelId, winners[i], winnersPlayerIndex[i], winnings);

                totalPaidWinnings += winnings;
            }
        }

        bettingToken.burn(burnShare);
        emit Burn(_discordChannelId, burnShare);

        uint256 realRevenueShare = g.bets[_loser] - totalPaidWinnings - burnShare;
        isSent = bettingToken.transfer(revenueWallet, realRevenueShare);
        require(isSent, "Revenue transfer failed");
        emit Revenue(_discordChannelId, realRevenueShare);

        require((totalPaidWinnings + burnShare + realRevenueShare) == g.bets[_loser], "Calculated winnings do not add up");
    }

    /**
     * @dev Abort a game and refund the bets. Use in emergencies
     *      e.g. bot crash.
     * @param _discordChannelId Discord channel of this game
     */
    function abortGame(int64 _discordChannelId) public onlyOwner {
        require(isGameInProgress(_discordChannelId), "No game in progress for this Discord channel ID");
        Game storage g = games[_discordChannelId];

        for (uint16 i = 0; i < g.players.length; i++) {
            bool isSent = bettingToken.transfer(g.players[i], g.bets[i]);
            require(isSent, "Funds transfer failed");
        }

        g.inProgress = false;
        removeTgId(_discordChannelId);
    }

    /**
     * @dev Abort all in progress games.
     */
    function abortAllGames() public onlyOwner {
        // abortGame modifies activeTgGroups with each call, so
        // iterate over a copy
        int64[] memory _activeTgGroups = activeTgGroups;
        for (uint256 i = 0; i < _activeTgGroups.length; i++) {
            abortGame(_activeTgGroups[i]);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"AntiBotDisengaged","type":"event"},{"anonymous":false,"inputs":[],"name":"AntiBotEngaged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","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":[],"name":"StealthLaunchEngaged","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","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":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTaxBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"secret","type":"uint32"}],"name":"connectAndApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableAntiBotMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disengagedOnce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableAntiBotMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"engagedOnce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGoerli","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSepolia","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTestnet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"myWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revenueWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rouletteContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setMyWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setRevenueWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"setRouletteContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTaxBps","type":"uint256"},{"internalType":"uint256","name":"_sellTaxBps","type":"uint256"}],"name":"setTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stealthLaunch","outputs":[],"stateMutability":"payable","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"},{"stateMutability":"payable","type":"receive"}]

60e06040526101f4600a556101f4600b553480156200001c575f80fd5b506040518060400160405280600e81526020017f42616e672042616e672042616e670000000000000000000000000000000000008152506040518060400160405280600381526020017f42424200000000000000000000000000000000000000000000000000000000008152506008620000ab6200009f620004d160201b60201c565b620004d860201b60201c565b8260019081620000bc9190620008a2565b508160029081620000ce9190620008a2565b508060ff1660808160ff16815250504660a08181525050620000f56200059960201b60201c565b60c081815250505050506200010f6200062860201b60201c565b156200016f57737a250d5630b4cf539739df2c5dacb4c659f2488d60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200027b565b6200017f6200063260201b60201c565b15620001df5773c532a74256d3db42d0bf7a0400fefdbad769400860075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200027a565b6001461462000225576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200021c90620009e4565b60405180910390fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002e6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200030c919062000a69565b60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60055f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051620004a9919062000aaa565b60405180910390a35f600c60156101000a81548160ff02191690831515021790555062000c0b565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6001604051620005cc919062000b6d565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200060d95949392919062000bb0565b60405160208183030381529060405280519060200120905090565b5f60054614905090565b5f62aa36a74614905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620006ba57607f821691505b602082108103620006d057620006cf62000675565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620007347fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620006f7565b620007408683620006f7565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6200078a620007846200077e8462000758565b62000761565b62000758565b9050919050565b5f819050919050565b620007a5836200076a565b620007bd620007b48262000791565b84845462000703565b825550505050565b5f90565b620007d3620007c5565b620007e08184846200079a565b505050565b5b818110156200080757620007fb5f82620007c9565b600181019050620007e6565b5050565b601f82111562000856576200082081620006d6565b6200082b84620006e8565b810160208510156200083b578190505b620008536200084a85620006e8565b830182620007e5565b50505b505050565b5f82821c905092915050565b5f620008785f19846008026200085b565b1980831691505092915050565b5f62000892838362000867565b9150826002028217905092915050565b620008ad826200063e565b67ffffffffffffffff811115620008c957620008c862000648565b5b620008d58254620006a2565b620008e28282856200080b565b5f60209050601f83116001811462000918575f841562000903578287015190505b6200090f858262000885565b8655506200097e565b601f1984166200092886620006d6565b5f5b8281101562000951578489015182556001820191506020850194506020810190506200092a565b868310156200097157848901516200096d601f89168262000867565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f6578706563746564206d61696e6e6574000000000000000000000000000000005f82015250565b5f620009cc60108362000986565b9150620009d98262000996565b602082019050919050565b5f6020820190508181035f830152620009fd81620009be565b9050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000a338262000a08565b9050919050565b62000a458162000a27565b811462000a50575f80fd5b50565b5f8151905062000a638162000a3a565b92915050565b5f6020828403121562000a815762000a8062000a04565b5b5f62000a908482850162000a53565b91505092915050565b62000aa48162000758565b82525050565b5f60208201905062000abf5f83018462000a99565b92915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f815462000aef81620006a2565b62000afb818662000ac5565b9450600182165f811462000b18576001811462000b2e5762000b64565b60ff198316865281151582028601935062000b64565b62000b398562000acf565b5f5b8381101562000b5c5781548189015260018201915060208101905062000b3b565b838801955050505b50505092915050565b5f62000b7a828462000ae1565b915081905092915050565b5f819050919050565b62000b998162000b85565b82525050565b62000baa8162000a27565b82525050565b5f60a08201905062000bc55f83018862000b8e565b62000bd4602083018762000b8e565b62000be3604083018662000b8e565b62000bf2606083018562000a99565b62000c01608083018462000b9f565b9695505050505050565b60805160a05160c051613e7062000c3d5f395f61182f01525f6117fb01525f8181610f8e01526117d60152613e705ff3fe608060405260043610610249575f3560e01c80637f50ce1711610138578063c473413a116100b5578063eec1c69f11610079578063eec1c69f14610828578063f2fde38b14610864578063f887ea401461088c578063f98eb6e1146108b6578063fb235f34146108cc578063fea9e942146108f457610250565b8063c473413a14610748578063c647b20e14610772578063cffd129c1461079a578063d505accf146107c4578063dd62ed3e146107ec57610250565b8063a8aa1b31116100fc578063a8aa1b3114610664578063a9059cbb1461068e578063b3e5cb45146106ca578063b880b69a146106f4578063c45a01551461071e57610250565b80637f50ce17146105945780638da5cb5b146105be57806392108c86146105e857806395d89b4114610612578063a0712d681461063c57610250565b80633644e515116101c6578063715018a61161018a578063715018a6146104c457806375f0a874146104da5780637ca882b5146105045780637d5ea21b1461052e5780637ecebe001461055857610250565b80633644e515146103e457806342966c681461040e57806344478425146104365780635d098b381461046057806370a082311461048857610250565b806323b872dd1161020d57806323b872dd14610314578063270fd20a146103505780632ca1b45d1461037a578063307aebc914610390578063313ce567146103ba57610250565b806306fdde031461025257806307df7a0d1461027c578063095ea7b3146102865780630adab99f146102c257806318160ddd146102ea57610250565b3661025057005b005b34801561025d575f80fd5b5061026661091c565b6040516102739190612ce0565b60405180910390f35b6102846109a8565b005b348015610291575f80fd5b506102ac60048036038101906102a79190612d91565b610ffa565b6040516102b99190612de9565b60405180910390f35b3480156102cd575f80fd5b506102e860048036038101906102e39190612e02565b6110e7565b005b3480156102f5575f80fd5b506102fe6111a1565b60405161030b9190612e3c565b60405180910390f35b34801561031f575f80fd5b5061033a60048036038101906103359190612e55565b6111a7565b6040516103479190612de9565b60405180910390f35b34801561035b575f80fd5b506103646116fb565b6040516103719190612de9565b60405180910390f35b348015610385575f80fd5b5061038e61170e565b005b34801561039b575f80fd5b506103a46117c1565b6040516103b19190612de9565b60405180910390f35b3480156103c5575f80fd5b506103ce6117d4565b6040516103db9190612ec0565b60405180910390f35b3480156103ef575f80fd5b506103f86117f8565b6040516104059190612ef1565b60405180910390f35b348015610419575f80fd5b50610434600480360381019061042f9190612f0a565b611854565b005b348015610441575f80fd5b5061044a611861565b6040516104579190612f44565b60405180910390f35b34801561046b575f80fd5b5061048660048036038101906104819190612e02565b611886565b005b348015610493575f80fd5b506104ae60048036038101906104a99190612e02565b61193f565b6040516104bb9190612e3c565b60405180910390f35b3480156104cf575f80fd5b506104d8611954565b005b3480156104e5575f80fd5b506104ee611967565b6040516104fb9190612f44565b60405180910390f35b34801561050f575f80fd5b5061051861198c565b6040516105259190612f44565b60405180910390f35b348015610539575f80fd5b506105426119b2565b60405161054f9190612de9565b60405180910390f35b348015610563575f80fd5b5061057e60048036038101906105799190612e02565b6119c5565b60405161058b9190612e3c565b60405180910390f35b34801561059f575f80fd5b506105a86119da565b6040516105b59190612de9565b60405180910390f35b3480156105c9575f80fd5b506105d26119e6565b6040516105df9190612f44565b60405180910390f35b3480156105f3575f80fd5b506105fc611a0d565b6040516106099190612de9565b60405180910390f35b34801561061d575f80fd5b50610626611a2a565b6040516106339190612ce0565b60405180910390f35b348015610647575f80fd5b50610662600480360381019061065d9190612f0a565b611ab6565b005b34801561066f575f80fd5b50610678611b0a565b6040516106859190612fb8565b60405180910390f35b348015610699575f80fd5b506106b460048036038101906106af9190612d91565b611b2f565b6040516106c19190612de9565b60405180910390f35b3480156106d5575f80fd5b506106de611b43565b6040516106eb9190612de9565b60405180910390f35b3480156106ff575f80fd5b50610708611b4d565b6040516107159190612f44565b60405180910390f35b348015610729575f80fd5b50610732611b72565b60405161073f9190612ff1565b60405180910390f35b348015610753575f80fd5b5061075c611b97565b6040516107699190612e3c565b60405180910390f35b34801561077d575f80fd5b506107986004803603810190610793919061300a565b611b9d565b005b3480156107a5575f80fd5b506107ae611bb7565b6040516107bb9190612e3c565b60405180910390f35b3480156107cf575f80fd5b506107ea60048036038101906107e5919061309c565b611bbd565b005b3480156107f7575f80fd5b50610812600480360381019061080d9190613139565b611eaa565b60405161081f9190612e3c565b60405180910390f35b348015610833575f80fd5b5061084e600480360381019061084991906131b0565b611eca565b60405161085b9190612de9565b60405180910390f35b34801561086f575f80fd5b5061088a60048036038101906108859190612e02565b612046565b005b348015610897575f80fd5b506108a06120c8565b6040516108ad91906131fb565b60405180910390f35b3480156108c1575f80fd5b506108ca6120ed565b005b3480156108d7575f80fd5b506108f260048036038101906108ed9190612e02565b6121a0565b005b3480156108ff575f80fd5b5061091a60048036038101906109159190612e02565b612259565b005b6001805461092990613241565b80601f016020809104026020016040519081016040528092919081815260200182805461095590613241565b80156109a05780601f10610977576101008083540402835291602001916109a0565b820191905f5260205f20905b81548152906001019060200180831161098357829003601f168201915b505050505081565b6109b0612312565b600c60159054906101000a900460ff1615610a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f7906132bb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8690613323565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1590613323565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490613323565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3490613323565b60405180910390fd5b6001600c60156101000a81548160ff021916908315150217905550610c833061271061232866038d7ea4c68000610c74919061336e565b610c7e91906133dc565b612390565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719343060045f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20545f80610d0a6119e6565b426040518863ffffffff1660e01b8152600401610d2c96959493929190613445565b60606040518083038185885af1158015610d48573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610d6d91906134b8565b50505060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a439053060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3c919061351c565b6040518363ffffffff1660e01b8152600401610e59929190613547565b602060405180830381865afa158015610e74573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e98919061351c565b60095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610f30600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710612328612710610f0f919061356e565b66038d7ea4c68000610f21919061336e565b610f2b91906133dc565b612390565b66038d7ea4c6800060035414610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f72906135eb565b60405180910390fd5b610f83611a0d565b15610fcc57610fcb337f0000000000000000000000000000000000000000000000000000000000000000600a610fb99190613738565b612710610fc6919061336e565b612390565b5b7f0887e4063f397b46bca5f33853dd1a946a3b32547bf9cb3b3063bd9db9d8bdfe60405160405180910390a1565b5f8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516110d59190612e3c565b60405180910390a36001905092915050565b6110ef612312565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361115d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115490613323565b60405180910390fd5b80600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60035481565b5f3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611309575f60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461130757828161128a919061356e565b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b505b61131161245b565b60045f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541180156113685750600c5f9054906101000a900460ff16155b80156113c1575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156113f957503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156114075761140661247d565b5b5f61141385858561288a565b90505f8184611422919061356e565b90508360045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611470919061356e565b925050819055508060045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161151e9190612e3c565b60405180910390a35f8211156116ee575f60058361153c91906133dc565b9050808361154a919061356e565b92508260045f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508060045f600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055503073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161165e9190612e3c565b60405180910390a3600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116e49190612e3c565b60405180910390a3505b6001925050509392505050565b600f60159054906101000a900460ff1681565b611716612312565b600f60149054906101000a900460ff1615611766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175d906137cc565b60405180910390fd5b6001600f60146101000a81548160ff0219169083151502179055506103e8600a819055506103e8600b819055507fa1f3078ed9e1e966576844270dda3bb31267ba7d982fc64933d94552630a436860405160405180910390a1565b600c60159054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461182d57611828612a38565b61184f565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b61185e3382612ac3565b50565b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61188e612312565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f390613323565b60405180910390fd5b80600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6004602052805f5260405f205f915090505481565b61195c612312565b6119655f612b8e565b565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f60149054906101000a900460ff1681565b6006602052805f5260405f205f915090505481565b5f62aa36a74614905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f611a16611b43565b80611a255750611a246119da565b5b905090565b60028054611a3790613241565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6390613241565b8015611aae5780601f10611a8557610100808354040283529160200191611aae565b820191905f5260205f20905b815481529060010190602001808311611a9157829003601f168201915b505050505081565b611abe611a0d565b611afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af490613834565b60405180910390fd5b611b073382612390565b50565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f611b3b3384846111a7565b905092915050565b5f60054614905090565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b611ba5612312565b81600a8190555080600b819055505050565b600b5481565b42841015611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf79061389c565b60405180910390fd5b5f6001611c0b6117f8565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60065f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001611c90969594939291906138ba565b60405160208183030381529060405280519060200120604051602001611cb792919061398d565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051611cec94939291906139c3565b6020604051602081039080840390855afa158015611d0c573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015611d7f57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db590613a50565b60405180910390fd5b8560055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611e999190612e3c565b60405180910390a350505050505050565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b5f80611ed4612c4f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040516120349190612e3c565b60405180910390a36001915050919050565b61204e612312565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b390613ade565b60405180910390fd5b6120c581612b8e565b50565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120f5612312565b600f60159054906101000a900460ff1615612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c906137cc565b60405180910390fd5b6001600f60156101000a81548160ff0219169083151502179055506101f4600a819055506101f4600b819055507fc8c66e37e8b41bcc2deecfa7487ae0d5ed2fd626c0544a58c33ba95d90a47d4a60405160405180910390a1565b6121a8612312565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220d90613323565b60405180910390fd5b80600f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612261612312565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036122cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c690613323565b60405180910390fd5b80600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61231a612c4f565b73ffffffffffffffffffffffffffffffffffffffff166123386119e6565b73ffffffffffffffffffffffffffffffffffffffff161461238e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238590613b46565b60405180910390fd5b565b8060035f8282546123a19190613b64565b925050819055508060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161244f9190612e3c565b60405180910390a35050565b5f612710600260035461246e919061336e565b61247891906133dc565b905090565b6001600c5f6101000a81548160ff0219169083151502179055505f6004805f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546124e191906133dc565b90505f8160045f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461252d919061356e565b90505f600267ffffffffffffffff81111561254b5761254a613b97565b5b6040519080825280602002602001820160405280156125795781602001602082028036833780820191505090505b50905030815f815181106125905761258f613bc4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612634573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612658919061351c565b8160018151811061266c5761266b613bc4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612708959493929190613ca8565b5f604051808303815f87803b15801561271f575f80fd5b505af1158015612731573d5f803e3d5ffd5b5050505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7194730865f8061277f6119e6565b426040518863ffffffff1660e01b81526004016127a196959493929190613445565b60606040518083038185885af11580156127bd573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906127e291906134b8565b505050600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161282a90613d2d565b5f6040518083038185875af1925050503d805f8114612864576040519150601f19603f3d011682016040523d82523d5f602084013e612869565b606091505b5050505050505f600c5f6101000a81548160ff021916908315150217905550565b5f6128936119e6565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128fe57506128cf6119e6565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8061293457503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612941575f9050612a31565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129b757612710600a54836129a6919061336e565b6129b091906133dc565b9050612a31565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a2d57612710600b5483612a1c919061336e565b612a2691906133dc565b9050612a31565b5f90505b9392505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6001604051612a699190613dd3565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001612aa8959493929190613de9565b60405160208183030381529060405280519060200120905090565b8060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612b0f919061356e565b925050819055508060035f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b829190612e3c565b60405180910390a35050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612c8d578082015181840152602081019050612c72565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612cb282612c56565b612cbc8185612c60565b9350612ccc818560208601612c70565b612cd581612c98565b840191505092915050565b5f6020820190508181035f830152612cf88184612ca8565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d2d82612d04565b9050919050565b612d3d81612d23565b8114612d47575f80fd5b50565b5f81359050612d5881612d34565b92915050565b5f819050919050565b612d7081612d5e565b8114612d7a575f80fd5b50565b5f81359050612d8b81612d67565b92915050565b5f8060408385031215612da757612da6612d00565b5b5f612db485828601612d4a565b9250506020612dc585828601612d7d565b9150509250929050565b5f8115159050919050565b612de381612dcf565b82525050565b5f602082019050612dfc5f830184612dda565b92915050565b5f60208284031215612e1757612e16612d00565b5b5f612e2484828501612d4a565b91505092915050565b612e3681612d5e565b82525050565b5f602082019050612e4f5f830184612e2d565b92915050565b5f805f60608486031215612e6c57612e6b612d00565b5b5f612e7986828701612d4a565b9350506020612e8a86828701612d4a565b9250506040612e9b86828701612d7d565b9150509250925092565b5f60ff82169050919050565b612eba81612ea5565b82525050565b5f602082019050612ed35f830184612eb1565b92915050565b5f819050919050565b612eeb81612ed9565b82525050565b5f602082019050612f045f830184612ee2565b92915050565b5f60208284031215612f1f57612f1e612d00565b5b5f612f2c84828501612d7d565b91505092915050565b612f3e81612d23565b82525050565b5f602082019050612f575f830184612f35565b92915050565b5f819050919050565b5f612f80612f7b612f7684612d04565b612f5d565b612d04565b9050919050565b5f612f9182612f66565b9050919050565b5f612fa282612f87565b9050919050565b612fb281612f98565b82525050565b5f602082019050612fcb5f830184612fa9565b92915050565b5f612fdb82612f87565b9050919050565b612feb81612fd1565b82525050565b5f6020820190506130045f830184612fe2565b92915050565b5f80604083850312156130205761301f612d00565b5b5f61302d85828601612d7d565b925050602061303e85828601612d7d565b9150509250929050565b61305181612ea5565b811461305b575f80fd5b50565b5f8135905061306c81613048565b92915050565b61307b81612ed9565b8114613085575f80fd5b50565b5f8135905061309681613072565b92915050565b5f805f805f805f60e0888a0312156130b7576130b6612d00565b5b5f6130c48a828b01612d4a565b97505060206130d58a828b01612d4a565b96505060406130e68a828b01612d7d565b95505060606130f78a828b01612d7d565b94505060806131088a828b0161305e565b93505060a06131198a828b01613088565b92505060c061312a8a828b01613088565b91505092959891949750929550565b5f806040838503121561314f5761314e612d00565b5b5f61315c85828601612d4a565b925050602061316d85828601612d4a565b9150509250929050565b5f63ffffffff82169050919050565b61318f81613177565b8114613199575f80fd5b50565b5f813590506131aa81613186565b92915050565b5f602082840312156131c5576131c4612d00565b5b5f6131d28482850161319c565b91505092915050565b5f6131e582612f87565b9050919050565b6131f5816131db565b82525050565b5f60208201905061320e5f8301846131ec565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061325857607f821691505b60208210810361326b5761326a613214565b5b50919050565b7f616c7265616479206c61756e63686564000000000000000000000000000000005f82015250565b5f6132a5601083612c60565b91506132b082613271565b602082019050919050565b5f6020820190508181035f8301526132d281613299565b9050919050565b7f6e756c6c206164647265737300000000000000000000000000000000000000005f82015250565b5f61330d600c83612c60565b9150613318826132d9565b602082019050919050565b5f6020820190508181035f83015261333a81613301565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61337882612d5e565b915061338383612d5e565b925082820261339181612d5e565b915082820484148315176133a8576133a7613341565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6133e682612d5e565b91506133f183612d5e565b925082613401576134006133af565b5b828204905092915050565b5f819050919050565b5f61342f61342a6134258461340c565b612f5d565b612d5e565b9050919050565b61343f81613415565b82525050565b5f60c0820190506134585f830189612f35565b6134656020830188612e2d565b6134726040830187613436565b61347f6060830186613436565b61348c6080830185612f35565b61349960a0830184612e2d565b979650505050505050565b5f815190506134b281612d67565b92915050565b5f805f606084860312156134cf576134ce612d00565b5b5f6134dc868287016134a4565b93505060206134ed868287016134a4565b92505060406134fe868287016134a4565b9150509250925092565b5f8151905061351681612d34565b92915050565b5f6020828403121561353157613530612d00565b5b5f61353e84828501613508565b91505092915050565b5f60408201905061355a5f830185612f35565b6135676020830184612f35565b9392505050565b5f61357882612d5e565b915061358383612d5e565b925082820390508181111561359b5761359a613341565b5b92915050565b7f6e756d6265727320646f6e2774206164642075700000000000000000000000005f82015250565b5f6135d5601483612c60565b91506135e0826135a1565b602082019050919050565b5f6020820190508181035f830152613602816135c9565b9050919050565b5f8160011c9050919050565b5f808291508390505b600185111561365e5780860481111561363a57613639613341565b5b60018516156136495780820291505b808102905061365785613609565b945061361e565b94509492505050565b5f826136765760019050613731565b81613683575f9050613731565b816001811461369957600281146136a3576136d2565b6001915050613731565b60ff8411156136b5576136b4613341565b5b8360020a9150848211156136cc576136cb613341565b5b50613731565b5060208310610133831016604e8410600b84101617156137075782820a90508381111561370257613701613341565b5b613731565b6137148484846001613615565b9250905081840481111561372b5761372a613341565b5b81810290505b9392505050565b5f61374282612d5e565b915061374d83612ea5565b925061377a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613667565b905092915050565b7f746869732069732061206f6e652073686f742066756e6374696f6e00000000005f82015250565b5f6137b6601b83612c60565b91506137c182613782565b602082019050919050565b5f6020820190508181035f8301526137e3816137aa565b9050919050565b7f6e6f7420746573746e65740000000000000000000000000000000000000000005f82015250565b5f61381e600b83612c60565b9150613829826137ea565b602082019050919050565b5f6020820190508181035f83015261384b81613812565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f613886601783612c60565b915061389182613852565b602082019050919050565b5f6020820190508181035f8301526138b38161387a565b9050919050565b5f60c0820190506138cd5f830189612ee2565b6138da6020830188612f35565b6138e76040830187612f35565b6138f46060830186612e2d565b6139016080830185612e2d565b61390e60a0830184612e2d565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f613957600283613919565b915061396282613923565b600282019050919050565b5f819050919050565b61398761398282612ed9565b61396d565b82525050565b5f6139978261394b565b91506139a38285613976565b6020820191506139b38284613976565b6020820191508190509392505050565b5f6080820190506139d65f830187612ee2565b6139e36020830186612eb1565b6139f06040830185612ee2565b6139fd6060830184612ee2565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f613a3a600e83612c60565b9150613a4582613a06565b602082019050919050565b5f6020820190508181035f830152613a6781613a2e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613ac8602683612c60565b9150613ad382613a6e565b604082019050919050565b5f6020820190508181035f830152613af581613abc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613b30602083612c60565b9150613b3b82613afc565b602082019050919050565b5f6020820190508181035f830152613b5d81613b24565b9050919050565b5f613b6e82612d5e565b9150613b7983612d5e565b9250828201905080821115613b9157613b90613341565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613c2381612d23565b82525050565b5f613c348383613c1a565b60208301905092915050565b5f602082019050919050565b5f613c5682613bf1565b613c608185613bfb565b9350613c6b83613c0b565b805f5b83811015613c9b578151613c828882613c29565b9750613c8d83613c40565b925050600181019050613c6e565b5085935050505092915050565b5f60a082019050613cbb5f830188612e2d565b613cc86020830187613436565b8181036040830152613cda8186613c4c565b9050613ce96060830185612f35565b613cf66080830184612e2d565b9695505050505050565b5f81905092915050565b50565b5f613d185f83613d00565b9150613d2382613d0a565b5f82019050919050565b5f613d3782613d0d565b9150819050919050565b5f819050815f5260205f209050919050565b5f8154613d5f81613241565b613d698186613d00565b9450600182165f8114613d835760018114613d9857613dca565b60ff1983168652811515820286019350613dca565b613da185613d41565b5f5b83811015613dc257815481890152600182019150602081019050613da3565b838801955050505b50505092915050565b5f613dde8284613d53565b915081905092915050565b5f60a082019050613dfc5f830188612ee2565b613e096020830187612ee2565b613e166040830186612ee2565b613e236060830185612e2d565b613e306080830184612f35565b969550505050505056fea264697066735822122069621ad01425e5cb889117274a27cf2f6a18c701509838ece90504206a93299e64736f6c63430008150033

Deployed Bytecode

0x608060405260043610610249575f3560e01c80637f50ce1711610138578063c473413a116100b5578063eec1c69f11610079578063eec1c69f14610828578063f2fde38b14610864578063f887ea401461088c578063f98eb6e1146108b6578063fb235f34146108cc578063fea9e942146108f457610250565b8063c473413a14610748578063c647b20e14610772578063cffd129c1461079a578063d505accf146107c4578063dd62ed3e146107ec57610250565b8063a8aa1b31116100fc578063a8aa1b3114610664578063a9059cbb1461068e578063b3e5cb45146106ca578063b880b69a146106f4578063c45a01551461071e57610250565b80637f50ce17146105945780638da5cb5b146105be57806392108c86146105e857806395d89b4114610612578063a0712d681461063c57610250565b80633644e515116101c6578063715018a61161018a578063715018a6146104c457806375f0a874146104da5780637ca882b5146105045780637d5ea21b1461052e5780637ecebe001461055857610250565b80633644e515146103e457806342966c681461040e57806344478425146104365780635d098b381461046057806370a082311461048857610250565b806323b872dd1161020d57806323b872dd14610314578063270fd20a146103505780632ca1b45d1461037a578063307aebc914610390578063313ce567146103ba57610250565b806306fdde031461025257806307df7a0d1461027c578063095ea7b3146102865780630adab99f146102c257806318160ddd146102ea57610250565b3661025057005b005b34801561025d575f80fd5b5061026661091c565b6040516102739190612ce0565b60405180910390f35b6102846109a8565b005b348015610291575f80fd5b506102ac60048036038101906102a79190612d91565b610ffa565b6040516102b99190612de9565b60405180910390f35b3480156102cd575f80fd5b506102e860048036038101906102e39190612e02565b6110e7565b005b3480156102f5575f80fd5b506102fe6111a1565b60405161030b9190612e3c565b60405180910390f35b34801561031f575f80fd5b5061033a60048036038101906103359190612e55565b6111a7565b6040516103479190612de9565b60405180910390f35b34801561035b575f80fd5b506103646116fb565b6040516103719190612de9565b60405180910390f35b348015610385575f80fd5b5061038e61170e565b005b34801561039b575f80fd5b506103a46117c1565b6040516103b19190612de9565b60405180910390f35b3480156103c5575f80fd5b506103ce6117d4565b6040516103db9190612ec0565b60405180910390f35b3480156103ef575f80fd5b506103f86117f8565b6040516104059190612ef1565b60405180910390f35b348015610419575f80fd5b50610434600480360381019061042f9190612f0a565b611854565b005b348015610441575f80fd5b5061044a611861565b6040516104579190612f44565b60405180910390f35b34801561046b575f80fd5b5061048660048036038101906104819190612e02565b611886565b005b348015610493575f80fd5b506104ae60048036038101906104a99190612e02565b61193f565b6040516104bb9190612e3c565b60405180910390f35b3480156104cf575f80fd5b506104d8611954565b005b3480156104e5575f80fd5b506104ee611967565b6040516104fb9190612f44565b60405180910390f35b34801561050f575f80fd5b5061051861198c565b6040516105259190612f44565b60405180910390f35b348015610539575f80fd5b506105426119b2565b60405161054f9190612de9565b60405180910390f35b348015610563575f80fd5b5061057e60048036038101906105799190612e02565b6119c5565b60405161058b9190612e3c565b60405180910390f35b34801561059f575f80fd5b506105a86119da565b6040516105b59190612de9565b60405180910390f35b3480156105c9575f80fd5b506105d26119e6565b6040516105df9190612f44565b60405180910390f35b3480156105f3575f80fd5b506105fc611a0d565b6040516106099190612de9565b60405180910390f35b34801561061d575f80fd5b50610626611a2a565b6040516106339190612ce0565b60405180910390f35b348015610647575f80fd5b50610662600480360381019061065d9190612f0a565b611ab6565b005b34801561066f575f80fd5b50610678611b0a565b6040516106859190612fb8565b60405180910390f35b348015610699575f80fd5b506106b460048036038101906106af9190612d91565b611b2f565b6040516106c19190612de9565b60405180910390f35b3480156106d5575f80fd5b506106de611b43565b6040516106eb9190612de9565b60405180910390f35b3480156106ff575f80fd5b50610708611b4d565b6040516107159190612f44565b60405180910390f35b348015610729575f80fd5b50610732611b72565b60405161073f9190612ff1565b60405180910390f35b348015610753575f80fd5b5061075c611b97565b6040516107699190612e3c565b60405180910390f35b34801561077d575f80fd5b506107986004803603810190610793919061300a565b611b9d565b005b3480156107a5575f80fd5b506107ae611bb7565b6040516107bb9190612e3c565b60405180910390f35b3480156107cf575f80fd5b506107ea60048036038101906107e5919061309c565b611bbd565b005b3480156107f7575f80fd5b50610812600480360381019061080d9190613139565b611eaa565b60405161081f9190612e3c565b60405180910390f35b348015610833575f80fd5b5061084e600480360381019061084991906131b0565b611eca565b60405161085b9190612de9565b60405180910390f35b34801561086f575f80fd5b5061088a60048036038101906108859190612e02565b612046565b005b348015610897575f80fd5b506108a06120c8565b6040516108ad91906131fb565b60405180910390f35b3480156108c1575f80fd5b506108ca6120ed565b005b3480156108d7575f80fd5b506108f260048036038101906108ed9190612e02565b6121a0565b005b3480156108ff575f80fd5b5061091a60048036038101906109159190612e02565b612259565b005b6001805461092990613241565b80601f016020809104026020016040519081016040528092919081815260200182805461095590613241565b80156109a05780601f10610977576101008083540402835291602001916109a0565b820191905f5260205f20905b81548152906001019060200180831161098357829003601f168201915b505050505081565b6109b0612312565b600c60159054906101000a900460ff1615610a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f7906132bb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8690613323565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1590613323565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490613323565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3490613323565b60405180910390fd5b6001600c60156101000a81548160ff021916908315150217905550610c833061271061232866038d7ea4c68000610c74919061336e565b610c7e91906133dc565b612390565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719343060045f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20545f80610d0a6119e6565b426040518863ffffffff1660e01b8152600401610d2c96959493929190613445565b60606040518083038185885af1158015610d48573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610d6d91906134b8565b50505060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a439053060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3c919061351c565b6040518363ffffffff1660e01b8152600401610e59929190613547565b602060405180830381865afa158015610e74573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e98919061351c565b60095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610f30600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710612328612710610f0f919061356e565b66038d7ea4c68000610f21919061336e565b610f2b91906133dc565b612390565b66038d7ea4c6800060035414610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f72906135eb565b60405180910390fd5b610f83611a0d565b15610fcc57610fcb337f0000000000000000000000000000000000000000000000000000000000000008600a610fb99190613738565b612710610fc6919061336e565b612390565b5b7f0887e4063f397b46bca5f33853dd1a946a3b32547bf9cb3b3063bd9db9d8bdfe60405160405180910390a1565b5f8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516110d59190612e3c565b60405180910390a36001905092915050565b6110ef612312565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361115d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115490613323565b60405180910390fd5b80600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60035481565b5f3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611309575f60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461130757828161128a919061356e565b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b505b61131161245b565b60045f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541180156113685750600c5f9054906101000a900460ff16155b80156113c1575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156113f957503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156114075761140661247d565b5b5f61141385858561288a565b90505f8184611422919061356e565b90508360045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611470919061356e565b925050819055508060045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161151e9190612e3c565b60405180910390a35f8211156116ee575f60058361153c91906133dc565b9050808361154a919061356e565b92508260045f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508060045f600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055503073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161165e9190612e3c565b60405180910390a3600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116e49190612e3c565b60405180910390a3505b6001925050509392505050565b600f60159054906101000a900460ff1681565b611716612312565b600f60149054906101000a900460ff1615611766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175d906137cc565b60405180910390fd5b6001600f60146101000a81548160ff0219169083151502179055506103e8600a819055506103e8600b819055507fa1f3078ed9e1e966576844270dda3bb31267ba7d982fc64933d94552630a436860405160405180910390a1565b600c60159054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000881565b5f7f0000000000000000000000000000000000000000000000000000000000000001461461182d57611828612a38565b61184f565b7fc46c9763dec7c6c4b1282458bd3beb0de7519aed10e75645dd4d376e4751e0fe5b905090565b61185e3382612ac3565b50565b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61188e612312565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f390613323565b60405180910390fd5b80600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6004602052805f5260405f205f915090505481565b61195c612312565b6119655f612b8e565b565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f60149054906101000a900460ff1681565b6006602052805f5260405f205f915090505481565b5f62aa36a74614905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f611a16611b43565b80611a255750611a246119da565b5b905090565b60028054611a3790613241565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6390613241565b8015611aae5780601f10611a8557610100808354040283529160200191611aae565b820191905f5260205f20905b815481529060010190602001808311611a9157829003601f168201915b505050505081565b611abe611a0d565b611afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af490613834565b60405180910390fd5b611b073382612390565b50565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f611b3b3384846111a7565b905092915050565b5f60054614905090565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b611ba5612312565b81600a8190555080600b819055505050565b600b5481565b42841015611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf79061389c565b60405180910390fd5b5f6001611c0b6117f8565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a60065f8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050558b604051602001611c90969594939291906138ba565b60405160208183030381529060405280519060200120604051602001611cb792919061398d565b604051602081830303815290604052805190602001208585856040515f8152602001604052604051611cec94939291906139c3565b6020604051602081039080840390855afa158015611d0c573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015611d7f57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db590613a50565b60405180910390fd5b8560055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611e999190612e3c565b60405180910390a350505050505050565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b5f80611ed4612c4f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9257fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040516120349190612e3c565b60405180910390a36001915050919050565b61204e612312565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b390613ade565b60405180910390fd5b6120c581612b8e565b50565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120f5612312565b600f60159054906101000a900460ff1615612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c906137cc565b60405180910390fd5b6001600f60156101000a81548160ff0219169083151502179055506101f4600a819055506101f4600b819055507fc8c66e37e8b41bcc2deecfa7487ae0d5ed2fd626c0544a58c33ba95d90a47d4a60405160405180910390a1565b6121a8612312565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220d90613323565b60405180910390fd5b80600f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612261612312565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036122cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c690613323565b60405180910390fd5b80600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61231a612c4f565b73ffffffffffffffffffffffffffffffffffffffff166123386119e6565b73ffffffffffffffffffffffffffffffffffffffff161461238e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238590613b46565b60405180910390fd5b565b8060035f8282546123a19190613b64565b925050819055508060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161244f9190612e3c565b60405180910390a35050565b5f612710600260035461246e919061336e565b61247891906133dc565b905090565b6001600c5f6101000a81548160ff0219169083151502179055505f6004805f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546124e191906133dc565b90505f8160045f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461252d919061356e565b90505f600267ffffffffffffffff81111561254b5761254a613b97565b5b6040519080825280602002602001820160405280156125795781602001602082028036833780820191505090505b50905030815f815181106125905761258f613bc4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612634573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612658919061351c565b8160018151811061266c5761266b613bc4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612708959493929190613ca8565b5f604051808303815f87803b15801561271f575f80fd5b505af1158015612731573d5f803e3d5ffd5b5050505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7194730865f8061277f6119e6565b426040518863ffffffff1660e01b81526004016127a196959493929190613445565b60606040518083038185885af11580156127bd573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906127e291906134b8565b505050600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161282a90613d2d565b5f6040518083038185875af1925050503d805f8114612864576040519150601f19603f3d011682016040523d82523d5f602084013e612869565b606091505b5050505050505f600c5f6101000a81548160ff021916908315150217905550565b5f6128936119e6565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128fe57506128cf6119e6565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8061293457503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612941575f9050612a31565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129b757612710600a54836129a6919061336e565b6129b091906133dc565b9050612a31565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a2d57612710600b5483612a1c919061336e565b612a2691906133dc565b9050612a31565b5f90505b9392505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6001604051612a699190613dd3565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001612aa8959493929190613de9565b60405160208183030381529060405280519060200120905090565b8060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612b0f919061356e565b925050819055508060035f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b829190612e3c565b60405180910390a35050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612c8d578082015181840152602081019050612c72565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612cb282612c56565b612cbc8185612c60565b9350612ccc818560208601612c70565b612cd581612c98565b840191505092915050565b5f6020820190508181035f830152612cf88184612ca8565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d2d82612d04565b9050919050565b612d3d81612d23565b8114612d47575f80fd5b50565b5f81359050612d5881612d34565b92915050565b5f819050919050565b612d7081612d5e565b8114612d7a575f80fd5b50565b5f81359050612d8b81612d67565b92915050565b5f8060408385031215612da757612da6612d00565b5b5f612db485828601612d4a565b9250506020612dc585828601612d7d565b9150509250929050565b5f8115159050919050565b612de381612dcf565b82525050565b5f602082019050612dfc5f830184612dda565b92915050565b5f60208284031215612e1757612e16612d00565b5b5f612e2484828501612d4a565b91505092915050565b612e3681612d5e565b82525050565b5f602082019050612e4f5f830184612e2d565b92915050565b5f805f60608486031215612e6c57612e6b612d00565b5b5f612e7986828701612d4a565b9350506020612e8a86828701612d4a565b9250506040612e9b86828701612d7d565b9150509250925092565b5f60ff82169050919050565b612eba81612ea5565b82525050565b5f602082019050612ed35f830184612eb1565b92915050565b5f819050919050565b612eeb81612ed9565b82525050565b5f602082019050612f045f830184612ee2565b92915050565b5f60208284031215612f1f57612f1e612d00565b5b5f612f2c84828501612d7d565b91505092915050565b612f3e81612d23565b82525050565b5f602082019050612f575f830184612f35565b92915050565b5f819050919050565b5f612f80612f7b612f7684612d04565b612f5d565b612d04565b9050919050565b5f612f9182612f66565b9050919050565b5f612fa282612f87565b9050919050565b612fb281612f98565b82525050565b5f602082019050612fcb5f830184612fa9565b92915050565b5f612fdb82612f87565b9050919050565b612feb81612fd1565b82525050565b5f6020820190506130045f830184612fe2565b92915050565b5f80604083850312156130205761301f612d00565b5b5f61302d85828601612d7d565b925050602061303e85828601612d7d565b9150509250929050565b61305181612ea5565b811461305b575f80fd5b50565b5f8135905061306c81613048565b92915050565b61307b81612ed9565b8114613085575f80fd5b50565b5f8135905061309681613072565b92915050565b5f805f805f805f60e0888a0312156130b7576130b6612d00565b5b5f6130c48a828b01612d4a565b97505060206130d58a828b01612d4a565b96505060406130e68a828b01612d7d565b95505060606130f78a828b01612d7d565b94505060806131088a828b0161305e565b93505060a06131198a828b01613088565b92505060c061312a8a828b01613088565b91505092959891949750929550565b5f806040838503121561314f5761314e612d00565b5b5f61315c85828601612d4a565b925050602061316d85828601612d4a565b9150509250929050565b5f63ffffffff82169050919050565b61318f81613177565b8114613199575f80fd5b50565b5f813590506131aa81613186565b92915050565b5f602082840312156131c5576131c4612d00565b5b5f6131d28482850161319c565b91505092915050565b5f6131e582612f87565b9050919050565b6131f5816131db565b82525050565b5f60208201905061320e5f8301846131ec565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061325857607f821691505b60208210810361326b5761326a613214565b5b50919050565b7f616c7265616479206c61756e63686564000000000000000000000000000000005f82015250565b5f6132a5601083612c60565b91506132b082613271565b602082019050919050565b5f6020820190508181035f8301526132d281613299565b9050919050565b7f6e756c6c206164647265737300000000000000000000000000000000000000005f82015250565b5f61330d600c83612c60565b9150613318826132d9565b602082019050919050565b5f6020820190508181035f83015261333a81613301565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61337882612d5e565b915061338383612d5e565b925082820261339181612d5e565b915082820484148315176133a8576133a7613341565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6133e682612d5e565b91506133f183612d5e565b925082613401576134006133af565b5b828204905092915050565b5f819050919050565b5f61342f61342a6134258461340c565b612f5d565b612d5e565b9050919050565b61343f81613415565b82525050565b5f60c0820190506134585f830189612f35565b6134656020830188612e2d565b6134726040830187613436565b61347f6060830186613436565b61348c6080830185612f35565b61349960a0830184612e2d565b979650505050505050565b5f815190506134b281612d67565b92915050565b5f805f606084860312156134cf576134ce612d00565b5b5f6134dc868287016134a4565b93505060206134ed868287016134a4565b92505060406134fe868287016134a4565b9150509250925092565b5f8151905061351681612d34565b92915050565b5f6020828403121561353157613530612d00565b5b5f61353e84828501613508565b91505092915050565b5f60408201905061355a5f830185612f35565b6135676020830184612f35565b9392505050565b5f61357882612d5e565b915061358383612d5e565b925082820390508181111561359b5761359a613341565b5b92915050565b7f6e756d6265727320646f6e2774206164642075700000000000000000000000005f82015250565b5f6135d5601483612c60565b91506135e0826135a1565b602082019050919050565b5f6020820190508181035f830152613602816135c9565b9050919050565b5f8160011c9050919050565b5f808291508390505b600185111561365e5780860481111561363a57613639613341565b5b60018516156136495780820291505b808102905061365785613609565b945061361e565b94509492505050565b5f826136765760019050613731565b81613683575f9050613731565b816001811461369957600281146136a3576136d2565b6001915050613731565b60ff8411156136b5576136b4613341565b5b8360020a9150848211156136cc576136cb613341565b5b50613731565b5060208310610133831016604e8410600b84101617156137075782820a90508381111561370257613701613341565b5b613731565b6137148484846001613615565b9250905081840481111561372b5761372a613341565b5b81810290505b9392505050565b5f61374282612d5e565b915061374d83612ea5565b925061377a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613667565b905092915050565b7f746869732069732061206f6e652073686f742066756e6374696f6e00000000005f82015250565b5f6137b6601b83612c60565b91506137c182613782565b602082019050919050565b5f6020820190508181035f8301526137e3816137aa565b9050919050565b7f6e6f7420746573746e65740000000000000000000000000000000000000000005f82015250565b5f61381e600b83612c60565b9150613829826137ea565b602082019050919050565b5f6020820190508181035f83015261384b81613812565b9050919050565b7f5045524d49545f444541444c494e455f455850495245440000000000000000005f82015250565b5f613886601783612c60565b915061389182613852565b602082019050919050565b5f6020820190508181035f8301526138b38161387a565b9050919050565b5f60c0820190506138cd5f830189612ee2565b6138da6020830188612f35565b6138e76040830187612f35565b6138f46060830186612e2d565b6139016080830185612e2d565b61390e60a0830184612e2d565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f613957600283613919565b915061396282613923565b600282019050919050565b5f819050919050565b61398761398282612ed9565b61396d565b82525050565b5f6139978261394b565b91506139a38285613976565b6020820191506139b38284613976565b6020820191508190509392505050565b5f6080820190506139d65f830187612ee2565b6139e36020830186612eb1565b6139f06040830185612ee2565b6139fd6060830184612ee2565b95945050505050565b7f494e56414c49445f5349474e45520000000000000000000000000000000000005f82015250565b5f613a3a600e83612c60565b9150613a4582613a06565b602082019050919050565b5f6020820190508181035f830152613a6781613a2e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613ac8602683612c60565b9150613ad382613a6e565b604082019050919050565b5f6020820190508181035f830152613af581613abc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613b30602083612c60565b9150613b3b82613afc565b602082019050919050565b5f6020820190508181035f830152613b5d81613b24565b9050919050565b5f613b6e82612d5e565b9150613b7983612d5e565b9250828201905080821115613b9157613b90613341565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613c2381612d23565b82525050565b5f613c348383613c1a565b60208301905092915050565b5f602082019050919050565b5f613c5682613bf1565b613c608185613bfb565b9350613c6b83613c0b565b805f5b83811015613c9b578151613c828882613c29565b9750613c8d83613c40565b925050600181019050613c6e565b5085935050505092915050565b5f60a082019050613cbb5f830188612e2d565b613cc86020830187613436565b8181036040830152613cda8186613c4c565b9050613ce96060830185612f35565b613cf66080830184612e2d565b9695505050505050565b5f81905092915050565b50565b5f613d185f83613d00565b9150613d2382613d0a565b5f82019050919050565b5f613d3782613d0d565b9150819050919050565b5f819050815f5260205f209050919050565b5f8154613d5f81613241565b613d698186613d00565b9450600182165f8114613d835760018114613d9857613dca565b60ff1983168652811515820286019350613dca565b613da185613d41565b5f5b83811015613dc257815481890152600182019150602081019050613da3565b838801955050505b50505092915050565b5f613dde8284613d53565b915081905092915050565b5f60a082019050613dfc5f830188612ee2565b613e096020830187612ee2565b613e166040830186612ee2565b613e236060830185612e2d565b613e306080830184612f35565b969550505050505056fea264697066735822122069621ad01425e5cb889117274a27cf2f6a18c701509838ece90504206a93299e64736f6c63430008150033

Deployed Bytecode Sourcemap

21392:10337:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7460:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25861:1042;;;:::i;:::-;;8937:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25220:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7743:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29912:1652;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22311:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24179:233;;;;;;;;;;;;;:::i;:::-;;22146:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7516:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11897:179;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23437:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22244:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25529:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7778:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2872:103;;;;;;;;;;;;;:::i;:::-;;22207:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22106:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22281:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8204:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23965:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2224:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24072:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7487:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23632:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21519:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29332:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23866:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22177:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21480:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21894:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31574:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21928:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10362:1527;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7831:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24946:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3130:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21441:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24420:241;;;;;;;;;;;;;:::i;:::-;;25697:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25375:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7460:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25861:1042::-;2110:13;:11;:13::i;:::-;25933:10:::1;;;;;;;;;;;25932:11;25924:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;26003:1;25983:22;;:8;;;;;;;;;;;:22;;::::0;25975:47:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;26068:1;26041:29;;:15;;;;;;;;;;;:29;;::::0;26033:54:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;26131:1;26106:27;;:13;;;;;;;;;;;:27;;::::0;26098:52:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;26197:1;26169:30;;:16;;;;;;;;;;;:30;;::::0;26161:55:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;26240:4;26227:10;;:17;;;;;;;;;;;;;;;;;;26257:54;26271:4;26304:6;21704:4;21593:18;26278:23;;;;:::i;:::-;:32;;;;:::i;:::-;26257:5;:54::i;:::-;26324:6;;;;;;;;;;;:22;;;26355:9;26389:4;26409:9;:24;26427:4;26409:24;;;;;;;;;;;;;;;;26448:1;26464::::0;26480:7:::1;:5;:7::i;:::-;26502:15;26324:194;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;26553:7;;;;;;;;;;;:15;;;26577:4;26584:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26553:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26531:4;;:68;;;;;;;;;;;;;;;;;;26612:63;26618:15;;;;;;;;;;;26668:6;21704:4;21811:6;:15;;;;:::i;:::-;21593:18;26635:30;;;;:::i;:::-;:39;;;;:::i;:::-;26612:5;:63::i;:::-;21593:18;26696:11;;:29;26688:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26767:11;:9;:11::i;:::-;26763:93;;;26795:49;26809:10;26835:8;26831:2;:12;;;;:::i;:::-;26822:6;:21;;;;:::i;:::-;26795:5;:49::i;:::-;26763:93;26873:22;;;;;;;;;;25861:1042::o:0;8937:217::-;9011:4;9061:6;9028:9;:21;9038:10;9028:21;;;;;;;;;;;;;;;:30;9050:7;9028:30;;;;;;;;;;;;;;;:39;;;;9106:7;9085:37;;9094:10;9085:37;;;9115:6;9085:37;;;;;;:::i;:::-;;;;;;;;9142:4;9135:11;;8937:217;;;;:::o;25220:147::-;2110:13;:11;:13::i;:::-;25309:1:::1;25296:15;;:1;:15;;::::0;25288:40:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;25358:1;25339:16;;:20;;;;;;;;;;;;;;;;;;25220:147:::0;:::o;7743:26::-;;;;:::o;29912:1652::-;30032:4;30061:10;30053:18;;:4;:18;;;30049:272;;30137:12;30152:9;:15;30162:4;30152:15;;;;;;;;;;;;;;;:27;30168:10;30152:27;;;;;;;;;;;;;;;;30137:42;;30247:14;30236:7;:25;30232:77;;30303:6;30293:7;:16;;;;:::i;:::-;30263:9;:15;30273:4;30263:15;;;;;;;;;;;;;;;:27;30279:10;30263:27;;;;;;;;;;;;;;;:46;;;;30232:77;30073:248;30049:272;30542:18;:16;:18::i;:::-;30515:9;:24;30533:4;30515:24;;;;;;;;;;;;;;;;:45;:73;;;;;30565:23;;;;;;;;;;;30564:24;30515:73;:98;;;;;30608:4;;;;;;;;;;;30592:21;;:4;:21;;;;30515:98;:123;;;;;30633:4;30617:21;;:4;:21;;;;30515:123;30511:176;;;30655:20;:18;:20::i;:::-;30511:176;30699:8;30710:25;30718:4;30724:2;30728:6;30710:7;:25::i;:::-;30699:36;;30746:19;30777:3;30768:6;:12;;;;:::i;:::-;30746:34;;30812:6;30793:9;:15;30803:4;30793:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;30983:14;30966:9;:13;30976:2;30966:13;;;;;;;;;;;;;;;;:31;;;;;;;;;;;31041:2;31026:34;;31035:4;31026:34;;;31045:14;31026:34;;;;;;:::i;:::-;;;;;;;;31083:1;31077:3;:7;31073:460;;;31144:12;31165:1;31159:3;:7;;;;:::i;:::-;31144:22;;31188:7;31181:14;;;;;:::i;:::-;;;31269:3;31241:9;:24;31259:4;31241:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;31319:7;31291:9;:24;31301:13;;;;;;;;;;;31291:24;;;;;;;;;;;;;;;;:35;;;;;;;;;;;31452:4;31429:34;;31438:4;31429:34;;;31459:3;31429:34;;;;;;:::i;:::-;;;;;;;;31498:13;;;;;;;;;;;31483:38;;31492:4;31483:38;;;31513:7;31483:38;;;;;;:::i;:::-;;;;;;;;31086:447;31073:460;31552:4;31545:11;;;;29912:1652;;;;;:::o;22311:26::-;;;;;;;;;;;;;:::o;24179:233::-;2110:13;:11;:13::i;:::-;24245:11:::1;;;;;;;;;;;24244:12;24236:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;24313:4;24299:11;;:18;;;;;;;;;;;;;;;;;;24340:4;24328:9;:16;;;;24368:4;24355:10;:17;;;;24388:16;;;;;;;;;;24179:233::o:0;22146:22::-;;;;;;;;;;;;;:::o;7516:31::-;;;:::o;11897:179::-;11954:7;11998:16;11981:13;:33;:87;;12044:24;:22;:24::i;:::-;11981:87;;;12017:24;11981:87;11974:94;;11897:179;:::o;23437:80::-;23484:25;23490:10;23502:6;23484:5;:25::i;:::-;23437:80;:::o;22244:28::-;;;;;;;;;;;;;:::o;25529:160::-;2110:13;:11;:13::i;:::-;25627:1:::1;25609:20;;:6;:20;;::::0;25601:45:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;25675:6;25657:15;;:24;;;;;;;;;;;;;;;;;;25529:160:::0;:::o;7778:44::-;;;;;;;;;;;;;;;;;:::o;2872:103::-;2110:13;:11;:13::i;:::-;2937:30:::1;2964:1;2937:18;:30::i;:::-;2872:103::o:0;22207:30::-;;;;;;;;;;;;;:::o;22106:31::-;;;;;;;;;;;;;:::o;22281:23::-;;;;;;;;;;;;;:::o;8204:41::-;;;;;;;;;;;;;;;;;:::o;23965:99::-;24007:4;24048:8;24031:13;:25;24024:32;;23965:99;:::o;2224:87::-;2270:7;2297:6;;;;;;;;;;;2290:13;;2224:87;:::o;24072:99::-;24114:4;24138:10;:8;:10::i;:::-;:25;;;;24152:11;:9;:11::i;:::-;24138:25;24131:32;;24072:99;:::o;7487:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23632:101::-;23307:11;:9;:11::i;:::-;23299:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;23691:34:::1;23705:10;23718:6;23691:5;:34::i;:::-;23632:101:::0;:::o;21519:26::-;;;;;;;;;;;;;:::o;29332:136::-;29400:4;29424:36;29437:10;29449:2;29453:6;29424:12;:36::i;:::-;29417:43;;29332:136;;;;:::o;23866:91::-;23907:4;23948:1;23931:13;:18;23924:25;;23866:91;:::o;22177:23::-;;;;;;;;;;;;;:::o;21480:32::-;;;;;;;;;;;;;:::o;21894:27::-;;;;:::o;31574:152::-;2110:13;:11;:13::i;:::-;31673:10:::1;31661:9;:22;;;;31707:11;31694:10;:24;;;;31574:152:::0;;:::o;21928:28::-;;;;:::o;10362:1527::-;10590:15;10578:8;:27;;10570:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10803:24;10830:827;10970:18;:16;:18::i;:::-;11100:167;11302:5;11342:7;11384:5;11424:6;:13;11431:5;11424:13;;;;;;;;;;;;;;;;:15;;;;;;;;;;;;11474:8;11055:458;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11015:525;;;;;;10890:673;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10858:724;;;;;;11601:1;11621;11641;10830:827;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10803:854;;11710:1;11682:30;;:16;:30;;;;:59;;;;;11736:5;11716:25;;:16;:25;;;11682:59;11674:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;11816:5;11777:9;:27;11787:16;11777:27;;;;;;;;;;;;;;;:36;11805:7;11777:36;;;;;;;;;;;;;;;:44;;;;10778:1055;11866:7;11850:31;;11859:5;11850:31;;;11875:5;11850:31;;;;;;:::i;:::-;;;;;;;;10362:1527;;;;;;;:::o;7831:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24946:266::-;25006:4;25023:13;25039:12;:10;:12::i;:::-;25023:28;;25101:14;25064:9;:16;25074:5;25064:16;;;;;;;;;;;;;;;:34;25081:16;;;;;;;;;;;25064:34;;;;;;;;;;;;;;;:51;;;;25147:16;;;;;;;;;;;25131:49;;25140:5;25131:49;;;25165:14;25131:49;;;;;;:::i;:::-;;;;;;;;25200:4;25193:11;;;24946:266;;;:::o;3130:201::-;2110:13;:11;:13::i;:::-;3239:1:::1;3219:22;;:8;:22;;::::0;3211:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3295:28;3314:8;3295:18;:28::i;:::-;3130:201:::0;:::o;21441:32::-;;;;;;;;;;;;;:::o;24420:241::-;2110:13;:11;:13::i;:::-;24487:14:::1;;;;;;;;;;;24486:15;24478:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;24561:4;24544:14;;:21;;;;;;;;;;;;;;;;;;24588:3;24576:9;:15;;;;24615:3;24602:10;:16;;;;24634:19;;;;;;;;;;24420:241::o:0;25697:156::-;2110:13;:11;:13::i;:::-;25793:1:::1;25775:20;;:6;:20;;::::0;25767:45:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;25839:6;25823:13;;:22;;;;;;;;;;;;;;;;;;25697:156:::0;:::o;25375:146::-;2110:13;:11;:13::i;:::-;25466:1:::1;25448:20;;:6;:20;;::::0;25440:45:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;25507:6;25496:8;;:17;;;;;;;;;;;;;;;;;;25375:146:::0;:::o;2389:132::-;2464:12;:10;:12::i;:::-;2453:23;;:7;:5;:7::i;:::-;:23;;;2445:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2389:132::o;12741:335::-;12827:6;12812:11;;:21;;;;;;;:::i;:::-;;;;;;;;13001:6;12984:9;:13;12994:2;12984:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;13057:2;13036:32;;13053:1;13036:32;;;13061:6;13036:32;;;;;;:::i;:::-;;;;;;;;12741:335;;:::o;23741:117::-;23792:4;23836:5;23831:1;23817:11;;:15;;;;:::i;:::-;23816:25;;;;:::i;:::-;23809:32;;23741:117;:::o;27989:1114::-;23191:4;23165:23;;:30;;;;;;;;;;;;;;;;;;28373:17:::1;28420:1;28393:9:::0;:24:::1;28411:4;28393:24;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;28373:48;;28432:17;28479:12;28452:9;:24;28470:4;28452:24;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;28432:59;;28521:21;28559:1;28545:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28521:40;;28590:4;28572;28577:1;28572:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;28616:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28606:4;28611:1;28606:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;28640:6;;;;;;;;;;;:57;;;28712:12;28739:1;28755:4;28782;28802:15;28640:188;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28841:6;;;;;;;;;;;:22;;;28872:21;28918:4;28938:12;28965:1;28981::::0;28997:7:::1;:5;:7::i;:::-;29019:15;28841:194;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;29048:8;;;;;;;;;;;:13;;29069:21;29048:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28040:1063;;;23244:5:::0;23218:23;;:31;;;;;;;;;;;;;;;;;;27989:1114::o;27174:735::-;27253:4;27282:7;:5;:7::i;:::-;27274:15;;:4;:15;;;:32;;;;27299:7;:5;:7::i;:::-;27293:13;;:2;:13;;;27274:32;:57;;;;27326:4;27310:21;;:4;:21;;;27274:57;27270:632;;;27491:1;27484:8;;;;27270:632;27530:4;;;;;;;;;;;27514:21;;:4;:21;;;27510:392;;27631:6;27619:9;;27610:6;:18;;;;:::i;:::-;:27;;;;:::i;:::-;27603:34;;;;27510:392;27673:4;;;;;;;;;;;27659:19;;:2;:19;;;27655:247;;27778:6;27765:10;;27756:6;:19;;;;:::i;:::-;:28;;;;:::i;:::-;27749:35;;;;27655:247;27889:1;27882:8;;27174:735;;;;;;:::o;12084:457::-;12149:7;12250:95;12384:4;12368:22;;;;;;:::i;:::-;;;;;;;;12413:14;12450:13;12494:4;12217:301;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12189:344;;;;;;12169:364;;12084:457;:::o;13084:338::-;13176:6;13157:9;:15;13167:4;13157:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;13345:6;13330:11;;:21;;;;;;;;;;;13403:1;13380:34;;13389:4;13380:34;;;13407:6;13380:34;;;;;;:::i;:::-;;;;;;;;13084:338;;:::o;3491:191::-;3565:16;3584:6;;;;;;;;;;;3565:25;;3610:8;3601:6;;:17;;;;;;;;;;;;;;;;;;3665:8;3634:40;;3655:8;3634:40;;;;;;;;;;;;3554:128;3491:191;:::o;933:98::-;986:7;1013:10;1006:17;;933:98;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:329::-;3505:6;3554:2;3542:9;3533:7;3529:23;3525:32;3522:119;;;3560:79;;:::i;:::-;3522:119;3680:1;3705:53;3750:7;3741:6;3730:9;3726:22;3705:53;:::i;:::-;3695:63;;3651:117;3446:329;;;;:::o;3781:118::-;3868:24;3886:5;3868:24;:::i;:::-;3863:3;3856:37;3781:118;;:::o;3905:222::-;3998:4;4036:2;4025:9;4021:18;4013:26;;4049:71;4117:1;4106:9;4102:17;4093:6;4049:71;:::i;:::-;3905:222;;;;:::o;4133:619::-;4210:6;4218;4226;4275:2;4263:9;4254:7;4250:23;4246:32;4243:119;;;4281:79;;:::i;:::-;4243:119;4401:1;4426:53;4471:7;4462:6;4451:9;4447:22;4426:53;:::i;:::-;4416:63;;4372:117;4528:2;4554:53;4599:7;4590:6;4579:9;4575:22;4554:53;:::i;:::-;4544:63;;4499:118;4656:2;4682:53;4727:7;4718:6;4707:9;4703:22;4682:53;:::i;:::-;4672:63;;4627:118;4133:619;;;;;:::o;4758:86::-;4793:7;4833:4;4826:5;4822:16;4811:27;;4758:86;;;:::o;4850:112::-;4933:22;4949:5;4933:22;:::i;:::-;4928:3;4921:35;4850:112;;:::o;4968:214::-;5057:4;5095:2;5084:9;5080:18;5072:26;;5108:67;5172:1;5161:9;5157:17;5148:6;5108:67;:::i;:::-;4968:214;;;;:::o;5188:77::-;5225:7;5254:5;5243:16;;5188:77;;;:::o;5271:118::-;5358:24;5376:5;5358:24;:::i;:::-;5353:3;5346:37;5271:118;;:::o;5395:222::-;5488:4;5526:2;5515:9;5511:18;5503:26;;5539:71;5607:1;5596:9;5592:17;5583:6;5539:71;:::i;:::-;5395:222;;;;:::o;5623:329::-;5682:6;5731:2;5719:9;5710:7;5706:23;5702:32;5699:119;;;5737:79;;:::i;:::-;5699:119;5857:1;5882:53;5927:7;5918:6;5907:9;5903:22;5882:53;:::i;:::-;5872:63;;5828:117;5623:329;;;;:::o;5958:118::-;6045:24;6063:5;6045:24;:::i;:::-;6040:3;6033:37;5958:118;;:::o;6082:222::-;6175:4;6213:2;6202:9;6198:18;6190:26;;6226:71;6294:1;6283:9;6279:17;6270:6;6226:71;:::i;:::-;6082:222;;;;:::o;6310:60::-;6338:3;6359:5;6352:12;;6310:60;;;:::o;6376:142::-;6426:9;6459:53;6477:34;6486:24;6504:5;6486:24;:::i;:::-;6477:34;:::i;:::-;6459:53;:::i;:::-;6446:66;;6376:142;;;:::o;6524:126::-;6574:9;6607:37;6638:5;6607:37;:::i;:::-;6594:50;;6524:126;;;:::o;6656:148::-;6728:9;6761:37;6792:5;6761:37;:::i;:::-;6748:50;;6656:148;;;:::o;6810:175::-;6919:59;6972:5;6919:59;:::i;:::-;6914:3;6907:72;6810:175;;:::o;6991:266::-;7106:4;7144:2;7133:9;7129:18;7121:26;;7157:93;7247:1;7236:9;7232:17;7223:6;7157:93;:::i;:::-;6991:266;;;;:::o;7263:151::-;7338:9;7371:37;7402:5;7371:37;:::i;:::-;7358:50;;7263:151;;;:::o;7420:181::-;7532:62;7588:5;7532:62;:::i;:::-;7527:3;7520:75;7420:181;;:::o;7607:272::-;7725:4;7763:2;7752:9;7748:18;7740:26;;7776:96;7869:1;7858:9;7854:17;7845:6;7776:96;:::i;:::-;7607:272;;;;:::o;7885:474::-;7953:6;7961;8010:2;7998:9;7989:7;7985:23;7981:32;7978:119;;;8016:79;;:::i;:::-;7978:119;8136:1;8161:53;8206:7;8197:6;8186:9;8182:22;8161:53;:::i;:::-;8151:63;;8107:117;8263:2;8289:53;8334:7;8325:6;8314:9;8310:22;8289:53;:::i;:::-;8279:63;;8234:118;7885:474;;;;;:::o;8365:118::-;8436:22;8452:5;8436:22;:::i;:::-;8429:5;8426:33;8416:61;;8473:1;8470;8463:12;8416:61;8365:118;:::o;8489:135::-;8533:5;8571:6;8558:20;8549:29;;8587:31;8612:5;8587:31;:::i;:::-;8489:135;;;;:::o;8630:122::-;8703:24;8721:5;8703:24;:::i;:::-;8696:5;8693:35;8683:63;;8742:1;8739;8732:12;8683:63;8630:122;:::o;8758:139::-;8804:5;8842:6;8829:20;8820:29;;8858:33;8885:5;8858:33;:::i;:::-;8758:139;;;;:::o;8903:1199::-;9014:6;9022;9030;9038;9046;9054;9062;9111:3;9099:9;9090:7;9086:23;9082:33;9079:120;;;9118:79;;:::i;:::-;9079:120;9238:1;9263:53;9308:7;9299:6;9288:9;9284:22;9263:53;:::i;:::-;9253:63;;9209:117;9365:2;9391:53;9436:7;9427:6;9416:9;9412:22;9391:53;:::i;:::-;9381:63;;9336:118;9493:2;9519:53;9564:7;9555:6;9544:9;9540:22;9519:53;:::i;:::-;9509:63;;9464:118;9621:2;9647:53;9692:7;9683:6;9672:9;9668:22;9647:53;:::i;:::-;9637:63;;9592:118;9749:3;9776:51;9819:7;9810:6;9799:9;9795:22;9776:51;:::i;:::-;9766:61;;9720:117;9876:3;9903:53;9948:7;9939:6;9928:9;9924:22;9903:53;:::i;:::-;9893:63;;9847:119;10005:3;10032:53;10077:7;10068:6;10057:9;10053:22;10032:53;:::i;:::-;10022:63;;9976:119;8903:1199;;;;;;;;;;:::o;10108:474::-;10176:6;10184;10233:2;10221:9;10212:7;10208:23;10204:32;10201:119;;;10239:79;;:::i;:::-;10201:119;10359:1;10384:53;10429:7;10420:6;10409:9;10405:22;10384:53;:::i;:::-;10374:63;;10330:117;10486:2;10512:53;10557:7;10548:6;10537:9;10533:22;10512:53;:::i;:::-;10502:63;;10457:118;10108:474;;;;;:::o;10588:93::-;10624:7;10664:10;10657:5;10653:22;10642:33;;10588:93;;;:::o;10687:120::-;10759:23;10776:5;10759:23;:::i;:::-;10752:5;10749:34;10739:62;;10797:1;10794;10787:12;10739:62;10687:120;:::o;10813:137::-;10858:5;10896:6;10883:20;10874:29;;10912:32;10938:5;10912:32;:::i;:::-;10813:137;;;;:::o;10956:327::-;11014:6;11063:2;11051:9;11042:7;11038:23;11034:32;11031:119;;;11069:79;;:::i;:::-;11031:119;11189:1;11214:52;11258:7;11249:6;11238:9;11234:22;11214:52;:::i;:::-;11204:62;;11160:116;10956:327;;;;:::o;11289:153::-;11366:9;11399:37;11430:5;11399:37;:::i;:::-;11386:50;;11289:153;;;:::o;11448:185::-;11562:64;11620:5;11562:64;:::i;:::-;11557:3;11550:77;11448:185;;:::o;11639:276::-;11759:4;11797:2;11786:9;11782:18;11774:26;;11810:98;11905:1;11894:9;11890:17;11881:6;11810:98;:::i;:::-;11639:276;;;;:::o;11921:180::-;11969:77;11966:1;11959:88;12066:4;12063:1;12056:15;12090:4;12087:1;12080:15;12107:320;12151:6;12188:1;12182:4;12178:12;12168:22;;12235:1;12229:4;12225:12;12256:18;12246:81;;12312:4;12304:6;12300:17;12290:27;;12246:81;12374:2;12366:6;12363:14;12343:18;12340:38;12337:84;;12393:18;;:::i;:::-;12337:84;12158:269;12107:320;;;:::o;12433:166::-;12573:18;12569:1;12561:6;12557:14;12550:42;12433:166;:::o;12605:366::-;12747:3;12768:67;12832:2;12827:3;12768:67;:::i;:::-;12761:74;;12844:93;12933:3;12844:93;:::i;:::-;12962:2;12957:3;12953:12;12946:19;;12605:366;;;:::o;12977:419::-;13143:4;13181:2;13170:9;13166:18;13158:26;;13230:9;13224:4;13220:20;13216:1;13205:9;13201:17;13194:47;13258:131;13384:4;13258:131;:::i;:::-;13250:139;;12977:419;;;:::o;13402:162::-;13542:14;13538:1;13530:6;13526:14;13519:38;13402:162;:::o;13570:366::-;13712:3;13733:67;13797:2;13792:3;13733:67;:::i;:::-;13726:74;;13809:93;13898:3;13809:93;:::i;:::-;13927:2;13922:3;13918:12;13911:19;;13570:366;;;:::o;13942:419::-;14108:4;14146:2;14135:9;14131:18;14123:26;;14195:9;14189:4;14185:20;14181:1;14170:9;14166:17;14159:47;14223:131;14349:4;14223:131;:::i;:::-;14215:139;;13942:419;;;:::o;14367:180::-;14415:77;14412:1;14405:88;14512:4;14509:1;14502:15;14536:4;14533:1;14526:15;14553:410;14593:7;14616:20;14634:1;14616:20;:::i;:::-;14611:25;;14650:20;14668:1;14650:20;:::i;:::-;14645:25;;14705:1;14702;14698:9;14727:30;14745:11;14727:30;:::i;:::-;14716:41;;14906:1;14897:7;14893:15;14890:1;14887:22;14867:1;14860:9;14840:83;14817:139;;14936:18;;:::i;:::-;14817:139;14601:362;14553:410;;;;:::o;14969:180::-;15017:77;15014:1;15007:88;15114:4;15111:1;15104:15;15138:4;15135:1;15128:15;15155:185;15195:1;15212:20;15230:1;15212:20;:::i;:::-;15207:25;;15246:20;15264:1;15246:20;:::i;:::-;15241:25;;15285:1;15275:35;;15290:18;;:::i;:::-;15275:35;15332:1;15329;15325:9;15320:14;;15155:185;;;;:::o;15346:85::-;15391:7;15420:5;15409:16;;15346:85;;;:::o;15437:158::-;15495:9;15528:61;15546:42;15555:32;15581:5;15555:32;:::i;:::-;15546:42;:::i;:::-;15528:61;:::i;:::-;15515:74;;15437:158;;;:::o;15601:147::-;15696:45;15735:5;15696:45;:::i;:::-;15691:3;15684:58;15601:147;;:::o;15754:807::-;16003:4;16041:3;16030:9;16026:19;16018:27;;16055:71;16123:1;16112:9;16108:17;16099:6;16055:71;:::i;:::-;16136:72;16204:2;16193:9;16189:18;16180:6;16136:72;:::i;:::-;16218:80;16294:2;16283:9;16279:18;16270:6;16218:80;:::i;:::-;16308;16384:2;16373:9;16369:18;16360:6;16308:80;:::i;:::-;16398:73;16466:3;16455:9;16451:19;16442:6;16398:73;:::i;:::-;16481;16549:3;16538:9;16534:19;16525:6;16481:73;:::i;:::-;15754:807;;;;;;;;;:::o;16567:143::-;16624:5;16655:6;16649:13;16640:22;;16671:33;16698:5;16671:33;:::i;:::-;16567:143;;;;:::o;16716:663::-;16804:6;16812;16820;16869:2;16857:9;16848:7;16844:23;16840:32;16837:119;;;16875:79;;:::i;:::-;16837:119;16995:1;17020:64;17076:7;17067:6;17056:9;17052:22;17020:64;:::i;:::-;17010:74;;16966:128;17133:2;17159:64;17215:7;17206:6;17195:9;17191:22;17159:64;:::i;:::-;17149:74;;17104:129;17272:2;17298:64;17354:7;17345:6;17334:9;17330:22;17298:64;:::i;:::-;17288:74;;17243:129;16716:663;;;;;:::o;17385:143::-;17442:5;17473:6;17467:13;17458:22;;17489:33;17516:5;17489:33;:::i;:::-;17385:143;;;;:::o;17534:351::-;17604:6;17653:2;17641:9;17632:7;17628:23;17624:32;17621:119;;;17659:79;;:::i;:::-;17621:119;17779:1;17804:64;17860:7;17851:6;17840:9;17836:22;17804:64;:::i;:::-;17794:74;;17750:128;17534:351;;;;:::o;17891:332::-;18012:4;18050:2;18039:9;18035:18;18027:26;;18063:71;18131:1;18120:9;18116:17;18107:6;18063:71;:::i;:::-;18144:72;18212:2;18201:9;18197:18;18188:6;18144:72;:::i;:::-;17891:332;;;;;:::o;18229:194::-;18269:4;18289:20;18307:1;18289:20;:::i;:::-;18284:25;;18323:20;18341:1;18323:20;:::i;:::-;18318:25;;18367:1;18364;18360:9;18352:17;;18391:1;18385:4;18382:11;18379:37;;;18396:18;;:::i;:::-;18379:37;18229:194;;;;:::o;18429:170::-;18569:22;18565:1;18557:6;18553:14;18546:46;18429:170;:::o;18605:366::-;18747:3;18768:67;18832:2;18827:3;18768:67;:::i;:::-;18761:74;;18844:93;18933:3;18844:93;:::i;:::-;18962:2;18957:3;18953:12;18946:19;;18605:366;;;:::o;18977:419::-;19143:4;19181:2;19170:9;19166:18;19158:26;;19230:9;19224:4;19220:20;19216:1;19205:9;19201:17;19194:47;19258:131;19384:4;19258:131;:::i;:::-;19250:139;;18977:419;;;:::o;19402:102::-;19444:8;19491:5;19488:1;19484:13;19463:34;;19402:102;;;:::o;19510:848::-;19571:5;19578:4;19602:6;19593:15;;19626:5;19617:14;;19640:712;19661:1;19651:8;19648:15;19640:712;;;19756:4;19751:3;19747:14;19741:4;19738:24;19735:50;;;19765:18;;:::i;:::-;19735:50;19815:1;19805:8;19801:16;19798:451;;;20230:4;20223:5;20219:16;20210:25;;19798:451;20280:4;20274;20270:15;20262:23;;20310:32;20333:8;20310:32;:::i;:::-;20298:44;;19640:712;;;19510:848;;;;;;;:::o;20364:1073::-;20418:5;20609:8;20599:40;;20630:1;20621:10;;20632:5;;20599:40;20658:4;20648:36;;20675:1;20666:10;;20677:5;;20648:36;20744:4;20792:1;20787:27;;;;20828:1;20823:191;;;;20737:277;;20787:27;20805:1;20796:10;;20807:5;;;20823:191;20868:3;20858:8;20855:17;20852:43;;;20875:18;;:::i;:::-;20852:43;20924:8;20921:1;20917:16;20908:25;;20959:3;20952:5;20949:14;20946:40;;;20966:18;;:::i;:::-;20946:40;20999:5;;;20737:277;;21123:2;21113:8;21110:16;21104:3;21098:4;21095:13;21091:36;21073:2;21063:8;21060:16;21055:2;21049:4;21046:12;21042:35;21026:111;21023:246;;;21179:8;21173:4;21169:19;21160:28;;21214:3;21207:5;21204:14;21201:40;;;21221:18;;:::i;:::-;21201:40;21254:5;;21023:246;21294:42;21332:3;21322:8;21316:4;21313:1;21294:42;:::i;:::-;21279:57;;;;21368:4;21363:3;21359:14;21352:5;21349:25;21346:51;;;21377:18;;:::i;:::-;21346:51;21426:4;21419:5;21415:16;21406:25;;20364:1073;;;;;;:::o;21443:281::-;21501:5;21525:23;21543:4;21525:23;:::i;:::-;21517:31;;21569:25;21585:8;21569:25;:::i;:::-;21557:37;;21613:104;21650:66;21640:8;21634:4;21613:104;:::i;:::-;21604:113;;21443:281;;;;:::o;21730:177::-;21870:29;21866:1;21858:6;21854:14;21847:53;21730:177;:::o;21913:366::-;22055:3;22076:67;22140:2;22135:3;22076:67;:::i;:::-;22069:74;;22152:93;22241:3;22152:93;:::i;:::-;22270:2;22265:3;22261:12;22254:19;;21913:366;;;:::o;22285:419::-;22451:4;22489:2;22478:9;22474:18;22466:26;;22538:9;22532:4;22528:20;22524:1;22513:9;22509:17;22502:47;22566:131;22692:4;22566:131;:::i;:::-;22558:139;;22285:419;;;:::o;22710:161::-;22850:13;22846:1;22838:6;22834:14;22827:37;22710:161;:::o;22877:366::-;23019:3;23040:67;23104:2;23099:3;23040:67;:::i;:::-;23033:74;;23116:93;23205:3;23116:93;:::i;:::-;23234:2;23229:3;23225:12;23218:19;;22877:366;;;:::o;23249:419::-;23415:4;23453:2;23442:9;23438:18;23430:26;;23502:9;23496:4;23492:20;23488:1;23477:9;23473:17;23466:47;23530:131;23656:4;23530:131;:::i;:::-;23522:139;;23249:419;;;:::o;23674:173::-;23814:25;23810:1;23802:6;23798:14;23791:49;23674:173;:::o;23853:366::-;23995:3;24016:67;24080:2;24075:3;24016:67;:::i;:::-;24009:74;;24092:93;24181:3;24092:93;:::i;:::-;24210:2;24205:3;24201:12;24194:19;;23853:366;;;:::o;24225:419::-;24391:4;24429:2;24418:9;24414:18;24406:26;;24478:9;24472:4;24468:20;24464:1;24453:9;24449:17;24442:47;24506:131;24632:4;24506:131;:::i;:::-;24498:139;;24225:419;;;:::o;24650:775::-;24883:4;24921:3;24910:9;24906:19;24898:27;;24935:71;25003:1;24992:9;24988:17;24979:6;24935:71;:::i;:::-;25016:72;25084:2;25073:9;25069:18;25060:6;25016:72;:::i;:::-;25098;25166:2;25155:9;25151:18;25142:6;25098:72;:::i;:::-;25180;25248:2;25237:9;25233:18;25224:6;25180:72;:::i;:::-;25262:73;25330:3;25319:9;25315:19;25306:6;25262:73;:::i;:::-;25345;25413:3;25402:9;25398:19;25389:6;25345:73;:::i;:::-;24650:775;;;;;;;;;:::o;25431:148::-;25533:11;25570:3;25555:18;;25431:148;;;;:::o;25585:214::-;25725:66;25721:1;25713:6;25709:14;25702:90;25585:214;:::o;25805:400::-;25965:3;25986:84;26068:1;26063:3;25986:84;:::i;:::-;25979:91;;26079:93;26168:3;26079:93;:::i;:::-;26197:1;26192:3;26188:11;26181:18;;25805:400;;;:::o;26211:79::-;26250:7;26279:5;26268:16;;26211:79;;;:::o;26296:157::-;26401:45;26421:24;26439:5;26421:24;:::i;:::-;26401:45;:::i;:::-;26396:3;26389:58;26296:157;;:::o;26459:663::-;26700:3;26722:148;26866:3;26722:148;:::i;:::-;26715:155;;26880:75;26951:3;26942:6;26880:75;:::i;:::-;26980:2;26975:3;26971:12;26964:19;;26993:75;27064:3;27055:6;26993:75;:::i;:::-;27093:2;27088:3;27084:12;27077:19;;27113:3;27106:10;;26459:663;;;;;:::o;27128:545::-;27301:4;27339:3;27328:9;27324:19;27316:27;;27353:71;27421:1;27410:9;27406:17;27397:6;27353:71;:::i;:::-;27434:68;27498:2;27487:9;27483:18;27474:6;27434:68;:::i;:::-;27512:72;27580:2;27569:9;27565:18;27556:6;27512:72;:::i;:::-;27594;27662:2;27651:9;27647:18;27638:6;27594:72;:::i;:::-;27128:545;;;;;;;:::o;27679:164::-;27819:16;27815:1;27807:6;27803:14;27796:40;27679:164;:::o;27849:366::-;27991:3;28012:67;28076:2;28071:3;28012:67;:::i;:::-;28005:74;;28088:93;28177:3;28088:93;:::i;:::-;28206:2;28201:3;28197:12;28190:19;;27849:366;;;:::o;28221:419::-;28387:4;28425:2;28414:9;28410:18;28402:26;;28474:9;28468:4;28464:20;28460:1;28449:9;28445:17;28438:47;28502:131;28628:4;28502:131;:::i;:::-;28494:139;;28221:419;;;:::o;28646:225::-;28786:34;28782:1;28774:6;28770:14;28763:58;28855:8;28850:2;28842:6;28838:15;28831:33;28646:225;:::o;28877:366::-;29019:3;29040:67;29104:2;29099:3;29040:67;:::i;:::-;29033:74;;29116:93;29205:3;29116:93;:::i;:::-;29234:2;29229:3;29225:12;29218:19;;28877:366;;;:::o;29249:419::-;29415:4;29453:2;29442:9;29438:18;29430:26;;29502:9;29496:4;29492:20;29488:1;29477:9;29473:17;29466:47;29530:131;29656:4;29530:131;:::i;:::-;29522:139;;29249:419;;;:::o;29674:182::-;29814:34;29810:1;29802:6;29798:14;29791:58;29674:182;:::o;29862:366::-;30004:3;30025:67;30089:2;30084:3;30025:67;:::i;:::-;30018:74;;30101:93;30190:3;30101:93;:::i;:::-;30219:2;30214:3;30210:12;30203:19;;29862:366;;;:::o;30234:419::-;30400:4;30438:2;30427:9;30423:18;30415:26;;30487:9;30481:4;30477:20;30473:1;30462:9;30458:17;30451:47;30515:131;30641:4;30515:131;:::i;:::-;30507:139;;30234:419;;;:::o;30659:191::-;30699:3;30718:20;30736:1;30718:20;:::i;:::-;30713:25;;30752:20;30770:1;30752:20;:::i;:::-;30747:25;;30795:1;30792;30788:9;30781:16;;30816:3;30813:1;30810:10;30807:36;;;30823:18;;:::i;:::-;30807:36;30659:191;;;;:::o;30856:180::-;30904:77;30901:1;30894:88;31001:4;30998:1;30991:15;31025:4;31022:1;31015:15;31042:180;31090:77;31087:1;31080:88;31187:4;31184:1;31177:15;31211:4;31208:1;31201:15;31228:114;31295:6;31329:5;31323:12;31313:22;;31228:114;;;:::o;31348:184::-;31447:11;31481:6;31476:3;31469:19;31521:4;31516:3;31512:14;31497:29;;31348:184;;;;:::o;31538:132::-;31605:4;31628:3;31620:11;;31658:4;31653:3;31649:14;31641:22;;31538:132;;;:::o;31676:108::-;31753:24;31771:5;31753:24;:::i;:::-;31748:3;31741:37;31676:108;;:::o;31790:179::-;31859:10;31880:46;31922:3;31914:6;31880:46;:::i;:::-;31958:4;31953:3;31949:14;31935:28;;31790:179;;;;:::o;31975:113::-;32045:4;32077;32072:3;32068:14;32060:22;;31975:113;;;:::o;32124:732::-;32243:3;32272:54;32320:5;32272:54;:::i;:::-;32342:86;32421:6;32416:3;32342:86;:::i;:::-;32335:93;;32452:56;32502:5;32452:56;:::i;:::-;32531:7;32562:1;32547:284;32572:6;32569:1;32566:13;32547:284;;;32648:6;32642:13;32675:63;32734:3;32719:13;32675:63;:::i;:::-;32668:70;;32761:60;32814:6;32761:60;:::i;:::-;32751:70;;32607:224;32594:1;32591;32587:9;32582:14;;32547:284;;;32551:14;32847:3;32840:10;;32248:608;;;32124:732;;;;:::o;32862:831::-;33125:4;33163:3;33152:9;33148:19;33140:27;;33177:71;33245:1;33234:9;33230:17;33221:6;33177:71;:::i;:::-;33258:80;33334:2;33323:9;33319:18;33310:6;33258:80;:::i;:::-;33385:9;33379:4;33375:20;33370:2;33359:9;33355:18;33348:48;33413:108;33516:4;33507:6;33413:108;:::i;:::-;33405:116;;33531:72;33599:2;33588:9;33584:18;33575:6;33531:72;:::i;:::-;33613:73;33681:3;33670:9;33666:19;33657:6;33613:73;:::i;:::-;32862:831;;;;;;;;:::o;33699:147::-;33800:11;33837:3;33822:18;;33699:147;;;;:::o;33852:114::-;;:::o;33972:398::-;34131:3;34152:83;34233:1;34228:3;34152:83;:::i;:::-;34145:90;;34244:93;34333:3;34244:93;:::i;:::-;34362:1;34357:3;34353:11;34346:18;;33972:398;;;:::o;34376:379::-;34560:3;34582:147;34725:3;34582:147;:::i;:::-;34575:154;;34746:3;34739:10;;34376:379;;;:::o;34761:144::-;34813:4;34836:3;34828:11;;34859:3;34856:1;34849:14;34893:4;34890:1;34880:18;34872:26;;34761:144;;;:::o;34933:878::-;35038:3;35075:5;35069:12;35104:36;35130:9;35104:36;:::i;:::-;35156:88;35237:6;35232:3;35156:88;:::i;:::-;35149:95;;35275:1;35264:9;35260:17;35291:1;35286:166;;;;35466:1;35461:344;;;;35253:552;;35286:166;35370:4;35366:9;35355;35351:25;35346:3;35339:38;35432:6;35425:14;35418:22;35410:6;35406:35;35401:3;35397:45;35390:52;;35286:166;;35461:344;35528:41;35563:5;35528:41;:::i;:::-;35591:1;35605:154;35619:6;35616:1;35613:13;35605:154;;;35693:7;35687:14;35683:1;35678:3;35674:11;35667:35;35743:1;35734:7;35730:15;35719:26;;35641:4;35638:1;35634:12;35629:17;;35605:154;;;35788:6;35783:3;35779:16;35772:23;;35468:337;;35253:552;;35042:769;;34933:878;;;;:::o;35817:273::-;35948:3;35970:94;36060:3;36051:6;35970:94;:::i;:::-;35963:101;;36081:3;36074:10;;35817:273;;;;:::o;36096:664::-;36301:4;36339:3;36328:9;36324:19;36316:27;;36353:71;36421:1;36410:9;36406:17;36397:6;36353:71;:::i;:::-;36434:72;36502:2;36491:9;36487:18;36478:6;36434:72;:::i;:::-;36516;36584:2;36573:9;36569:18;36560:6;36516:72;:::i;:::-;36598;36666:2;36655:9;36651:18;36642:6;36598:72;:::i;:::-;36680:73;36748:3;36737:9;36733:19;36724:6;36680:73;:::i;:::-;36096:664;;;;;;;;:::o

Swarm Source

ipfs://69621ad01425e5cb889117274a27cf2f6a18c701509838ece90504206a93299e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.