ETH Price: $3,101.26 (-0.98%)

Token

Coco (COCO)
 

Overview

Max Total Supply

10,000,000 COCO

Holders

175

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
Coco

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-12-21
*/

/*
https://www.cocoai.shop/
https://t.me/coco_portal
https://twitter.com/cocoaiextension
*/
// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;





/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal virtual   {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

// File: contracts/COCO.sol


pragma solidity ^0.8.19;

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

interface IRouter {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        _status = _NOT_ENTERED;
    }

    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}






contract Coco is ERC20, Ownable, ReentrancyGuard {
    IRouter public router;
    address public pair;
    bool public tradingEnabled = false;
    address private developing = 0xCab74347F0205a77b51cb8A50BD43C86563986fB;
    address private team = 0xFC26D14095447b18882882Fd2B3d55Eb0A739484;
    address private marketing = 0xDbFa8e08F99870fa70C0F0064E81B1F9e8B167eB;
    address private buyback = 0xb8af0625F2492405f5751fe58584af734fe4211f;
    mapping(address => bool) public blacklist;
    struct TaxRates {
        uint256 liquidity;
        uint256 marketing;
        uint256 team;
        uint256 buyback;
        uint256 developing;
    }

    TaxRates public taxRates = TaxRates(0, 0, 0, 0, 0);
    uint256 feeDenominator = 10000;
    uint256 public maxWalletSize;
    uint256 public swapTokenAtAmount;
    mapping(address => bool) public automatedMarketMakerPairs;

    address public constant deadWallet =
        0x000000000000000000000000000000000000dEaD;
    mapping(address => bool) public exemptFee;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;
    uint256 public startBlock;
    bool private _isSwapping;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    constructor() ERC20("Coco", "COCO") Ownable(msg.sender) {
        uint256 initialSupply = 10_000_000 * 10 ** decimals();
        _mint(msg.sender, initialSupply); 
        maxWalletSize = (totalSupply() * 1) / 100; // 1% of the supply
       swapTokenAtAmount = (totalSupply() * 1) / 1000; // 0.1% of total supply
        router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pair = IFactory(router.factory()).createPair(
            address(this),
            router.WETH()
        );
        automatedMarketMakerPairs[pair] = true;

        _approve(address(this), address(router), type(uint256).max);
        exemptFee[address(this)] = true;
        exemptFee[msg.sender] = true;

        exemptFee[developing] = true;
        exemptFee[team] = true;
        exemptFee[marketing] = true;
        exemptFee[buyback] = true;
        exemptFee[deadWallet] = true;
        exemptFee[0xD152f549545093347A162Dce210e7293f1452150] = true;
        exemptFee[0x663A5C229c09b049E36dCc11a9B0d4a8Eb9db214] = true;

        _isExcludedMaxTransactionAmount[address(this)] = true;
        excludeFromMaxTransaction(msg.sender, true);
        excludeFromMaxTransaction(developing, true);
        excludeFromMaxTransaction(marketing, true);
        excludeFromMaxTransaction(buyback, true);
        excludeFromMaxTransaction(team, true);
        excludeFromMaxTransaction(pair, true);
    }

    function setTradingEnabled() external onlyOwner {
        require(!tradingEnabled, "Trade is already enabled");
        tradingEnabled = true;
        startBlock = block.number;
    }

    function rescueETH() external {
        address payable ownerAddress = payable(marketing);
        ownerAddress.transfer(address(this).balance);
    }

  

    function transfer(
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal override {
        require(amount > 0, "Transfer amount must be greater than zero");
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        if (exemptFee[sender] || exemptFee[recipient]) {
            super._transfer(sender, recipient, amount);
        } else {
            require(tradingEnabled, "Trading is not enabled");
            uint256 blockDelta = block.number - startBlock;
            require(blacklist[sender] == false, "Sender is blacklisted");

            if (blockDelta <= 1) {
                blacklist[recipient] = true;
            }
            // when buy
            if (
                automatedMarketMakerPairs[sender] &&
                !_isExcludedMaxTransactionAmount[recipient]
            ) {
                require(
                    amount <= maxWalletSize,
                    "Buy transfer amount exceeds the maxTransactionAmount."
                );
                require(
                    amount + balanceOf(recipient) <= maxWalletSize,
                    "Max wallet exceeded"
                );
            }
            //when sell
            else if (
                automatedMarketMakerPairs[recipient] &&
                !_isExcludedMaxTransactionAmount[sender]
            ) {
                require(
                    amount <= maxWalletSize,
                    "Sell transfer amount exceeds the maxTransactionAmount."
                );
            } else if (!_isExcludedMaxTransactionAmount[recipient]) {
                require(
                    amount + balanceOf(recipient) <= maxWalletSize,
                    "Max wallet exceeded"
                );
            }

            
            uint256 contractTokenBalance = balanceOf(address(this));
            bool canSwap = contractTokenBalance >= swapTokenAtAmount;
            if (canSwap && !_isSwapping && !automatedMarketMakerPairs[sender]) {
                _isSwapping = true;
                distributeTaxes(contractTokenBalance);

                _isSwapping = false;
            }

            uint256 taxRate = taxRates.liquidity +
                taxRates.marketing +
                taxRates.team +
                taxRates.buyback +
                taxRates.developing;

            uint256 taxAmount = (amount * taxRate) / feeDenominator;
            uint256 transferAmount = amount - taxAmount;

            super._transfer(sender, address(this), taxAmount);
            super._transfer(sender, recipient, transferAmount);
        }
    }

    function swapAndLiquify(uint256 amountToken) private {
        uint256 half = amountToken / 2;
        uint256 otherHalf = amountToken - half;
        uint256 initialBalance = address(this).balance;

       if(half > 0){
         _swapTokensForEth(half);
       }

        uint256 newBalance = address(this).balance - initialBalance;
        _approve(address(this), address(router), otherHalf);

        try
            router.addLiquidityETH{value: newBalance}(
                address(this),
                otherHalf,
                0,
                0,
                address(0),
                block.timestamp
            )
        {} catch {}
    }

    function distributeTaxes(uint256 contractTokenBalance) internal {
        uint256 totalTaxRate = taxRates.liquidity +
            taxRates.marketing +
            taxRates.team +
            taxRates.buyback +
            taxRates.developing;

        uint256 liquidityTaxRatio = (taxRates.liquidity * 100) / totalTaxRate;
        uint256 marketingTaxRatio = (taxRates.marketing * 100) / totalTaxRate;
        uint256 teamTaxRatio = (taxRates.team * 100) / totalTaxRate;
        uint256 buybackTaxRatio = (taxRates.buyback * 100) / totalTaxRate;
        uint256 developingTaxRatio = (taxRates.developing * 100) / totalTaxRate;

        uint256 liquidityTaxIntokens = (contractTokenBalance *
            liquidityTaxRatio) / 100;

        uint256 remaningTokens = contractTokenBalance - liquidityTaxIntokens;
        if(remaningTokens > 0){
        _swapTokensForEth(remaningTokens);
        }
        if (liquidityTaxRatio > 0) {
            swapAndLiquify(liquidityTaxIntokens);
        }
        uint256 remainingEth = address(this).balance;
        uint256 marketingEth = (remainingEth * marketingTaxRatio) / 100;
        uint256 teamEth = (remainingEth * teamTaxRatio) / 100;
        uint256 buybackEth = (remainingEth * buybackTaxRatio) / 100;
        uint256 developingEth = (remainingEth * developingTaxRatio) / 100;
        if (teamTaxRatio > 0) {
            sendETH(team, teamEth);
        }
        if (marketingTaxRatio > 0) {
            sendETH(marketing, marketingEth);
        }
        if (developingTaxRatio > 0) {
            sendETH(developing, developingEth);
        }
        if (buybackTaxRatio > 0) {
            sendETH(buyback, buybackEth);
        }
    }

    function sendETH(
        address _to,
        uint256 amount
    ) internal nonReentrant returns (bool) {
        if (address(this).balance < amount) return false;

        (bool success, ) = payable(_to).call{value: amount}("");

        return success;
    }

    function changeTax(
        uint256 newLiquidityTax,
        uint256 newMarketingTax,
        uint256 newTeamTax,
        uint256 newBuybackTax,
        uint256 newDevelopingTax
    ) external onlyOwner {
        require(
            newLiquidityTax + newMarketingTax + newTeamTax + newBuybackTax <
                2501,
            "Tax should be less than 25%"
        );
        taxRates.liquidity = newLiquidityTax;
        taxRates.marketing = newMarketingTax;
        taxRates.team = newTeamTax;
        taxRates.buyback = newBuybackTax;
        taxRates.developing = newDevelopingTax;
    }

    function setAutomatedMarketMakerPair(
        address lpPair,
        bool value
    ) external onlyOwner {
        require(
            pair != lpPair,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address lpPair, bool value) private {
        automatedMarketMakerPairs[lpPair] = value;
        emit SetAutomatedMarketMakerPair(lpPair, value);
    }

    function _swapTokensForEth(uint256 tokenAmount) private {
        _approve(address(this), address(router), tokenAmount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        try
            router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                tokenAmount,
                0,
                path,
                address(this),
                block.timestamp
            )
        {} catch {}
    }

    function AddExemptFee(address _address) external onlyOwner {
        exemptFee[_address] = true;
    }

    function RemoveExemptFee(address _address) external onlyOwner {
        exemptFee[_address] = false;
    }

    

    function removeBlacklist(address _address) external onlyOwner {
        blacklist[_address] = false;
    }

     function changeSwapTokenAtAmount(uint256 newAmount) external onlyOwner {
        require(
            newAmount > totalSupply() / 100_000 &&
                newAmount < (totalSupply() / 100),
            "Amount should be greater than 0.001% and less than 1% of total supply"
        );
        swapTokenAtAmount = newAmount;
    }

   

    function increaseMaxWalletByPercentage(
        uint256 percentage
    ) external onlyOwner {
        require(
            percentage >= 100,
            "Percentage must be greater than or equal to 1%"
        );
        maxWalletSize = (totalSupply() * percentage) / 10000; // percentage of the supply
    }

    function excludeFromMaxTransaction(
        address updAds,
        bool isEx
    ) public onlyOwner {
        require(updAds != address(this));
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"AddExemptFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"RemoveExemptFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"changeSwapTokenAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLiquidityTax","type":"uint256"},{"internalType":"uint256","name":"newMarketingTax","type":"uint256"},{"internalType":"uint256","name":"newTeamTax","type":"uint256"},{"internalType":"uint256","name":"newBuybackTax","type":"uint256"},{"internalType":"uint256","name":"newDevelopingTax","type":"uint256"}],"name":"changeTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"increaseMaxWalletByPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpPair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setTradingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokenAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxRates","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"team","type":"uint256"},{"internalType":"uint256","name":"buyback","type":"uint256"},{"internalType":"uint256","name":"developing","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","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":"value","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"}]

60806040525f600860146101000a81548160ff02191690831515021790555073cab74347f0205a77b51cb8a50bd43c86563986fb60095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073fc26d14095447b18882882fd2b3d55eb0a739484600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073dbfa8e08f99870fa70c0f0064e81b1f9e8b167eb600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b8af0625f2492405f5751fe58584af734fe4211f600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060a001604052805f81526020015f81526020015f81526020015f81526020015f815250600e5f820151815f0155602082015181600101556040820151816002015560608201518160030155608082015181600401555050612710601355348015620001db575f80fd5b50336040518060400160405280600481526020017f436f636f000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f434f434f0000000000000000000000000000000000000000000000000000000081525081600390816200025a919062001508565b5080600490816200026c919062001508565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620002e2575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620002d991906200162f565b60405180910390fd5b620002f38162000bbf60201b60201c565b5060016006819055505f6200030d62000c8260201b60201c565b600a6200031b9190620017d3565b629896806200032b919062001823565b90506200033f338262000c8a60201b60201c565b606460016200035362000d1460201b60201c565b6200035f919062001823565b6200036b91906200189a565b6014819055506103e860016200038662000d1460201b60201c565b62000392919062001823565b6200039e91906200189a565b601581905550737a250d5630b4cf539739df2c5dacb4c659f2488d60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000463573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000489919062001904565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000510573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000536919062001904565b6040518363ffffffff1660e01b81526004016200055592919062001934565b6020604051808303815f875af115801562000572573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000598919062001904565b60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160165f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620006a13060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62000d1d60201b60201c565b600160175f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160175f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160175f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160175f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160175f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160175f600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160175f61dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160175f73d152f549545093347a162dce210e7293f145215073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160175f73663a5c229c09b049e36dcc11a9b0d4a8eb9db21473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160185f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555062000ab433600162000d3760201b60201c565b62000ae860095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600162000d3760201b60201c565b62000b1c600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600162000d3760201b60201c565b62000b50600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600162000d3760201b60201c565b62000b84600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600162000d3760201b60201c565b62000bb860085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600162000d3760201b60201c565b5062001a00565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6012905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000cfd575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040162000cf491906200162f565b60405180910390fd5b62000d105f838362000dd760201b60201c565b5050565b5f600254905090565b62000d32838383600162000ffb60201b60201c565b505050565b62000d47620011d360201b60201c565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000d7f575f80fd5b8060185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000e2b578060025f82825462000e1e91906200195f565b9250508190555062000efc565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101562000eb7578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040162000eae93929190620019aa565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000f45578060025f828254039250508190555062000f8f565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000fee9190620019e5565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036200106e575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016200106591906200162f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620010e1575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401620010d891906200162f565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015620011cd578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051620011c49190620019e5565b60405180910390a35b50505050565b620011e36200127560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620012096200127c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200127357620012356200127560201b60201c565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016200126a91906200162f565b60405180910390fd5b565b5f33905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200132057607f821691505b602082108103620013365762001335620012db565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200139a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200135d565b620013a686836200135d565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620013f0620013ea620013e484620013be565b620013c7565b620013be565b9050919050565b5f819050919050565b6200140b83620013d0565b620014236200141a82620013f7565b84845462001369565b825550505050565b5f90565b620014396200142b565b6200144681848462001400565b505050565b5b818110156200146d57620014615f826200142f565b6001810190506200144c565b5050565b601f821115620014bc5762001486816200133c565b62001491846200134e565b81016020851015620014a1578190505b620014b9620014b0856200134e565b8301826200144b565b50505b505050565b5f82821c905092915050565b5f620014de5f1984600802620014c1565b1980831691505092915050565b5f620014f88383620014cd565b9150826002028217905092915050565b6200151382620012a4565b67ffffffffffffffff8111156200152f576200152e620012ae565b5b6200153b825462001308565b6200154882828562001471565b5f60209050601f8311600181146200157e575f841562001569578287015190505b620015758582620014eb565b865550620015e4565b601f1984166200158e866200133c565b5f5b82811015620015b75784890151825560018201915060208501945060208101905062001590565b86831015620015d75784890151620015d3601f891682620014cd565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200161782620015ec565b9050919050565b62001629816200160b565b82525050565b5f602082019050620016445f8301846200161e565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b6001851115620016d457808604811115620016ac57620016ab6200164a565b5b6001851615620016bc5780820291505b8081029050620016cc8562001677565b94506200168c565b94509492505050565b5f82620016ee5760019050620017c0565b81620016fd575f9050620017c0565b8160018114620017165760028114620017215762001757565b6001915050620017c0565b60ff8411156200173657620017356200164a565b5b8360020a91508482111562001750576200174f6200164a565b5b50620017c0565b5060208310610133831016604e8410600b8410161715620017915782820a9050838111156200178b576200178a6200164a565b5b620017c0565b620017a0848484600162001683565b92509050818404811115620017ba57620017b96200164a565b5b81810290505b9392505050565b5f60ff82169050919050565b5f620017df82620013be565b9150620017ec83620017c7565b92506200181b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620016dd565b905092915050565b5f6200182f82620013be565b91506200183c83620013be565b92508282026200184c81620013be565b915082820484148315176200186657620018656200164a565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f620018a682620013be565b9150620018b383620013be565b925082620018c657620018c56200186d565b5b828204905092915050565b5f80fd5b620018e0816200160b565b8114620018eb575f80fd5b50565b5f81519050620018fe81620018d5565b92915050565b5f602082840312156200191c576200191b620018d1565b5b5f6200192b84828501620018ee565b91505092915050565b5f604082019050620019495f8301856200161e565b6200195860208301846200161e565b9392505050565b5f6200196b82620013be565b91506200197883620013be565b92508282019050808211156200199357620019926200164a565b5b92915050565b620019a481620013be565b82525050565b5f606082019050620019bf5f8301866200161e565b620019ce602083018562001999565b620019dd604083018462001999565b949350505050565b5f602082019050620019fa5f83018462001999565b92915050565b61373c8062001a0e5f395ff3fe6080604052600436106101fc575f3560e01c806385141a771161010c578063b62496f51161009f578063eb91e6511161006e578063eb91e65114610715578063ebf3aefc1461073d578063f2fde38b14610765578063f887ea401461078d578063f9f92be4146107b757610203565b8063b62496f51461064b578063c5d32bb214610687578063dd62ed3e146106c3578063e156afd5146106ff57610203565b80639a7a23d6116100db5780639a7a23d614610595578063a8aa1b31146105bd578063a9059cbb146105e7578063b3bd21271461062357610203565b806385141a77146104ed5780638da5cb5b146105175780638f3fa8601461054157806395d89b411461056b57610203565b8063313ce5671161018f5780635dbdb7e31161015e5780635dbdb7e31461042357806370a082311461044b578063715018a6146104875780637571336a1461049d578063832c2bd2146104c557610203565b8063313ce56714610377578063333f4b3d146103a157806348cd4cb1146103cf5780634ada218b146103f957610203565b806318160ddd116101cb57806318160ddd146102d35780632024eee3146102fd57806320800a001461032557806323b872dd1461033b57610203565b806303e403b01461020757806306fdde0314610231578063095ea7b31461025b57806310d5de531461029757610203565b3661020357005b5f80fd5b348015610212575f80fd5b5061021b6107f3565b60405161022891906126b8565b60405180910390f35b34801561023c575f80fd5b506102456107f9565b604051610252919061275b565b60405180910390f35b348015610266575f80fd5b50610281600480360381019061027c9190612803565b610889565b60405161028e919061285b565b60405180910390f35b3480156102a2575f80fd5b506102bd60048036038101906102b89190612874565b6108ab565b6040516102ca919061285b565b60405180910390f35b3480156102de575f80fd5b506102e76108c8565b6040516102f491906126b8565b60405180910390f35b348015610308575f80fd5b50610323600480360381019061031e919061289f565b6108d1565b005b348015610330575f80fd5b50610339610958565b005b348015610346575f80fd5b50610361600480360381019061035c91906128ca565b6109c4565b60405161036e919061285b565b60405180910390f35b348015610382575f80fd5b5061038b6109f2565b6040516103989190612935565b60405180910390f35b3480156103ac575f80fd5b506103b56109fa565b6040516103c695949392919061294e565b60405180910390f35b3480156103da575f80fd5b506103e3610a1d565b6040516103f091906126b8565b60405180910390f35b348015610404575f80fd5b5061040d610a23565b60405161041a919061285b565b60405180910390f35b34801561042e575f80fd5b5061044960048036038101906104449190612874565b610a36565b005b348015610456575f80fd5b50610471600480360381019061046c9190612874565b610a96565b60405161047e91906126b8565b60405180910390f35b348015610492575f80fd5b5061049b610adb565b005b3480156104a8575f80fd5b506104c360048036038101906104be91906129c9565b610aee565b005b3480156104d0575f80fd5b506104eb60048036038101906104e69190612874565b610b85565b005b3480156104f8575f80fd5b50610501610be4565b60405161050e9190612a16565b60405180910390f35b348015610522575f80fd5b5061052b610bea565b6040516105389190612a16565b60405180910390f35b34801561054c575f80fd5b50610555610c12565b60405161056291906126b8565b60405180910390f35b348015610576575f80fd5b5061057f610c18565b60405161058c919061275b565b60405180910390f35b3480156105a0575f80fd5b506105bb60048036038101906105b691906129c9565b610ca8565b005b3480156105c8575f80fd5b506105d1610d6e565b6040516105de9190612a16565b60405180910390f35b3480156105f2575f80fd5b5061060d60048036038101906106089190612803565b610d93565b60405161061a919061285b565b60405180910390f35b34801561062e575f80fd5b5061064960048036038101906106449190612a2f565b610da9565b005b348015610656575f80fd5b50610671600480360381019061066c9190612874565b610e4e565b60405161067e919061285b565b60405180910390f35b348015610692575f80fd5b506106ad60048036038101906106a89190612874565b610e6b565b6040516106ba919061285b565b60405180910390f35b3480156106ce575f80fd5b506106e960048036038101906106e49190612aa6565b610e88565b6040516106f691906126b8565b60405180910390f35b34801561070a575f80fd5b50610713610f0a565b005b348015610720575f80fd5b5061073b60048036038101906107369190612874565b610f86565b005b348015610748575f80fd5b50610763600480360381019061075e919061289f565b610fe5565b005b348015610770575f80fd5b5061078b60048036038101906107869190612874565b61105a565b005b348015610798575f80fd5b506107a16110de565b6040516107ae9190612b3f565b60405180910390f35b3480156107c2575f80fd5b506107dd60048036038101906107d89190612874565b611103565b6040516107ea919061285b565b60405180910390f35b60155481565b60606003805461080890612b85565b80601f016020809104026020016040519081016040528092919081815260200182805461083490612b85565b801561087f5780601f106108565761010080835404028352916020019161087f565b820191905f5260205f20905b81548152906001019060200180831161086257829003601f168201915b5050505050905090565b5f80610893611120565b90506108a0818585611127565b600191505092915050565b6018602052805f5260405f205f915054906101000a900460ff1681565b5f600254905090565b6108d9611139565b620186a06108e56108c8565b6108ef9190612c0f565b8111801561090f575060646109026108c8565b61090c9190612c0f565b81105b61094e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094590612cd5565b60405180910390fd5b8060158190555050565b5f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f193505050501580156109c0573d5f803e3d5ffd5b5050565b5f806109ce611120565b90506109db8582856111c0565b6109e6858585611252565b60019150509392505050565b5f6012905090565b600e805f0154908060010154908060020154908060030154908060040154905085565b60195481565b600860149054906101000a900460ff1681565b610a3e611139565b600160175f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610ae3611139565b610aec5f61199e565b565b610af6611139565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b2d575f80fd5b8060185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b610b8d611139565b5f60175f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b61dead81565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60145481565b606060048054610c2790612b85565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5390612b85565b8015610c9e5780601f10610c7557610100808354040283529160200191610c9e565b820191905f5260205f20905b815481529060010190602001808311610c8157829003601f168201915b5050505050905090565b610cb0611139565b8173ffffffffffffffffffffffffffffffffffffffff1660085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3690612d63565b60405180910390fd5b610d6a60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611a61565b5050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f610d9f338484611252565b6001905092915050565b610db1611139565b6109c582848688610dc29190612d81565b610dcc9190612d81565b610dd69190612d81565b10610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d90612dfe565b60405180910390fd5b84600e5f018190555083600e6001018190555082600e6002018190555081600e6003018190555080600e600401819055505050505050565b6016602052805f5260405f205f915054906101000a900460ff1681565b6017602052805f5260405f205f915054906101000a900460ff1681565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610f12611139565b600860149054906101000a900460ff1615610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990612e66565b60405180910390fd5b6001600860146101000a81548160ff02191690831515021790555043601981905550565b610f8e611139565b5f600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b610fed611139565b6064811015611031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102890612ef4565b60405180910390fd5b6127108161103d6108c8565b6110479190612f12565b6110519190612c0f565b60148190555050565b611062611139565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110d2575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016110c99190612a16565b60405180910390fd5b6110db8161199e565b50565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d602052805f5260405f205f915054906101000a900460ff1681565b5f33905090565b6111348383836001611aff565b505050565b611141611120565b73ffffffffffffffffffffffffffffffffffffffff1661115f610bea565b73ffffffffffffffffffffffffffffffffffffffff16146111be57611182611120565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016111b59190612a16565b60405180910390fd5b565b5f6111cb8484610e88565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461124c578181101561123d578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161123493929190612f53565b60405180910390fd5b61124b84848484035f611aff565b5b50505050565b5f8111611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b90612ff8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611302576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f990613086565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136790613114565b60405180910390fd5b60175f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168061140b575060175f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b156114205761141b838383611cce565b611999565b600860149054906101000a900460ff1661146f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114669061317c565b60405180910390fd5b5f6019544361147e919061319a565b90505f1515600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615151461150f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150690613217565b60405180910390fd5b6001811161156d576001600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b60165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561160a575060185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156116b157601454821115611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b906132a5565b60405180910390fd5b60145461166084610a96565b8361166b9190612d81565b11156116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a39061330d565b60405180910390fd5b611846565b60165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561174e575060185f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561179d57601454821115611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f9061339b565b60405180910390fd5b611845565b60185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611844576014546117f784610a96565b836118029190612d81565b1115611843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183a9061330d565b60405180910390fd5b5b5b5b5f61185030610a96565b90505f60155482101590508080156118745750601a5f9054906101000a900460ff16155b80156118c7575060165f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611909576001601a5f6101000a81548160ff0219169083151502179055506118ef82611dbe565b5f601a5f6101000a81548160ff0219169083151502179055505b5f600e60040154600e60030154600e60020154600e60010154600e5f01546119319190612d81565b61193b9190612d81565b6119459190612d81565b61194f9190612d81565b90505f60135482876119619190612f12565b61196b9190612c0f565b90505f818761197a919061319a565b9050611987893084611cce565b611992898983611cce565b5050505050505b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b6f575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611b669190612a16565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bdf575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611bd69190612a16565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611cc8578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611cbf91906126b8565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d3e575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611d359190612a16565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dae575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611da59190612a16565b60405180910390fd5b611db9838383612047565b505050565b5f600e60040154600e60030154600e60020154600e60010154600e5f0154611de69190612d81565b611df09190612d81565b611dfa9190612d81565b611e049190612d81565b90505f816064600e5f0154611e199190612f12565b611e239190612c0f565b90505f826064600e60010154611e399190612f12565b611e439190612c0f565b90505f836064600e60020154611e599190612f12565b611e639190612c0f565b90505f846064600e60030154611e799190612f12565b611e839190612c0f565b90505f856064600e60040154611e999190612f12565b611ea39190612c0f565b90505f60648689611eb49190612f12565b611ebe9190612c0f565b90505f8189611ecd919061319a565b90505f811115611ee157611ee081612260565b5b5f871115611ef357611ef282612492565b5b5f4790505f60648883611f069190612f12565b611f109190612c0f565b90505f60648884611f219190612f12565b611f2b9190612c0f565b90505f60648885611f3c9190612f12565b611f469190612c0f565b90505f60648886611f579190612f12565b611f619190612c0f565b90505f8a1115611f9857611f96600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846125b3565b505b5f8b1115611fcd57611fcb600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856125b3565b505b5f8811156120025761200060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826125b3565b505b5f89111561203757612035600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836125b3565b505b5050505050505050505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612097578060025f82825461208b9190612d81565b92505081905550612165565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612120578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161211793929190612f53565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121ac578060025f82825403925050819055506121f6565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161225391906126b8565b60405180910390a3505050565b61228c3060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611127565b5f600267ffffffffffffffff8111156122a8576122a76133b9565b5b6040519080825280602002602001820160405280156122d65781602001602082028036833780820191505090505b50905030815f815181106122ed576122ec6133e6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612391573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123b59190613427565b816001815181106123c9576123c86133e6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612465959493929190613542565b5f604051808303815f87803b15801561247c575f80fd5b505af192505050801561248d575060015b505050565b5f6002826124a09190612c0f565b90505f81836124af919061319a565b90505f4790505f8311156124c7576124c683612260565b5b5f81476124d4919061319a565b90506125023060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685611127565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198230865f805f426040518863ffffffff1660e01b81526004016125679695949392919061359a565b60606040518083038185885af1935050505080156125a357506040513d601f19601f820116820180604052508101906125a0919061360d565b60015b156125ac575050505b5050505050565b5f6125bc612647565b814710156125cc575f9050612639565b5f8373ffffffffffffffffffffffffffffffffffffffff16836040516125f19061368a565b5f6040518083038185875af1925050503d805f811461262b576040519150601f19603f3d011682016040523d82523d5f602084013e612630565b606091505b50509050809150505b612641612696565b92915050565b60026006540361268c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612683906136e8565b60405180910390fd5b6002600681905550565b6001600681905550565b5f819050919050565b6126b2816126a0565b82525050565b5f6020820190506126cb5f8301846126a9565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156127085780820151818401526020810190506126ed565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61272d826126d1565b61273781856126db565b93506127478185602086016126eb565b61275081612713565b840191505092915050565b5f6020820190508181035f8301526127738184612723565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6127a88261277f565b9050919050565b6127b88161279e565b81146127c2575f80fd5b50565b5f813590506127d3816127af565b92915050565b6127e2816126a0565b81146127ec575f80fd5b50565b5f813590506127fd816127d9565b92915050565b5f80604083850312156128195761281861277b565b5b5f612826858286016127c5565b9250506020612837858286016127ef565b9150509250929050565b5f8115159050919050565b61285581612841565b82525050565b5f60208201905061286e5f83018461284c565b92915050565b5f602082840312156128895761288861277b565b5b5f612896848285016127c5565b91505092915050565b5f602082840312156128b4576128b361277b565b5b5f6128c1848285016127ef565b91505092915050565b5f805f606084860312156128e1576128e061277b565b5b5f6128ee868287016127c5565b93505060206128ff868287016127c5565b9250506040612910868287016127ef565b9150509250925092565b5f60ff82169050919050565b61292f8161291a565b82525050565b5f6020820190506129485f830184612926565b92915050565b5f60a0820190506129615f8301886126a9565b61296e60208301876126a9565b61297b60408301866126a9565b61298860608301856126a9565b61299560808301846126a9565b9695505050505050565b6129a881612841565b81146129b2575f80fd5b50565b5f813590506129c38161299f565b92915050565b5f80604083850312156129df576129de61277b565b5b5f6129ec858286016127c5565b92505060206129fd858286016129b5565b9150509250929050565b612a108161279e565b82525050565b5f602082019050612a295f830184612a07565b92915050565b5f805f805f60a08688031215612a4857612a4761277b565b5b5f612a55888289016127ef565b9550506020612a66888289016127ef565b9450506040612a77888289016127ef565b9350506060612a88888289016127ef565b9250506080612a99888289016127ef565b9150509295509295909350565b5f8060408385031215612abc57612abb61277b565b5b5f612ac9858286016127c5565b9250506020612ada858286016127c5565b9150509250929050565b5f819050919050565b5f612b07612b02612afd8461277f565b612ae4565b61277f565b9050919050565b5f612b1882612aed565b9050919050565b5f612b2982612b0e565b9050919050565b612b3981612b1f565b82525050565b5f602082019050612b525f830184612b30565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612b9c57607f821691505b602082108103612baf57612bae612b58565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612c19826126a0565b9150612c24836126a0565b925082612c3457612c33612bb5565b5b828204905092915050565b7f416d6f756e742073686f756c642062652067726561746572207468616e20302e5f8201527f3030312520616e64206c657373207468616e203125206f6620746f74616c207360208201527f7570706c79000000000000000000000000000000000000000000000000000000604082015250565b5f612cbf6045836126db565b9150612cca82612c3f565b606082019050919050565b5f6020820190508181035f830152612cec81612cb3565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d205f8201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b5f612d4d6039836126db565b9150612d5882612cf3565b604082019050919050565b5f6020820190508181035f830152612d7a81612d41565b9050919050565b5f612d8b826126a0565b9150612d96836126a0565b9250828201905080821115612dae57612dad612be2565b5b92915050565b7f5461782073686f756c64206265206c657373207468616e2032352500000000005f82015250565b5f612de8601b836126db565b9150612df382612db4565b602082019050919050565b5f6020820190508181035f830152612e1581612ddc565b9050919050565b7f547261646520697320616c726561647920656e61626c656400000000000000005f82015250565b5f612e506018836126db565b9150612e5b82612e1c565b602082019050919050565b5f6020820190508181035f830152612e7d81612e44565b9050919050565b7f50657263656e74616765206d7573742062652067726561746572207468616e205f8201527f6f7220657175616c20746f203125000000000000000000000000000000000000602082015250565b5f612ede602e836126db565b9150612ee982612e84565b604082019050919050565b5f6020820190508181035f830152612f0b81612ed2565b9050919050565b5f612f1c826126a0565b9150612f27836126a0565b9250828202612f35816126a0565b91508282048414831517612f4c57612f4b612be2565b5b5092915050565b5f606082019050612f665f830186612a07565b612f7360208301856126a9565b612f8060408301846126a9565b949350505050565b7f5472616e7366657220616d6f756e74206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f612fe26029836126db565b9150612fed82612f88565b604082019050919050565b5f6020820190508181035f83015261300f81612fd6565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6130706025836126db565b915061307b82613016565b604082019050919050565b5f6020820190508181035f83015261309d81613064565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6130fe6023836126db565b9150613109826130a4565b604082019050919050565b5f6020820190508181035f83015261312b816130f2565b9050919050565b7f54726164696e67206973206e6f7420656e61626c6564000000000000000000005f82015250565b5f6131666016836126db565b915061317182613132565b602082019050919050565b5f6020820190508181035f8301526131938161315a565b9050919050565b5f6131a4826126a0565b91506131af836126a0565b92508282039050818111156131c7576131c6612be2565b5b92915050565b7f53656e64657220697320626c61636b6c697374656400000000000000000000005f82015250565b5f6132016015836126db565b915061320c826131cd565b602082019050919050565b5f6020820190508181035f83015261322e816131f5565b9050919050565b7f427579207472616e7366657220616d6f756e74206578636565647320746865205f8201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b5f61328f6035836126db565b915061329a82613235565b604082019050919050565b5f6020820190508181035f8301526132bc81613283565b9050919050565b7f4d61782077616c6c6574206578636565646564000000000000000000000000005f82015250565b5f6132f76013836126db565b9150613302826132c3565b602082019050919050565b5f6020820190508181035f830152613324816132eb565b9050919050565b7f53656c6c207472616e7366657220616d6f756e742065786365656473207468655f8201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b5f6133856036836126db565b91506133908261332b565b604082019050919050565b5f6020820190508181035f8301526133b281613379565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050613421816127af565b92915050565b5f6020828403121561343c5761343b61277b565b5b5f61344984828501613413565b91505092915050565b5f819050919050565b5f61347561347061346b84613452565b612ae4565b6126a0565b9050919050565b6134858161345b565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6134bd8161279e565b82525050565b5f6134ce83836134b4565b60208301905092915050565b5f602082019050919050565b5f6134f08261348b565b6134fa8185613495565b9350613505836134a5565b805f5b8381101561353557815161351c88826134c3565b9750613527836134da565b925050600181019050613508565b5085935050505092915050565b5f60a0820190506135555f8301886126a9565b613562602083018761347c565b818103604083015261357481866134e6565b90506135836060830185612a07565b61359060808301846126a9565b9695505050505050565b5f60c0820190506135ad5f830189612a07565b6135ba60208301886126a9565b6135c7604083018761347c565b6135d4606083018661347c565b6135e16080830185612a07565b6135ee60a08301846126a9565b979650505050505050565b5f81519050613607816127d9565b92915050565b5f805f606084860312156136245761362361277b565b5b5f613631868287016135f9565b9350506020613642868287016135f9565b9250506040613653868287016135f9565b9150509250925092565b5f81905092915050565b50565b5f6136755f8361365d565b915061368082613667565b5f82019050919050565b5f6136948261366a565b9150819050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6136d2601f836126db565b91506136dd8261369e565b602082019050919050565b5f6020820190508181035f8301526136ff816136c6565b905091905056fea264697066735822122073f39b6819a3e126375ae1d731f15d3198516cd36144a683c38307a6e6933f2164736f6c63430008150033

Deployed Bytecode

0x6080604052600436106101fc575f3560e01c806385141a771161010c578063b62496f51161009f578063eb91e6511161006e578063eb91e65114610715578063ebf3aefc1461073d578063f2fde38b14610765578063f887ea401461078d578063f9f92be4146107b757610203565b8063b62496f51461064b578063c5d32bb214610687578063dd62ed3e146106c3578063e156afd5146106ff57610203565b80639a7a23d6116100db5780639a7a23d614610595578063a8aa1b31146105bd578063a9059cbb146105e7578063b3bd21271461062357610203565b806385141a77146104ed5780638da5cb5b146105175780638f3fa8601461054157806395d89b411461056b57610203565b8063313ce5671161018f5780635dbdb7e31161015e5780635dbdb7e31461042357806370a082311461044b578063715018a6146104875780637571336a1461049d578063832c2bd2146104c557610203565b8063313ce56714610377578063333f4b3d146103a157806348cd4cb1146103cf5780634ada218b146103f957610203565b806318160ddd116101cb57806318160ddd146102d35780632024eee3146102fd57806320800a001461032557806323b872dd1461033b57610203565b806303e403b01461020757806306fdde0314610231578063095ea7b31461025b57806310d5de531461029757610203565b3661020357005b5f80fd5b348015610212575f80fd5b5061021b6107f3565b60405161022891906126b8565b60405180910390f35b34801561023c575f80fd5b506102456107f9565b604051610252919061275b565b60405180910390f35b348015610266575f80fd5b50610281600480360381019061027c9190612803565b610889565b60405161028e919061285b565b60405180910390f35b3480156102a2575f80fd5b506102bd60048036038101906102b89190612874565b6108ab565b6040516102ca919061285b565b60405180910390f35b3480156102de575f80fd5b506102e76108c8565b6040516102f491906126b8565b60405180910390f35b348015610308575f80fd5b50610323600480360381019061031e919061289f565b6108d1565b005b348015610330575f80fd5b50610339610958565b005b348015610346575f80fd5b50610361600480360381019061035c91906128ca565b6109c4565b60405161036e919061285b565b60405180910390f35b348015610382575f80fd5b5061038b6109f2565b6040516103989190612935565b60405180910390f35b3480156103ac575f80fd5b506103b56109fa565b6040516103c695949392919061294e565b60405180910390f35b3480156103da575f80fd5b506103e3610a1d565b6040516103f091906126b8565b60405180910390f35b348015610404575f80fd5b5061040d610a23565b60405161041a919061285b565b60405180910390f35b34801561042e575f80fd5b5061044960048036038101906104449190612874565b610a36565b005b348015610456575f80fd5b50610471600480360381019061046c9190612874565b610a96565b60405161047e91906126b8565b60405180910390f35b348015610492575f80fd5b5061049b610adb565b005b3480156104a8575f80fd5b506104c360048036038101906104be91906129c9565b610aee565b005b3480156104d0575f80fd5b506104eb60048036038101906104e69190612874565b610b85565b005b3480156104f8575f80fd5b50610501610be4565b60405161050e9190612a16565b60405180910390f35b348015610522575f80fd5b5061052b610bea565b6040516105389190612a16565b60405180910390f35b34801561054c575f80fd5b50610555610c12565b60405161056291906126b8565b60405180910390f35b348015610576575f80fd5b5061057f610c18565b60405161058c919061275b565b60405180910390f35b3480156105a0575f80fd5b506105bb60048036038101906105b691906129c9565b610ca8565b005b3480156105c8575f80fd5b506105d1610d6e565b6040516105de9190612a16565b60405180910390f35b3480156105f2575f80fd5b5061060d60048036038101906106089190612803565b610d93565b60405161061a919061285b565b60405180910390f35b34801561062e575f80fd5b5061064960048036038101906106449190612a2f565b610da9565b005b348015610656575f80fd5b50610671600480360381019061066c9190612874565b610e4e565b60405161067e919061285b565b60405180910390f35b348015610692575f80fd5b506106ad60048036038101906106a89190612874565b610e6b565b6040516106ba919061285b565b60405180910390f35b3480156106ce575f80fd5b506106e960048036038101906106e49190612aa6565b610e88565b6040516106f691906126b8565b60405180910390f35b34801561070a575f80fd5b50610713610f0a565b005b348015610720575f80fd5b5061073b60048036038101906107369190612874565b610f86565b005b348015610748575f80fd5b50610763600480360381019061075e919061289f565b610fe5565b005b348015610770575f80fd5b5061078b60048036038101906107869190612874565b61105a565b005b348015610798575f80fd5b506107a16110de565b6040516107ae9190612b3f565b60405180910390f35b3480156107c2575f80fd5b506107dd60048036038101906107d89190612874565b611103565b6040516107ea919061285b565b60405180910390f35b60155481565b60606003805461080890612b85565b80601f016020809104026020016040519081016040528092919081815260200182805461083490612b85565b801561087f5780601f106108565761010080835404028352916020019161087f565b820191905f5260205f20905b81548152906001019060200180831161086257829003601f168201915b5050505050905090565b5f80610893611120565b90506108a0818585611127565b600191505092915050565b6018602052805f5260405f205f915054906101000a900460ff1681565b5f600254905090565b6108d9611139565b620186a06108e56108c8565b6108ef9190612c0f565b8111801561090f575060646109026108c8565b61090c9190612c0f565b81105b61094e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094590612cd5565b60405180910390fd5b8060158190555050565b5f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f193505050501580156109c0573d5f803e3d5ffd5b5050565b5f806109ce611120565b90506109db8582856111c0565b6109e6858585611252565b60019150509392505050565b5f6012905090565b600e805f0154908060010154908060020154908060030154908060040154905085565b60195481565b600860149054906101000a900460ff1681565b610a3e611139565b600160175f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610ae3611139565b610aec5f61199e565b565b610af6611139565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b2d575f80fd5b8060185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b610b8d611139565b5f60175f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b61dead81565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60145481565b606060048054610c2790612b85565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5390612b85565b8015610c9e5780601f10610c7557610100808354040283529160200191610c9e565b820191905f5260205f20905b815481529060010190602001808311610c8157829003601f168201915b5050505050905090565b610cb0611139565b8173ffffffffffffffffffffffffffffffffffffffff1660085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3690612d63565b60405180910390fd5b610d6a60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611a61565b5050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f610d9f338484611252565b6001905092915050565b610db1611139565b6109c582848688610dc29190612d81565b610dcc9190612d81565b610dd69190612d81565b10610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d90612dfe565b60405180910390fd5b84600e5f018190555083600e6001018190555082600e6002018190555081600e6003018190555080600e600401819055505050505050565b6016602052805f5260405f205f915054906101000a900460ff1681565b6017602052805f5260405f205f915054906101000a900460ff1681565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610f12611139565b600860149054906101000a900460ff1615610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990612e66565b60405180910390fd5b6001600860146101000a81548160ff02191690831515021790555043601981905550565b610f8e611139565b5f600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b610fed611139565b6064811015611031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102890612ef4565b60405180910390fd5b6127108161103d6108c8565b6110479190612f12565b6110519190612c0f565b60148190555050565b611062611139565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110d2575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016110c99190612a16565b60405180910390fd5b6110db8161199e565b50565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d602052805f5260405f205f915054906101000a900460ff1681565b5f33905090565b6111348383836001611aff565b505050565b611141611120565b73ffffffffffffffffffffffffffffffffffffffff1661115f610bea565b73ffffffffffffffffffffffffffffffffffffffff16146111be57611182611120565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016111b59190612a16565b60405180910390fd5b565b5f6111cb8484610e88565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461124c578181101561123d578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161123493929190612f53565b60405180910390fd5b61124b84848484035f611aff565b5b50505050565b5f8111611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b90612ff8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611302576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f990613086565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136790613114565b60405180910390fd5b60175f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168061140b575060175f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b156114205761141b838383611cce565b611999565b600860149054906101000a900460ff1661146f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114669061317c565b60405180910390fd5b5f6019544361147e919061319a565b90505f1515600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615151461150f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150690613217565b60405180910390fd5b6001811161156d576001600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b60165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561160a575060185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156116b157601454821115611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b906132a5565b60405180910390fd5b60145461166084610a96565b8361166b9190612d81565b11156116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a39061330d565b60405180910390fd5b611846565b60165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561174e575060185f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561179d57601454821115611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f9061339b565b60405180910390fd5b611845565b60185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611844576014546117f784610a96565b836118029190612d81565b1115611843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183a9061330d565b60405180910390fd5b5b5b5b5f61185030610a96565b90505f60155482101590508080156118745750601a5f9054906101000a900460ff16155b80156118c7575060165f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611909576001601a5f6101000a81548160ff0219169083151502179055506118ef82611dbe565b5f601a5f6101000a81548160ff0219169083151502179055505b5f600e60040154600e60030154600e60020154600e60010154600e5f01546119319190612d81565b61193b9190612d81565b6119459190612d81565b61194f9190612d81565b90505f60135482876119619190612f12565b61196b9190612c0f565b90505f818761197a919061319a565b9050611987893084611cce565b611992898983611cce565b5050505050505b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b6f575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611b669190612a16565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bdf575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611bd69190612a16565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611cc8578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611cbf91906126b8565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d3e575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611d359190612a16565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611dae575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611da59190612a16565b60405180910390fd5b611db9838383612047565b505050565b5f600e60040154600e60030154600e60020154600e60010154600e5f0154611de69190612d81565b611df09190612d81565b611dfa9190612d81565b611e049190612d81565b90505f816064600e5f0154611e199190612f12565b611e239190612c0f565b90505f826064600e60010154611e399190612f12565b611e439190612c0f565b90505f836064600e60020154611e599190612f12565b611e639190612c0f565b90505f846064600e60030154611e799190612f12565b611e839190612c0f565b90505f856064600e60040154611e999190612f12565b611ea39190612c0f565b90505f60648689611eb49190612f12565b611ebe9190612c0f565b90505f8189611ecd919061319a565b90505f811115611ee157611ee081612260565b5b5f871115611ef357611ef282612492565b5b5f4790505f60648883611f069190612f12565b611f109190612c0f565b90505f60648884611f219190612f12565b611f2b9190612c0f565b90505f60648885611f3c9190612f12565b611f469190612c0f565b90505f60648886611f579190612f12565b611f619190612c0f565b90505f8a1115611f9857611f96600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846125b3565b505b5f8b1115611fcd57611fcb600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856125b3565b505b5f8811156120025761200060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826125b3565b505b5f89111561203757612035600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836125b3565b505b5050505050505050505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612097578060025f82825461208b9190612d81565b92505081905550612165565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612120578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161211793929190612f53565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121ac578060025f82825403925050819055506121f6565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161225391906126b8565b60405180910390a3505050565b61228c3060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611127565b5f600267ffffffffffffffff8111156122a8576122a76133b9565b5b6040519080825280602002602001820160405280156122d65781602001602082028036833780820191505090505b50905030815f815181106122ed576122ec6133e6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612391573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123b59190613427565b816001815181106123c9576123c86133e6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612465959493929190613542565b5f604051808303815f87803b15801561247c575f80fd5b505af192505050801561248d575060015b505050565b5f6002826124a09190612c0f565b90505f81836124af919061319a565b90505f4790505f8311156124c7576124c683612260565b5b5f81476124d4919061319a565b90506125023060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685611127565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198230865f805f426040518863ffffffff1660e01b81526004016125679695949392919061359a565b60606040518083038185885af1935050505080156125a357506040513d601f19601f820116820180604052508101906125a0919061360d565b60015b156125ac575050505b5050505050565b5f6125bc612647565b814710156125cc575f9050612639565b5f8373ffffffffffffffffffffffffffffffffffffffff16836040516125f19061368a565b5f6040518083038185875af1925050503d805f811461262b576040519150601f19603f3d011682016040523d82523d5f602084013e612630565b606091505b50509050809150505b612641612696565b92915050565b60026006540361268c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612683906136e8565b60405180910390fd5b6002600681905550565b6001600681905550565b5f819050919050565b6126b2816126a0565b82525050565b5f6020820190506126cb5f8301846126a9565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156127085780820151818401526020810190506126ed565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61272d826126d1565b61273781856126db565b93506127478185602086016126eb565b61275081612713565b840191505092915050565b5f6020820190508181035f8301526127738184612723565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6127a88261277f565b9050919050565b6127b88161279e565b81146127c2575f80fd5b50565b5f813590506127d3816127af565b92915050565b6127e2816126a0565b81146127ec575f80fd5b50565b5f813590506127fd816127d9565b92915050565b5f80604083850312156128195761281861277b565b5b5f612826858286016127c5565b9250506020612837858286016127ef565b9150509250929050565b5f8115159050919050565b61285581612841565b82525050565b5f60208201905061286e5f83018461284c565b92915050565b5f602082840312156128895761288861277b565b5b5f612896848285016127c5565b91505092915050565b5f602082840312156128b4576128b361277b565b5b5f6128c1848285016127ef565b91505092915050565b5f805f606084860312156128e1576128e061277b565b5b5f6128ee868287016127c5565b93505060206128ff868287016127c5565b9250506040612910868287016127ef565b9150509250925092565b5f60ff82169050919050565b61292f8161291a565b82525050565b5f6020820190506129485f830184612926565b92915050565b5f60a0820190506129615f8301886126a9565b61296e60208301876126a9565b61297b60408301866126a9565b61298860608301856126a9565b61299560808301846126a9565b9695505050505050565b6129a881612841565b81146129b2575f80fd5b50565b5f813590506129c38161299f565b92915050565b5f80604083850312156129df576129de61277b565b5b5f6129ec858286016127c5565b92505060206129fd858286016129b5565b9150509250929050565b612a108161279e565b82525050565b5f602082019050612a295f830184612a07565b92915050565b5f805f805f60a08688031215612a4857612a4761277b565b5b5f612a55888289016127ef565b9550506020612a66888289016127ef565b9450506040612a77888289016127ef565b9350506060612a88888289016127ef565b9250506080612a99888289016127ef565b9150509295509295909350565b5f8060408385031215612abc57612abb61277b565b5b5f612ac9858286016127c5565b9250506020612ada858286016127c5565b9150509250929050565b5f819050919050565b5f612b07612b02612afd8461277f565b612ae4565b61277f565b9050919050565b5f612b1882612aed565b9050919050565b5f612b2982612b0e565b9050919050565b612b3981612b1f565b82525050565b5f602082019050612b525f830184612b30565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612b9c57607f821691505b602082108103612baf57612bae612b58565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612c19826126a0565b9150612c24836126a0565b925082612c3457612c33612bb5565b5b828204905092915050565b7f416d6f756e742073686f756c642062652067726561746572207468616e20302e5f8201527f3030312520616e64206c657373207468616e203125206f6620746f74616c207360208201527f7570706c79000000000000000000000000000000000000000000000000000000604082015250565b5f612cbf6045836126db565b9150612cca82612c3f565b606082019050919050565b5f6020820190508181035f830152612cec81612cb3565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d205f8201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b5f612d4d6039836126db565b9150612d5882612cf3565b604082019050919050565b5f6020820190508181035f830152612d7a81612d41565b9050919050565b5f612d8b826126a0565b9150612d96836126a0565b9250828201905080821115612dae57612dad612be2565b5b92915050565b7f5461782073686f756c64206265206c657373207468616e2032352500000000005f82015250565b5f612de8601b836126db565b9150612df382612db4565b602082019050919050565b5f6020820190508181035f830152612e1581612ddc565b9050919050565b7f547261646520697320616c726561647920656e61626c656400000000000000005f82015250565b5f612e506018836126db565b9150612e5b82612e1c565b602082019050919050565b5f6020820190508181035f830152612e7d81612e44565b9050919050565b7f50657263656e74616765206d7573742062652067726561746572207468616e205f8201527f6f7220657175616c20746f203125000000000000000000000000000000000000602082015250565b5f612ede602e836126db565b9150612ee982612e84565b604082019050919050565b5f6020820190508181035f830152612f0b81612ed2565b9050919050565b5f612f1c826126a0565b9150612f27836126a0565b9250828202612f35816126a0565b91508282048414831517612f4c57612f4b612be2565b5b5092915050565b5f606082019050612f665f830186612a07565b612f7360208301856126a9565b612f8060408301846126a9565b949350505050565b7f5472616e7366657220616d6f756e74206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f612fe26029836126db565b9150612fed82612f88565b604082019050919050565b5f6020820190508181035f83015261300f81612fd6565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6130706025836126db565b915061307b82613016565b604082019050919050565b5f6020820190508181035f83015261309d81613064565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6130fe6023836126db565b9150613109826130a4565b604082019050919050565b5f6020820190508181035f83015261312b816130f2565b9050919050565b7f54726164696e67206973206e6f7420656e61626c6564000000000000000000005f82015250565b5f6131666016836126db565b915061317182613132565b602082019050919050565b5f6020820190508181035f8301526131938161315a565b9050919050565b5f6131a4826126a0565b91506131af836126a0565b92508282039050818111156131c7576131c6612be2565b5b92915050565b7f53656e64657220697320626c61636b6c697374656400000000000000000000005f82015250565b5f6132016015836126db565b915061320c826131cd565b602082019050919050565b5f6020820190508181035f83015261322e816131f5565b9050919050565b7f427579207472616e7366657220616d6f756e74206578636565647320746865205f8201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b5f61328f6035836126db565b915061329a82613235565b604082019050919050565b5f6020820190508181035f8301526132bc81613283565b9050919050565b7f4d61782077616c6c6574206578636565646564000000000000000000000000005f82015250565b5f6132f76013836126db565b9150613302826132c3565b602082019050919050565b5f6020820190508181035f830152613324816132eb565b9050919050565b7f53656c6c207472616e7366657220616d6f756e742065786365656473207468655f8201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b5f6133856036836126db565b91506133908261332b565b604082019050919050565b5f6020820190508181035f8301526133b281613379565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050613421816127af565b92915050565b5f6020828403121561343c5761343b61277b565b5b5f61344984828501613413565b91505092915050565b5f819050919050565b5f61347561347061346b84613452565b612ae4565b6126a0565b9050919050565b6134858161345b565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6134bd8161279e565b82525050565b5f6134ce83836134b4565b60208301905092915050565b5f602082019050919050565b5f6134f08261348b565b6134fa8185613495565b9350613505836134a5565b805f5b8381101561353557815161351c88826134c3565b9750613527836134da565b925050600181019050613508565b5085935050505092915050565b5f60a0820190506135555f8301886126a9565b613562602083018761347c565b818103604083015261357481866134e6565b90506135836060830185612a07565b61359060808301846126a9565b9695505050505050565b5f60c0820190506135ad5f830189612a07565b6135ba60208301886126a9565b6135c7604083018761347c565b6135d4606083018661347c565b6135e16080830185612a07565b6135ee60a08301846126a9565b979650505050505050565b5f81519050613607816127d9565b92915050565b5f805f606084860312156136245761362361277b565b5b5f613631868287016135f9565b9350506020613642868287016135f9565b9250506040613653868287016135f9565b9150509250925092565b5f81905092915050565b50565b5f6136755f8361365d565b915061368082613667565b5f82019050919050565b5f6136948261366a565b9150819050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6136d2601f836126db565b91506136dd8261369e565b602082019050919050565b5f6020820190508181035f8301526136ff816136c6565b905091905056fea264697066735822122073f39b6819a3e126375ae1d731f15d3198516cd36144a683c38307a6e6933f2164736f6c63430008150033

Deployed Bytecode Sourcemap

27417:11659:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28213:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16468:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18761:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28461:63;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17570:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38146:338;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30305:153;;;;;;;;;;;;;:::i;:::-;;19529:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17421:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28084:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;28531:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27527:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37793:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17732:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10081:103;;;;;;;;;;;;;:::i;:::-;;38824:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37905:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28318:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9406:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28178:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16678:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36768:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27501:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30472:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36146:614;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28252:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28413:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18300:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30110:187;;;;;;;;;;;;;:::i;:::-;;38029:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38499:317;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10339:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27473:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27870:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28213:32;;;;:::o;16468:91::-;16513:13;16546:5;16539:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16468:91;:::o;18761:190::-;18834:4;18851:13;18867:12;:10;:12::i;:::-;18851:28;;18890:31;18899:5;18906:7;18915:5;18890:8;:31::i;:::-;18939:4;18932:11;;;18761:190;;;;:::o;28461:63::-;;;;;;;;;;;;;;;;;;;;;;:::o;17570:99::-;17622:7;17649:12;;17642:19;;17570:99;:::o;38146:338::-;9292:13;:11;:13::i;:::-;38278:7:::1;38262:13;:11;:13::i;:::-;:23;;;;:::i;:::-;38250:9;:35;:89;;;;;38335:3;38319:13;:11;:13::i;:::-;:19;;;;:::i;:::-;38306:9;:33;38250:89;38228:208;;;;;;;;;;;;:::i;:::-;;;;;;;;;38467:9;38447:17;:29;;;;38146:338:::0;:::o;30305:153::-;30346:28;30385:9;;;;;;;;;;;30346:49;;30406:12;:21;;:44;30428:21;30406:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30335:123;30305:153::o;19529:249::-;19616:4;19633:15;19651:12;:10;:12::i;:::-;19633:30;;19674:37;19690:4;19696:7;19705:5;19674:15;:37::i;:::-;19722:26;19732:4;19738:2;19742:5;19722:9;:26::i;:::-;19766:4;19759:11;;;19529:249;;;;;:::o;17421:84::-;17470:5;17495:2;17488:9;;17421:84;:::o;28084:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28531:25::-;;;;:::o;27527:34::-;;;;;;;;;;;;;:::o;37793:104::-;9292:13;:11;:13::i;:::-;37885:4:::1;37863:9;:19;37873:8;37863:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;37793:104:::0;:::o;17732:118::-;17797:7;17824:9;:18;17834:7;17824:18;;;;;;;;;;;;;;;;17817:25;;17732:118;;;:::o;10081:103::-;9292:13;:11;:13::i;:::-;10146:30:::1;10173:1;10146:18;:30::i;:::-;10081:103::o:0;38824:212::-;9292:13;:11;:13::i;:::-;38965:4:::1;38947:23;;:6;:23;;::::0;38939:32:::1;;;::::0;::::1;;39024:4;38982:31;:39;39014:6;38982:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38824:212:::0;;:::o;37905:108::-;9292:13;:11;:13::i;:::-;38000:5:::1;37978:9;:19;37988:8;37978:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;37905:108:::0;:::o;28318:88::-;28364:42;28318:88;:::o;9406:87::-;9452:7;9479:6;;;;;;;;;;;9472:13;;9406:87;:::o;28178:28::-;;;;:::o;16678:95::-;16725:13;16758:7;16751:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16678:95;:::o;36768:303::-;9292:13;:11;:13::i;:::-;36918:6:::1;36910:14;;:4;;;;;;;;;;;:14;;::::0;36888:121:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;37022:41;37051:4;;;;;;;;;;;37057:5;37022:28;:41::i;:::-;36768:303:::0;;:::o;27501:19::-;;;;;;;;;;;;;:::o;30472:190::-;30575:4;30592:40;30602:10;30614:9;30625:6;30592:9;:40::i;:::-;30650:4;30643:11;;30472:190;;;;:::o;36146:614::-;9292:13;:11;:13::i;:::-;36470:4:::1;36437:13;36424:10;36406:15;36388;:33;;;;:::i;:::-;:46;;;;:::i;:::-;:62;;;;:::i;:::-;:86;36366:163;;;;;;;;;;;;:::i;:::-;;;;;;;;;36561:15;36540:8;:18;;:36;;;;36608:15;36587:8;:18;;:36;;;;36650:10;36634:8;:13;;:26;;;;36690:13;36671:8;:16;;:32;;;;36736:16;36714:8;:19;;:38;;;;36146:614:::0;;;;;:::o;28252:57::-;;;;;;;;;;;;;;;;;;;;;;:::o;28413:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;18300:142::-;18380:7;18407:11;:18;18419:5;18407:18;;;;;;;;;;;;;;;:27;18426:7;18407:27;;;;;;;;;;;;;;;;18400:34;;18300:142;;;;:::o;30110:187::-;9292:13;:11;:13::i;:::-;30178:14:::1;;;;;;;;;;;30177:15;30169:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;30249:4;30232:14;;:21;;;;;;;;;;;;;;;;;;30277:12;30264:10;:25;;;;30110:187::o:0;38029:108::-;9292:13;:11;:13::i;:::-;38124:5:::1;38102:9;:19;38112:8;38102:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;38029:108:::0;:::o;38499:317::-;9292:13;:11;:13::i;:::-;38640:3:::1;38626:10;:17;;38604:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;38775:5;38761:10;38745:13;:11;:13::i;:::-;:26;;;;:::i;:::-;38744:36;;;;:::i;:::-;38728:13;:52;;;;38499:317:::0;:::o;10339:220::-;9292:13;:11;:13::i;:::-;10444:1:::1;10424:22;;:8;:22;;::::0;10420:93:::1;;10498:1;10470:31;;;;;;;;;;;:::i;:::-;;;;;;;;10420:93;10523:28;10542:8;10523:18;:28::i;:::-;10339:220:::0;:::o;27473:21::-;;;;;;;;;;;;;:::o;27870:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;7522:98::-;7575:7;7602:10;7595:17;;7522:98;:::o;23598:130::-;23683:37;23692:5;23699:7;23708:5;23715:4;23683:8;:37::i;:::-;23598:130;;;:::o;9571:166::-;9642:12;:10;:12::i;:::-;9631:23;;:7;:5;:7::i;:::-;:23;;;9627:103;;9705:12;:10;:12::i;:::-;9678:40;;;;;;;;;;;:::i;:::-;;;;;;;;9627:103;9571:166::o;25314:487::-;25414:24;25441:25;25451:5;25458:7;25441:9;:25::i;:::-;25414:52;;25501:17;25481:16;:37;25477:317;;25558:5;25539:16;:24;25535:132;;;25618:7;25627:16;25645:5;25591:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;25535:132;25710:57;25719:5;25726:7;25754:5;25735:16;:24;25761:5;25710:8;:57::i;:::-;25477:317;25403:398;25314:487;;;:::o;30670:2771::-;30820:1;30811:6;:10;30803:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;30904:1;30886:20;;:6;:20;;;30878:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;30988:1;30967:23;;:9;:23;;;30959:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31047:9;:17;31057:6;31047:17;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;31068:9;:20;31078:9;31068:20;;;;;;;;;;;;;;;;;;;;;;;;;31047:41;31043:2391;;;31105:42;31121:6;31129:9;31140:6;31105:15;:42::i;:::-;31043:2391;;;31188:14;;;;;;;;;;;31180:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;31244:18;31280:10;;31265:12;:25;;;;:::i;:::-;31244:46;;31334:5;31313:26;;:9;:17;31323:6;31313:17;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;31305:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;31400:1;31386:10;:15;31382:83;;31445:4;31422:9;:20;31432:9;31422:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;31382:83;31526:25;:33;31552:6;31526:33;;;;;;;;;;;;;;;;;;;;;;;;;:97;;;;;31581:31;:42;31613:9;31581:42;;;;;;;;;;;;;;;;;;;;;;;;;31580:43;31526:97;31504:1072;;;31698:13;;31688:6;:23;;31658:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;31890:13;;31866:20;31876:9;31866;:20::i;:::-;31857:6;:29;;;;:::i;:::-;:46;;31827:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;31504:1072;;;32048:25;:36;32074:9;32048:36;;;;;;;;;;;;;;;;;;;;;;;;;:97;;;;;32106:31;:39;32138:6;32106:39;;;;;;;;;;;;;;;;;;;;;;;;;32105:40;32048:97;32026:550;;;32220:13;;32210:6;:23;;32180:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;32026:550;;;32358:31;:42;32390:9;32358:42;;;;;;;;;;;;;;;;;;;;;;;;;32353:223;;32484:13;;32460:20;32470:9;32460;:20::i;:::-;32451:6;:29;;;;:::i;:::-;:46;;32421:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;32353:223;32026:550;31504:1072;32606:28;32637:24;32655:4;32637:9;:24::i;:::-;32606:55;;32676:12;32715:17;;32691:20;:41;;32676:56;;32751:7;:23;;;;;32763:11;;;;;;;;;;;32762:12;32751:23;:61;;;;;32779:25;:33;32805:6;32779:33;;;;;;;;;;;;;;;;;;;;;;;;;32778:34;32751:61;32747:216;;;32847:4;32833:11;;:18;;;;;;;;;;;;;;;;;;32870:37;32886:20;32870:15;:37::i;:::-;32942:5;32928:11;;:19;;;;;;;;;;;;;;;;;;32747:216;32979:15;33142:8;:19;;;33106:8;:16;;;33073:8;:13;;;33035:8;:18;;;32997:8;:18;;;:56;;;;:::i;:::-;:89;;;;:::i;:::-;:125;;;;:::i;:::-;:164;;;;:::i;:::-;32979:182;;33178:17;33219:14;;33208:7;33199:6;:16;;;;:::i;:::-;33198:35;;;;:::i;:::-;33178:55;;33248:22;33282:9;33273:6;:18;;;;:::i;:::-;33248:43;;33308:49;33324:6;33340:4;33347:9;33308:15;:49::i;:::-;33372:50;33388:6;33396:9;33407:14;33372:15;:50::i;:::-;31165:2269;;;;;;31043:2391;30670:2771;;;:::o;10719:191::-;10793:16;10812:6;;;;;;;;;;;10793:25;;10838:8;10829:6;;:17;;;;;;;;;;;;;;;;;;10893:8;10862:40;;10883:8;10862:40;;;;;;;;;;;;10782:128;10719:191;:::o;37079:192::-;37200:5;37164:25;:33;37190:6;37164:33;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;37257:5;37221:42;;37249:6;37221:42;;;;;;;;;;;;37079:192;;:::o;24579:443::-;24709:1;24692:19;;:5;:19;;;24688:91;;24764:1;24735:32;;;;;;;;;;;:::i;:::-;;;;;;;;24688:91;24812:1;24793:21;;:7;:21;;;24789:92;;24866:1;24838:31;;;;;;;;;;;:::i;:::-;;;;;;;;24789:92;24921:5;24891:11;:18;24903:5;24891:18;;;;;;;;;;;;;;;:27;24910:7;24891:27;;;;;;;;;;;;;;;:35;;;;24941:9;24937:78;;;24988:7;24972:31;;24981:5;24972:31;;;24997:5;24972:31;;;;;;:::i;:::-;;;;;;;;24937:78;24579:443;;;;:::o;20163:318::-;20273:1;20257:18;;:4;:18;;;20253:88;;20326:1;20299:30;;;;;;;;;;;:::i;:::-;;;;;;;;20253:88;20369:1;20355:16;;:2;:16;;;20351:88;;20424:1;20395:32;;;;;;;;;;;:::i;:::-;;;;;;;;20351:88;20449:24;20457:4;20463:2;20467:5;20449:7;:24::i;:::-;20163:318;;;:::o;34137:1723::-;34212:20;34364:8;:19;;;34332:8;:16;;;34303:8;:13;;;34269:8;:18;;;34235:8;:18;;;:52;;;;:::i;:::-;:81;;;;:::i;:::-;:113;;;;:::i;:::-;:148;;;;:::i;:::-;34212:171;;34396:25;34453:12;34446:3;34425:8;:18;;;:24;;;;:::i;:::-;34424:41;;;;:::i;:::-;34396:69;;34476:25;34533:12;34526:3;34505:8;:18;;;:24;;;;:::i;:::-;34504:41;;;;:::i;:::-;34476:69;;34556:20;34603:12;34596:3;34580:8;:13;;;:19;;;;:::i;:::-;34579:36;;;;:::i;:::-;34556:59;;34626:23;34679:12;34672:3;34653:8;:16;;;:22;;;;:::i;:::-;34652:39;;;;:::i;:::-;34626:65;;34702:26;34761:12;34754:3;34732:8;:19;;;:25;;;;:::i;:::-;34731:42;;;;:::i;:::-;34702:71;;34786:28;34875:3;34854:17;34818:20;:53;;;;:::i;:::-;34817:61;;;;:::i;:::-;34786:92;;34891:22;34939:20;34916;:43;;;;:::i;:::-;34891:68;;34990:1;34973:14;:18;34970:78;;;35003:33;35021:14;35003:17;:33::i;:::-;34970:78;35082:1;35062:17;:21;35058:90;;;35100:36;35115:20;35100:14;:36::i;:::-;35058:90;35158:20;35181:21;35158:44;;35213:20;35273:3;35252:17;35237:12;:32;;;;:::i;:::-;35236:40;;;;:::i;:::-;35213:63;;35287:15;35337:3;35321:12;35306;:27;;;;:::i;:::-;35305:35;;;;:::i;:::-;35287:53;;35351:18;35407:3;35388:15;35373:12;:30;;;;:::i;:::-;35372:38;;;;:::i;:::-;35351:59;;35421:21;35483:3;35461:18;35446:12;:33;;;;:::i;:::-;35445:41;;;;:::i;:::-;35421:65;;35516:1;35501:12;:16;35497:71;;;35534:22;35542:4;;;;;;;;;;;35548:7;35534;:22::i;:::-;;35497:71;35602:1;35582:17;:21;35578:86;;;35620:32;35628:9;;;;;;;;;;;35639:12;35620:7;:32::i;:::-;;35578:86;35699:1;35678:18;:22;35674:89;;;35717:34;35725:10;;;;;;;;;;;35737:13;35717:7;:34::i;:::-;;35674:89;35795:1;35777:15;:19;35773:80;;;35813:28;35821:7;;;;;;;;;;;35830:10;35813:7;:28::i;:::-;;35773:80;34201:1659;;;;;;;;;;;;;34137:1723;:::o;20805:1135::-;20911:1;20895:18;;:4;:18;;;20891:552;;21049:5;21033:12;;:21;;;;;;;:::i;:::-;;;;;;;;20891:552;;;21087:19;21109:9;:15;21119:4;21109:15;;;;;;;;;;;;;;;;21087:37;;21157:5;21143:11;:19;21139:117;;;21215:4;21221:11;21234:5;21190:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;21139:117;21411:5;21397:11;:19;21379:9;:15;21389:4;21379:15;;;;;;;;;;;;;;;:37;;;;21072:371;20891:552;21473:1;21459:16;;:2;:16;;;21455:435;;21641:5;21625:12;;:21;;;;;;;;;;;21455:435;;;21858:5;21841:9;:13;21851:2;21841:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;21455:435;21922:2;21907:25;;21916:4;21907:25;;;21926:5;21907:25;;;;;;:::i;:::-;;;;;;;;20805:1135;;;:::o;37279:506::-;37346:53;37363:4;37378:6;;;;;;;;;;;37387:11;37346:8;:53::i;:::-;37410:21;37448:1;37434:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37410:40;;37479:4;37461;37466:1;37461:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;37505:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37495:4;37500:1;37495:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;37546:6;;;;;;;;;;;:57;;;37622:11;37652:1;37672:4;37703;37727:15;37546:211;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37529:249;37335:450;37279:506;:::o;33449:680::-;33513:12;33542:1;33528:11;:15;;;;:::i;:::-;33513:30;;33554:17;33588:4;33574:11;:18;;;;:::i;:::-;33554:38;;33603:22;33628:21;33603:46;;33671:1;33664:4;:8;33661:58;;;33685:23;33703:4;33685:17;:23::i;:::-;33661:58;33731:18;33776:14;33752:21;:38;;;;:::i;:::-;33731:59;;33801:51;33818:4;33833:6;;;;;;;;;;;33842:9;33801:8;:51::i;:::-;33882:6;;;;;;;;;;;:22;;;33912:10;33950:4;33974:9;34002:1;34022;34050;34071:15;33882:219;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33865:257;;;;;;;33502:627;;;;33449:680;:::o;35868:270::-;35970:4;26964:21;:19;:21::i;:::-;36015:6:::1;35991:21;:30;35987:48;;;36030:5;36023:12;;;;35987:48;36049:12;36075:3;36067:17;;36092:6;36067:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36048:55;;;36123:7;36116:14;;;26996:1;27008:20:::0;:18;:20::i;:::-;35868:270;;;;:::o;27044:152::-;26824:1;27102:7;;:19;27094:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;26824:1;27170:7;:18;;;;27044:152::o;27204:79::-;26780:1;27253:7;:22;;;;27204:79::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:246::-;803:1;813:113;827:6;824:1;821:13;813:113;;;912:1;907:3;903:11;897:18;893:1;888:3;884:11;877:39;849:2;846:1;842:10;837:15;;813:113;;;960:1;951:6;946:3;942:16;935:27;784:184;722:246;;;:::o;974:102::-;1015:6;1066:2;1062:7;1057:2;1050:5;1046:14;1042:28;1032:38;;974:102;;;:::o;1082:377::-;1170:3;1198:39;1231:5;1198:39;:::i;:::-;1253:71;1317:6;1312:3;1253:71;:::i;:::-;1246:78;;1333:65;1391:6;1386:3;1379:4;1372:5;1368:16;1333:65;:::i;:::-;1423:29;1445:6;1423:29;:::i;:::-;1418:3;1414:39;1407:46;;1174:285;1082:377;;;;:::o;1465:313::-;1578:4;1616:2;1605:9;1601:18;1593:26;;1665:9;1659:4;1655:20;1651:1;1640:9;1636:17;1629:47;1693:78;1766:4;1757:6;1693:78;:::i;:::-;1685:86;;1465:313;;;;:::o;1865:117::-;1974:1;1971;1964:12;2111:126;2148:7;2188:42;2181:5;2177:54;2166:65;;2111:126;;;:::o;2243:96::-;2280:7;2309:24;2327:5;2309:24;:::i;:::-;2298:35;;2243:96;;;:::o;2345:122::-;2418:24;2436:5;2418:24;:::i;:::-;2411:5;2408:35;2398:63;;2457:1;2454;2447:12;2398:63;2345:122;:::o;2473:139::-;2519:5;2557:6;2544:20;2535:29;;2573:33;2600:5;2573:33;:::i;:::-;2473:139;;;;:::o;2618:122::-;2691:24;2709:5;2691:24;:::i;:::-;2684:5;2681:35;2671:63;;2730:1;2727;2720:12;2671:63;2618:122;:::o;2746:139::-;2792:5;2830:6;2817:20;2808:29;;2846:33;2873:5;2846:33;:::i;:::-;2746:139;;;;:::o;2891:474::-;2959:6;2967;3016:2;3004:9;2995:7;2991:23;2987:32;2984:119;;;3022:79;;:::i;:::-;2984:119;3142:1;3167:53;3212:7;3203:6;3192:9;3188:22;3167:53;:::i;:::-;3157:63;;3113:117;3269:2;3295:53;3340:7;3331:6;3320:9;3316:22;3295:53;:::i;:::-;3285:63;;3240:118;2891:474;;;;;:::o;3371:90::-;3405:7;3448:5;3441:13;3434:21;3423:32;;3371:90;;;:::o;3467:109::-;3548:21;3563:5;3548:21;:::i;:::-;3543:3;3536:34;3467:109;;:::o;3582:210::-;3669:4;3707:2;3696:9;3692:18;3684:26;;3720:65;3782:1;3771:9;3767:17;3758:6;3720:65;:::i;:::-;3582:210;;;;:::o;3798:329::-;3857:6;3906:2;3894:9;3885:7;3881:23;3877:32;3874:119;;;3912:79;;:::i;:::-;3874:119;4032:1;4057:53;4102:7;4093:6;4082:9;4078:22;4057:53;:::i;:::-;4047:63;;4003:117;3798:329;;;;:::o;4133:::-;4192:6;4241:2;4229:9;4220:7;4216:23;4212:32;4209:119;;;4247:79;;:::i;:::-;4209:119;4367:1;4392:53;4437:7;4428:6;4417:9;4413:22;4392:53;:::i;:::-;4382:63;;4338:117;4133:329;;;;:::o;4468:619::-;4545:6;4553;4561;4610:2;4598:9;4589:7;4585:23;4581:32;4578:119;;;4616:79;;:::i;:::-;4578:119;4736:1;4761:53;4806:7;4797:6;4786:9;4782:22;4761:53;:::i;:::-;4751:63;;4707:117;4863:2;4889:53;4934:7;4925:6;4914:9;4910:22;4889:53;:::i;:::-;4879:63;;4834:118;4991:2;5017:53;5062:7;5053:6;5042:9;5038:22;5017:53;:::i;:::-;5007:63;;4962:118;4468:619;;;;;:::o;5093:86::-;5128:7;5168:4;5161:5;5157:16;5146:27;;5093:86;;;:::o;5185:112::-;5268:22;5284:5;5268:22;:::i;:::-;5263:3;5256:35;5185:112;;:::o;5303:214::-;5392:4;5430:2;5419:9;5415:18;5407:26;;5443:67;5507:1;5496:9;5492:17;5483:6;5443:67;:::i;:::-;5303:214;;;;:::o;5523:664::-;5728:4;5766:3;5755:9;5751:19;5743:27;;5780:71;5848:1;5837:9;5833:17;5824:6;5780:71;:::i;:::-;5861:72;5929:2;5918:9;5914:18;5905:6;5861:72;:::i;:::-;5943;6011:2;6000:9;5996:18;5987:6;5943:72;:::i;:::-;6025;6093:2;6082:9;6078:18;6069:6;6025:72;:::i;:::-;6107:73;6175:3;6164:9;6160:19;6151:6;6107:73;:::i;:::-;5523:664;;;;;;;;:::o;6193:116::-;6263:21;6278:5;6263:21;:::i;:::-;6256:5;6253:32;6243:60;;6299:1;6296;6289:12;6243:60;6193:116;:::o;6315:133::-;6358:5;6396:6;6383:20;6374:29;;6412:30;6436:5;6412:30;:::i;:::-;6315:133;;;;:::o;6454:468::-;6519:6;6527;6576:2;6564:9;6555:7;6551:23;6547:32;6544:119;;;6582:79;;:::i;:::-;6544:119;6702:1;6727:53;6772:7;6763:6;6752:9;6748:22;6727:53;:::i;:::-;6717:63;;6673:117;6829:2;6855:50;6897:7;6888:6;6877:9;6873:22;6855:50;:::i;:::-;6845:60;;6800:115;6454:468;;;;;:::o;6928:118::-;7015:24;7033:5;7015:24;:::i;:::-;7010:3;7003:37;6928:118;;:::o;7052:222::-;7145:4;7183:2;7172:9;7168:18;7160:26;;7196:71;7264:1;7253:9;7249:17;7240:6;7196:71;:::i;:::-;7052:222;;;;:::o;7280:911::-;7375:6;7383;7391;7399;7407;7456:3;7444:9;7435:7;7431:23;7427:33;7424:120;;;7463:79;;:::i;:::-;7424:120;7583:1;7608:53;7653:7;7644:6;7633:9;7629:22;7608:53;:::i;:::-;7598:63;;7554:117;7710:2;7736:53;7781:7;7772:6;7761:9;7757:22;7736:53;:::i;:::-;7726:63;;7681:118;7838:2;7864:53;7909:7;7900:6;7889:9;7885:22;7864:53;:::i;:::-;7854:63;;7809:118;7966:2;7992:53;8037:7;8028:6;8017:9;8013:22;7992:53;:::i;:::-;7982:63;;7937:118;8094:3;8121:53;8166:7;8157:6;8146:9;8142:22;8121:53;:::i;:::-;8111:63;;8065:119;7280:911;;;;;;;;:::o;8197:474::-;8265:6;8273;8322:2;8310:9;8301:7;8297:23;8293:32;8290:119;;;8328:79;;:::i;:::-;8290:119;8448:1;8473:53;8518:7;8509:6;8498:9;8494:22;8473:53;:::i;:::-;8463:63;;8419:117;8575:2;8601:53;8646:7;8637:6;8626:9;8622:22;8601:53;:::i;:::-;8591:63;;8546:118;8197:474;;;;;:::o;8677:60::-;8705:3;8726:5;8719:12;;8677:60;;;:::o;8743:142::-;8793:9;8826:53;8844:34;8853:24;8871:5;8853:24;:::i;:::-;8844:34;:::i;:::-;8826:53;:::i;:::-;8813:66;;8743:142;;;:::o;8891:126::-;8941:9;8974:37;9005:5;8974:37;:::i;:::-;8961:50;;8891:126;;;:::o;9023:141::-;9088:9;9121:37;9152:5;9121:37;:::i;:::-;9108:50;;9023:141;;;:::o;9170:161::-;9272:52;9318:5;9272:52;:::i;:::-;9267:3;9260:65;9170:161;;:::o;9337:252::-;9445:4;9483:2;9472:9;9468:18;9460:26;;9496:86;9579:1;9568:9;9564:17;9555:6;9496:86;:::i;:::-;9337:252;;;;:::o;9595:180::-;9643:77;9640:1;9633:88;9740:4;9737:1;9730:15;9764:4;9761:1;9754:15;9781:320;9825:6;9862:1;9856:4;9852:12;9842:22;;9909:1;9903:4;9899:12;9930:18;9920:81;;9986:4;9978:6;9974:17;9964:27;;9920:81;10048:2;10040:6;10037:14;10017:18;10014:38;10011:84;;10067:18;;:::i;:::-;10011:84;9832:269;9781:320;;;:::o;10107:180::-;10155:77;10152:1;10145:88;10252:4;10249:1;10242:15;10276:4;10273:1;10266:15;10293:180;10341:77;10338:1;10331:88;10438:4;10435:1;10428:15;10462:4;10459:1;10452:15;10479:185;10519:1;10536:20;10554:1;10536:20;:::i;:::-;10531:25;;10570:20;10588:1;10570:20;:::i;:::-;10565:25;;10609:1;10599:35;;10614:18;;:::i;:::-;10599:35;10656:1;10653;10649:9;10644:14;;10479:185;;;;:::o;10670:293::-;10810:34;10806:1;10798:6;10794:14;10787:58;10879:34;10874:2;10866:6;10862:15;10855:59;10948:7;10943:2;10935:6;10931:15;10924:32;10670:293;:::o;10969:366::-;11111:3;11132:67;11196:2;11191:3;11132:67;:::i;:::-;11125:74;;11208:93;11297:3;11208:93;:::i;:::-;11326:2;11321:3;11317:12;11310:19;;10969:366;;;:::o;11341:419::-;11507:4;11545:2;11534:9;11530:18;11522:26;;11594:9;11588:4;11584:20;11580:1;11569:9;11565:17;11558:47;11622:131;11748:4;11622:131;:::i;:::-;11614:139;;11341:419;;;:::o;11766:244::-;11906:34;11902:1;11894:6;11890:14;11883:58;11975:27;11970:2;11962:6;11958:15;11951:52;11766:244;:::o;12016:366::-;12158:3;12179:67;12243:2;12238:3;12179:67;:::i;:::-;12172:74;;12255:93;12344:3;12255:93;:::i;:::-;12373:2;12368:3;12364:12;12357:19;;12016:366;;;:::o;12388:419::-;12554:4;12592:2;12581:9;12577:18;12569:26;;12641:9;12635:4;12631:20;12627:1;12616:9;12612:17;12605:47;12669:131;12795:4;12669:131;:::i;:::-;12661:139;;12388:419;;;:::o;12813:191::-;12853:3;12872:20;12890:1;12872:20;:::i;:::-;12867:25;;12906:20;12924:1;12906:20;:::i;:::-;12901:25;;12949:1;12946;12942:9;12935:16;;12970:3;12967:1;12964:10;12961:36;;;12977:18;;:::i;:::-;12961:36;12813:191;;;;:::o;13010:177::-;13150:29;13146:1;13138:6;13134:14;13127:53;13010:177;:::o;13193:366::-;13335:3;13356:67;13420:2;13415:3;13356:67;:::i;:::-;13349:74;;13432:93;13521:3;13432:93;:::i;:::-;13550:2;13545:3;13541:12;13534:19;;13193:366;;;:::o;13565:419::-;13731:4;13769:2;13758:9;13754:18;13746:26;;13818:9;13812:4;13808:20;13804:1;13793:9;13789:17;13782:47;13846:131;13972:4;13846:131;:::i;:::-;13838:139;;13565:419;;;:::o;13990:174::-;14130:26;14126:1;14118:6;14114:14;14107:50;13990:174;:::o;14170:366::-;14312:3;14333:67;14397:2;14392:3;14333:67;:::i;:::-;14326:74;;14409:93;14498:3;14409:93;:::i;:::-;14527:2;14522:3;14518:12;14511:19;;14170:366;;;:::o;14542:419::-;14708:4;14746:2;14735:9;14731:18;14723:26;;14795:9;14789:4;14785:20;14781:1;14770:9;14766:17;14759:47;14823:131;14949:4;14823:131;:::i;:::-;14815:139;;14542:419;;;:::o;14967:233::-;15107:34;15103:1;15095:6;15091:14;15084:58;15176:16;15171:2;15163:6;15159:15;15152:41;14967:233;:::o;15206:366::-;15348:3;15369:67;15433:2;15428:3;15369:67;:::i;:::-;15362:74;;15445:93;15534:3;15445:93;:::i;:::-;15563:2;15558:3;15554:12;15547:19;;15206:366;;;:::o;15578:419::-;15744:4;15782:2;15771:9;15767:18;15759:26;;15831:9;15825:4;15821:20;15817:1;15806:9;15802:17;15795:47;15859:131;15985:4;15859:131;:::i;:::-;15851:139;;15578:419;;;:::o;16003:410::-;16043:7;16066:20;16084:1;16066:20;:::i;:::-;16061:25;;16100:20;16118:1;16100:20;:::i;:::-;16095:25;;16155:1;16152;16148:9;16177:30;16195:11;16177:30;:::i;:::-;16166:41;;16356:1;16347:7;16343:15;16340:1;16337:22;16317:1;16310:9;16290:83;16267:139;;16386:18;;:::i;:::-;16267:139;16051:362;16003:410;;;;:::o;16419:442::-;16568:4;16606:2;16595:9;16591:18;16583:26;;16619:71;16687:1;16676:9;16672:17;16663:6;16619:71;:::i;:::-;16700:72;16768:2;16757:9;16753:18;16744:6;16700:72;:::i;:::-;16782;16850:2;16839:9;16835:18;16826:6;16782:72;:::i;:::-;16419:442;;;;;;:::o;16867:228::-;17007:34;17003:1;16995:6;16991:14;16984:58;17076:11;17071:2;17063:6;17059:15;17052:36;16867:228;:::o;17101:366::-;17243:3;17264:67;17328:2;17323:3;17264:67;:::i;:::-;17257:74;;17340:93;17429:3;17340:93;:::i;:::-;17458:2;17453:3;17449:12;17442:19;;17101:366;;;:::o;17473:419::-;17639:4;17677:2;17666:9;17662:18;17654:26;;17726:9;17720:4;17716:20;17712:1;17701:9;17697:17;17690:47;17754:131;17880:4;17754:131;:::i;:::-;17746:139;;17473:419;;;:::o;17898:224::-;18038:34;18034:1;18026:6;18022:14;18015:58;18107:7;18102:2;18094:6;18090:15;18083:32;17898:224;:::o;18128:366::-;18270:3;18291:67;18355:2;18350:3;18291:67;:::i;:::-;18284:74;;18367:93;18456:3;18367:93;:::i;:::-;18485:2;18480:3;18476:12;18469:19;;18128:366;;;:::o;18500:419::-;18666:4;18704:2;18693:9;18689:18;18681:26;;18753:9;18747:4;18743:20;18739:1;18728:9;18724:17;18717:47;18781:131;18907:4;18781:131;:::i;:::-;18773:139;;18500:419;;;:::o;18925:222::-;19065:34;19061:1;19053:6;19049:14;19042:58;19134:5;19129:2;19121:6;19117:15;19110:30;18925:222;:::o;19153:366::-;19295:3;19316:67;19380:2;19375:3;19316:67;:::i;:::-;19309:74;;19392:93;19481:3;19392:93;:::i;:::-;19510:2;19505:3;19501:12;19494:19;;19153:366;;;:::o;19525:419::-;19691:4;19729:2;19718:9;19714:18;19706:26;;19778:9;19772:4;19768:20;19764:1;19753:9;19749:17;19742:47;19806:131;19932:4;19806:131;:::i;:::-;19798:139;;19525:419;;;:::o;19950:172::-;20090:24;20086:1;20078:6;20074:14;20067:48;19950:172;:::o;20128:366::-;20270:3;20291:67;20355:2;20350:3;20291:67;:::i;:::-;20284:74;;20367:93;20456:3;20367:93;:::i;:::-;20485:2;20480:3;20476:12;20469:19;;20128:366;;;:::o;20500:419::-;20666:4;20704:2;20693:9;20689:18;20681:26;;20753:9;20747:4;20743:20;20739:1;20728:9;20724:17;20717:47;20781:131;20907:4;20781:131;:::i;:::-;20773:139;;20500:419;;;:::o;20925:194::-;20965:4;20985:20;21003:1;20985:20;:::i;:::-;20980:25;;21019:20;21037:1;21019:20;:::i;:::-;21014:25;;21063:1;21060;21056:9;21048:17;;21087:1;21081:4;21078:11;21075:37;;;21092:18;;:::i;:::-;21075:37;20925:194;;;;:::o;21125:171::-;21265:23;21261:1;21253:6;21249:14;21242:47;21125:171;:::o;21302:366::-;21444:3;21465:67;21529:2;21524:3;21465:67;:::i;:::-;21458:74;;21541:93;21630:3;21541:93;:::i;:::-;21659:2;21654:3;21650:12;21643:19;;21302:366;;;:::o;21674:419::-;21840:4;21878:2;21867:9;21863:18;21855:26;;21927:9;21921:4;21917:20;21913:1;21902:9;21898:17;21891:47;21955:131;22081:4;21955:131;:::i;:::-;21947:139;;21674:419;;;:::o;22099:240::-;22239:34;22235:1;22227:6;22223:14;22216:58;22308:23;22303:2;22295:6;22291:15;22284:48;22099:240;:::o;22345:366::-;22487:3;22508:67;22572:2;22567:3;22508:67;:::i;:::-;22501:74;;22584:93;22673:3;22584:93;:::i;:::-;22702:2;22697:3;22693:12;22686:19;;22345:366;;;:::o;22717:419::-;22883:4;22921:2;22910:9;22906:18;22898:26;;22970:9;22964:4;22960:20;22956:1;22945:9;22941:17;22934:47;22998:131;23124:4;22998:131;:::i;:::-;22990:139;;22717:419;;;:::o;23142:169::-;23282:21;23278:1;23270:6;23266:14;23259:45;23142:169;:::o;23317:366::-;23459:3;23480:67;23544:2;23539:3;23480:67;:::i;:::-;23473:74;;23556:93;23645:3;23556:93;:::i;:::-;23674:2;23669:3;23665:12;23658:19;;23317:366;;;:::o;23689:419::-;23855:4;23893:2;23882:9;23878:18;23870:26;;23942:9;23936:4;23932:20;23928:1;23917:9;23913:17;23906:47;23970:131;24096:4;23970:131;:::i;:::-;23962:139;;23689:419;;;:::o;24114:241::-;24254:34;24250:1;24242:6;24238:14;24231:58;24323:24;24318:2;24310:6;24306:15;24299:49;24114:241;:::o;24361:366::-;24503:3;24524:67;24588:2;24583:3;24524:67;:::i;:::-;24517:74;;24600:93;24689:3;24600:93;:::i;:::-;24718:2;24713:3;24709:12;24702:19;;24361:366;;;:::o;24733:419::-;24899:4;24937:2;24926:9;24922:18;24914:26;;24986:9;24980:4;24976:20;24972:1;24961:9;24957:17;24950:47;25014:131;25140:4;25014:131;:::i;:::-;25006:139;;24733:419;;;:::o;25158:180::-;25206:77;25203:1;25196:88;25303:4;25300:1;25293:15;25327:4;25324:1;25317:15;25344:180;25392:77;25389:1;25382:88;25489:4;25486:1;25479:15;25513:4;25510:1;25503:15;25530:143;25587:5;25618:6;25612:13;25603:22;;25634:33;25661:5;25634:33;:::i;:::-;25530:143;;;;:::o;25679:351::-;25749:6;25798:2;25786:9;25777:7;25773:23;25769:32;25766:119;;;25804:79;;:::i;:::-;25766:119;25924:1;25949:64;26005:7;25996:6;25985:9;25981:22;25949:64;:::i;:::-;25939:74;;25895:128;25679:351;;;;:::o;26036:85::-;26081:7;26110:5;26099:16;;26036:85;;;:::o;26127:158::-;26185:9;26218:61;26236:42;26245:32;26271:5;26245:32;:::i;:::-;26236:42;:::i;:::-;26218:61;:::i;:::-;26205:74;;26127:158;;;:::o;26291:147::-;26386:45;26425:5;26386:45;:::i;:::-;26381:3;26374:58;26291:147;;:::o;26444:114::-;26511:6;26545:5;26539:12;26529:22;;26444:114;;;:::o;26564:184::-;26663:11;26697:6;26692:3;26685:19;26737:4;26732:3;26728:14;26713:29;;26564:184;;;;:::o;26754:132::-;26821:4;26844:3;26836:11;;26874:4;26869:3;26865:14;26857:22;;26754:132;;;:::o;26892:108::-;26969:24;26987:5;26969:24;:::i;:::-;26964:3;26957:37;26892:108;;:::o;27006:179::-;27075:10;27096:46;27138:3;27130:6;27096:46;:::i;:::-;27174:4;27169:3;27165:14;27151:28;;27006:179;;;;:::o;27191:113::-;27261:4;27293;27288:3;27284:14;27276:22;;27191:113;;;:::o;27340:732::-;27459:3;27488:54;27536:5;27488:54;:::i;:::-;27558:86;27637:6;27632:3;27558:86;:::i;:::-;27551:93;;27668:56;27718:5;27668:56;:::i;:::-;27747:7;27778:1;27763:284;27788:6;27785:1;27782:13;27763:284;;;27864:6;27858:13;27891:63;27950:3;27935:13;27891:63;:::i;:::-;27884:70;;27977:60;28030:6;27977:60;:::i;:::-;27967:70;;27823:224;27810:1;27807;27803:9;27798:14;;27763:284;;;27767:14;28063:3;28056:10;;27464:608;;;27340:732;;;;:::o;28078:831::-;28341:4;28379:3;28368:9;28364:19;28356:27;;28393:71;28461:1;28450:9;28446:17;28437:6;28393:71;:::i;:::-;28474:80;28550:2;28539:9;28535:18;28526:6;28474:80;:::i;:::-;28601:9;28595:4;28591:20;28586:2;28575:9;28571:18;28564:48;28629:108;28732:4;28723:6;28629:108;:::i;:::-;28621:116;;28747:72;28815:2;28804:9;28800:18;28791:6;28747:72;:::i;:::-;28829:73;28897:3;28886:9;28882:19;28873:6;28829:73;:::i;:::-;28078:831;;;;;;;;:::o;28915:807::-;29164:4;29202:3;29191:9;29187:19;29179:27;;29216:71;29284:1;29273:9;29269:17;29260:6;29216:71;:::i;:::-;29297:72;29365:2;29354:9;29350:18;29341:6;29297:72;:::i;:::-;29379:80;29455:2;29444:9;29440:18;29431:6;29379:80;:::i;:::-;29469;29545:2;29534:9;29530:18;29521:6;29469:80;:::i;:::-;29559:73;29627:3;29616:9;29612:19;29603:6;29559:73;:::i;:::-;29642;29710:3;29699:9;29695:19;29686:6;29642:73;:::i;:::-;28915:807;;;;;;;;;:::o;29728:143::-;29785:5;29816:6;29810:13;29801:22;;29832:33;29859:5;29832:33;:::i;:::-;29728:143;;;;:::o;29877:663::-;29965:6;29973;29981;30030:2;30018:9;30009:7;30005:23;30001:32;29998:119;;;30036:79;;:::i;:::-;29998:119;30156:1;30181:64;30237:7;30228:6;30217:9;30213:22;30181:64;:::i;:::-;30171:74;;30127:128;30294:2;30320:64;30376:7;30367:6;30356:9;30352:22;30320:64;:::i;:::-;30310:74;;30265:129;30433:2;30459:64;30515:7;30506:6;30495:9;30491:22;30459:64;:::i;:::-;30449:74;;30404:129;29877:663;;;;;:::o;30546:147::-;30647:11;30684:3;30669:18;;30546:147;;;;:::o;30699:114::-;;:::o;30819:398::-;30978:3;30999:83;31080:1;31075:3;30999:83;:::i;:::-;30992:90;;31091:93;31180:3;31091:93;:::i;:::-;31209:1;31204:3;31200:11;31193:18;;30819:398;;;:::o;31223:379::-;31407:3;31429:147;31572:3;31429:147;:::i;:::-;31422:154;;31593:3;31586:10;;31223:379;;;:::o;31608:181::-;31748:33;31744:1;31736:6;31732:14;31725:57;31608:181;:::o;31795:366::-;31937:3;31958:67;32022:2;32017:3;31958:67;:::i;:::-;31951:74;;32034:93;32123:3;32034:93;:::i;:::-;32152:2;32147:3;32143:12;32136:19;;31795:366;;;:::o;32167:419::-;32333:4;32371:2;32360:9;32356:18;32348:26;;32420:9;32414:4;32410:20;32406:1;32395:9;32391:17;32384:47;32448:131;32574:4;32448:131;:::i;:::-;32440:139;;32167:419;;;:::o

Swarm Source

ipfs://73f39b6819a3e126375ae1d731f15d3198516cd36144a683c38307a6e6933f21
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.