ETH Price: $3,109.41 (-0.13%)
Gas: 3 Gwei

Token

The AlphaBYTEs (BYTEs)
 

Overview

Max Total Supply

145 BYTEs

Holders

101

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
Binance 16
Balance
1 BYTEs
0xDFd5293D8e347dFe59E90eFd55b2956a1343963d
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:
AlphaBytes

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-28
*/

// File: contracts/library/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @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);
}
// File: contracts/library/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}
// File: contracts/library/IERC721Receiver.sol


// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: contracts/library/Strings.sol



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
// File: contracts/library/IERC165.sol



// File: @openzeppelin/contracts/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: contracts/library/IERC721.sol



// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}
// File: contracts/library/IERC721Enumerable.sol



// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: contracts/library/IERC721Metadata.sol



// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: contracts/library/ERC165.sol



// File: @openzeppelin/contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}
// File: contracts/library/Context.sol



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



pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
// File: contracts/library/ERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        uint256 currentAllowance = _allowances[sender][_msgSender()];
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
            unchecked {
                _approve(sender, _msgSender(), currentAllowance - amount);
            }
        }

        _transfer(sender, recipient, amount);

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

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

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

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

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

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}
// File: contracts/library/Ownable.sol



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



pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: contracts/library/Address.sol



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



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: contracts/library/ERC721.sol



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



pragma solidity ^0.8.0;











/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}
// File: contracts/library/ERC721Enumerable.sol



// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol



pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/AlphaBytes.sol





/*


                                                                                                               
,--------.,--.                  ,---.  ,--.       ,--.             ,-----.,--.   ,--.,--------.,------.        
'--.  .--'|  ,---.  ,---.      /  O  \ |  | ,---. |  ,---.  ,--,--.|  |) /_\  `.'  / '--.  .--'|  .---' ,---.  
   |  |   |  .-.  || .-. :    |  .-.  ||  || .-. ||  .-.  |' ,-.  ||  .-.  \'.    /     |  |   |  `--, (  .-'  
   |  |   |  | |  |\   --.    |  | |  ||  || '-' '|  | |  |\ '-'  ||  '--' /  |  |      |  |   |  `---..-'  `) 
   `--'   `--' `--' `----'    `--' `--'`--'|  |-' `--' `--' `--`--'`------'   `--'      `--'   `------'`----'  
                                           `--'                                                                
,--.                 ,---.                   ,--.  ,--.                                                        
|  |-.,--. ,--.     /  O  \ ,--,--,--.,--.--.`--',-'  '-. ,--,--.                                              
| .-. '\  '  /     |  .-.  ||        ||  .--',--.'-.  .-'' ,-.  |                                              
| `-' | \   '      |  | |  ||  |  |  ||  |   |  |  |  |  \ '-'  |                                              
 `---'.-'  /       `--' `--'`--`--`--'`--'   `--'  `--'   `--`--'                                              
      `---'                                                                                                    

PopElon
WWW..THEALPHABYTES.COM
https://discord.gg/pSBMtAttbJ
www.twitter.com/artbyamrita


*/



// File: contracts/AlphaBytes.sol


pragma solidity >=0.7.0 <0.9.0;















contract AlphaBytes is ERC721Enumerable, Ownable {
  using Strings for uint256;

  string public baseURI;
  string public baseExtension = ".json";
  string public notRevealedUri;
  uint256 public whitelistCost = 0.8 ether; 
  uint256 public cost = 1.0 ether;
  uint256 public maxSupply = 145;
  uint256 public maxMintAmount = 3;
  uint256 public nftPerAddressLimit = 145;
  bool public paused = false;
  bool public revealed = false;
  bool public onlyWhitelisted = true;
  mapping(address => bool) public whitelistedAddresses;
  mapping(address => uint256) public addressMintedBalance;
  mapping(uint256 => bool) public claimed;
  mapping(uint256 => bool) public minted;
  uint256 public totalsupply = 0;

  event Claimed(uint256 tokenId, address indexed account);

  constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    string memory _initNotRevealedUri
  ) ERC721(_name, _symbol) {
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);
  }

  // internal
  function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
  }

  // public
  function mint(uint256 _mintAmount) public payable {
    require(!paused, "the contract is paused");
    uint256 supply = totalSupply();
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    require(_mintAmount <= maxMintAmount, "max mint amount per session exceeded");
    require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

    if (msg.sender != owner()) {
        if(onlyWhitelisted == true) {
            require(isWhitelisted(msg.sender), "user is not whitelisted");
            uint256 ownerMintedCount = addressMintedBalance[msg.sender];
            require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded");
            require(msg.value >= whitelistCost * _mintAmount, "insufficient funds");
        }else {
          require(msg.value >= cost * _mintAmount, "insufficient funds");
        }
    }
    
    for (uint256 i = 1; i <= _mintAmount; i++) {
      totalsupply++;
      while ( minted[totalsupply] == true)
      {
        totalsupply++;
      }
      addressMintedBalance[msg.sender]++;
      
      minted[totalsupply] = true;
      _safeMint(msg.sender, totalsupply);
      
    }
  }
  
  function gift(uint256[] calldata _tokenIds, address _to) public onlyOwner {
    require(!paused, "the contract is paused");
    require(_to != address(0), "invalid address");
    for(uint i=0;i<_tokenIds.length;i++){
      uint256 supply = totalSupply();
      require(supply + 1 <= maxSupply, "max NFT limit exceeded");

      require(minted[_tokenIds[i]] == false, "NFT already minted");
      addressMintedBalance[_to]++;
      minted[_tokenIds[i]] = true;
      _safeMint(_to, _tokenIds[i]);
    }
  }

  function isWhitelisted(address _user) public view returns (bool) {
    return  whitelistedAddresses[_user];
  }

  function claim(uint256 _tokenId) public {
    require(ownerOf(_tokenId) == msg.sender, "only owner can claim");
    claimed[_tokenId] = true;

    emit Claimed(_tokenId, msg.sender);
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
    if(revealed == false) {
        return notRevealedUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
        : "";
  }

  //only owner
  function reveal() public onlyOwner {
      revealed = true;
  }
  
  function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
    nftPerAddressLimit = _limit;
  }

  function changeOwner(address newOwner) public onlyOwner {
    transferOwnership(newOwner);
  }

  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }

  function setWhitelistCost(uint256 _newCost) public onlyOwner {
    whitelistCost = _newCost;
  }
//   function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
//     maxMintAmount = _newmaxMintAmount;
//   }

  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseURI = _newBaseURI;
  }

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }
  
  function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
    notRevealedUri = _notRevealedURI;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }
  
  function setOnlyWhitelisted(bool _state) public onlyOwner {
    onlyWhitelisted = _state;
  }
  
  function whitelistUsers(address[] calldata _users) public onlyOwner {
    for(uint i=0;i<_users.length;i++){
        whitelistedAddresses[_users[i]]=true;
    }
  }
 function whitelistUser(address _user) public onlyOwner {
        whitelistedAddresses[_user]=true;    
  }
  function withdraw() public payable onlyOwner {

    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);

  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"address","name":"_to","type":"address"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"minted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setWhitelistCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalsupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"whitelistUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c908051906020019062000051929190620003d2565b50670b1a2bc2ec500000600e55670de0b6b3a7640000600f556091601055600360115560916012556000601360006101000a81548160ff0219169083151502179055506000601360016101000a81548160ff0219169083151502179055506001601360026101000a81548160ff0219169083151502179055506000601855348015620000dc57600080fd5b506040516200623038038062006230833981810160405281019062000102919062000500565b838381600090805190602001906200011c929190620003d2565b50806001908051906020019062000135929190620003d2565b505050620001586200014c6200018460201b60201c565b6200018c60201b60201c565b62000169826200025260201b60201c565b6200017a81620002fd60201b60201c565b50505050620007f5565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002626200018460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000288620003a860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002e1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002d89062000615565b60405180910390fd5b80600b9080519060200190620002f9929190620003d2565b5050565b6200030d6200018460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000333620003a860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200038c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003839062000615565b60405180910390fd5b80600d9080519060200190620003a4929190620003d2565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003e090620006dd565b90600052602060002090601f01602090048101928262000404576000855562000450565b82601f106200041f57805160ff191683800117855562000450565b8280016001018555821562000450579182015b828111156200044f57825182559160200191906001019062000432565b5b5090506200045f919062000463565b5090565b5b808211156200047e57600081600090555060010162000464565b5090565b600062000499620004938462000660565b62000637565b905082815260208101848484011115620004b857620004b7620007ac565b5b620004c5848285620006a7565b509392505050565b600082601f830112620004e557620004e4620007a7565b5b8151620004f784826020860162000482565b91505092915050565b600080600080608085870312156200051d576200051c620007b6565b5b600085015167ffffffffffffffff8111156200053e576200053d620007b1565b5b6200054c87828801620004cd565b945050602085015167ffffffffffffffff81111562000570576200056f620007b1565b5b6200057e87828801620004cd565b935050604085015167ffffffffffffffff811115620005a257620005a1620007b1565b5b620005b087828801620004cd565b925050606085015167ffffffffffffffff811115620005d457620005d3620007b1565b5b620005e287828801620004cd565b91505092959194509250565b6000620005fd60208362000696565b91506200060a82620007cc565b602082019050919050565b600060208201905081810360008301526200063081620005ee565b9050919050565b60006200064362000656565b905062000651828262000713565b919050565b6000604051905090565b600067ffffffffffffffff8211156200067e576200067d62000778565b5b6200068982620007bb565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620006c7578082015181840152602081019050620006aa565b83811115620006d7576000848401525b50505050565b60006002820490506001821680620006f657607f821691505b602082108114156200070d576200070c62000749565b5b50919050565b6200071e82620007bb565b810181811067ffffffffffffffff8211171562000740576200073f62000778565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b615a2b80620008056000396000f3fe60806040526004361061031a5760003560e01c80636c0360eb116101ab578063b88d4fde116100f7578063da3ef23f11610095578063e985e9c51161006f578063e985e9c514610bcc578063edec5f2714610c09578063f2c4ce1e14610c32578063f2fde38b14610c5b5761031a565b8063da3ef23f14610b3b578063dbe7e3bd14610b64578063e7b99ec714610ba15761031a565b8063c87b56dd116100d1578063c87b56dd14610a81578063d0eb26b014610abe578063d49479eb14610ae7578063d5abeb0114610b105761031a565b8063b88d4fde14610a02578063ba7d2c7614610a2b578063c668286214610a565761031a565b80638f44652e11610164578063a0712d681161013e578063a0712d681461097d578063a22cb46514610999578063a475b5dd146109c2578063a6f9dae1146109d95761031a565b80638f44652e146108fe57806395d89b41146109275780639c70b512146109525761031a565b80636c0360eb146107ec57806370a0823114610817578063715018a61461085457806372dd529b1461086b5780637dc0bf3f146108965780638da5cb5b146108d35761031a565b8063379607f51161026a57806344a0d68a1161022357806351830227116101fd578063518302271461073057806355f804b31461075b5780635c975abb146107845780636352211e146107af5761031a565b806344a0d68a146106a15780634a4c560d146106ca5780634f6ccce7146106f35761031a565b8063379607f5146105a25780633af32abf146105cb5780633c952764146106085780633ccfd60b1461063157806342842e0e1461063b578063438b6300146106645761031a565b8063095ea7b3116102d757806318cae269116102b157806318cae269146104d4578063239c70ae1461051157806323b872dd1461053c5780632f745c59146105655761031a565b8063095ea7b31461045557806313faede61461047e57806318160ddd146104a95761031a565b806301ffc9a71461031f57806302329a291461035c57806306c933d81461038557806306fdde03146103c2578063081812fc146103ed578063081c8c441461042a575b600080fd5b34801561032b57600080fd5b506103466004803603810190610341919061428a565b610c84565b60405161035391906149f4565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e919061425d565b610cfe565b005b34801561039157600080fd5b506103ac60048036038101906103a79190613fed565b610d97565b6040516103b991906149f4565b60405180910390f35b3480156103ce57600080fd5b506103d7610db7565b6040516103e49190614a0f565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f919061432d565b610e49565b604051610421919061496b565b60405180910390f35b34801561043657600080fd5b5061043f610ece565b60405161044c9190614a0f565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190614170565b610f5c565b005b34801561048a57600080fd5b50610493611074565b6040516104a09190614db1565b60405180910390f35b3480156104b557600080fd5b506104be61107a565b6040516104cb9190614db1565b60405180910390f35b3480156104e057600080fd5b506104fb60048036038101906104f69190613fed565b611087565b6040516105089190614db1565b60405180910390f35b34801561051d57600080fd5b5061052661109f565b6040516105339190614db1565b60405180910390f35b34801561054857600080fd5b50610563600480360381019061055e919061405a565b6110a5565b005b34801561057157600080fd5b5061058c60048036038101906105879190614170565b611105565b6040516105999190614db1565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c4919061432d565b6111aa565b005b3480156105d757600080fd5b506105f260048036038101906105ed9190613fed565b61129d565b6040516105ff91906149f4565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a919061425d565b6112f3565b005b61063961138c565b005b34801561064757600080fd5b50610662600480360381019061065d919061405a565b611488565b005b34801561067057600080fd5b5061068b60048036038101906106869190613fed565b6114a8565b60405161069891906149d2565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c3919061432d565b611556565b005b3480156106d657600080fd5b506106f160048036038101906106ec9190613fed565b6115dc565b005b3480156106ff57600080fd5b5061071a6004803603810190610715919061432d565b6116b3565b6040516107279190614db1565b60405180910390f35b34801561073c57600080fd5b50610745611724565b60405161075291906149f4565b60405180910390f35b34801561076757600080fd5b50610782600480360381019061077d91906142e4565b611737565b005b34801561079057600080fd5b506107996117cd565b6040516107a691906149f4565b60405180910390f35b3480156107bb57600080fd5b506107d660048036038101906107d1919061432d565b6117e0565b6040516107e3919061496b565b60405180910390f35b3480156107f857600080fd5b50610801611892565b60405161080e9190614a0f565b60405180910390f35b34801561082357600080fd5b5061083e60048036038101906108399190613fed565b611920565b60405161084b9190614db1565b60405180910390f35b34801561086057600080fd5b506108696119d8565b005b34801561087757600080fd5b50610880611a60565b60405161088d9190614db1565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b8919061432d565b611a66565b6040516108ca91906149f4565b60405180910390f35b3480156108df57600080fd5b506108e8611a86565b6040516108f5919061496b565b60405180910390f35b34801561090a57600080fd5b50610925600480360381019061092091906141fd565b611ab0565b005b34801561093357600080fd5b5061093c611dae565b6040516109499190614a0f565b60405180910390f35b34801561095e57600080fd5b50610967611e40565b60405161097491906149f4565b60405180910390f35b6109976004803603810190610992919061432d565b611e53565b005b3480156109a557600080fd5b506109c060048036038101906109bb9190614130565b61227b565b005b3480156109ce57600080fd5b506109d76123fc565b005b3480156109e557600080fd5b50610a0060048036038101906109fb9190613fed565b612495565b005b348015610a0e57600080fd5b50610a296004803603810190610a2491906140ad565b61251d565b005b348015610a3757600080fd5b50610a4061257f565b604051610a4d9190614db1565b60405180910390f35b348015610a6257600080fd5b50610a6b612585565b604051610a789190614a0f565b60405180910390f35b348015610a8d57600080fd5b50610aa86004803603810190610aa3919061432d565b612613565b604051610ab59190614a0f565b60405180910390f35b348015610aca57600080fd5b50610ae56004803603810190610ae0919061432d565b61276c565b005b348015610af357600080fd5b50610b0e6004803603810190610b09919061432d565b6127f2565b005b348015610b1c57600080fd5b50610b25612878565b604051610b329190614db1565b60405180910390f35b348015610b4757600080fd5b50610b626004803603810190610b5d91906142e4565b61287e565b005b348015610b7057600080fd5b50610b8b6004803603810190610b86919061432d565b612914565b604051610b9891906149f4565b60405180910390f35b348015610bad57600080fd5b50610bb6612934565b604051610bc39190614db1565b60405180910390f35b348015610bd857600080fd5b50610bf36004803603810190610bee919061401a565b61293a565b604051610c0091906149f4565b60405180910390f35b348015610c1557600080fd5b50610c306004803603810190610c2b91906141b0565b6129ce565b005b348015610c3e57600080fd5b50610c596004803603810190610c5491906142e4565b612aef565b005b348015610c6757600080fd5b50610c826004803603810190610c7d9190613fed565b612b85565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cf75750610cf682612c7d565b5b9050919050565b610d06612d5f565b73ffffffffffffffffffffffffffffffffffffffff16610d24611a86565b73ffffffffffffffffffffffffffffffffffffffff1614610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7190614c71565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b60146020528060005260406000206000915054906101000a900460ff1681565b606060008054610dc6906150ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610df2906150ba565b8015610e3f5780601f10610e1457610100808354040283529160200191610e3f565b820191906000526020600020905b815481529060010190602001808311610e2257829003601f168201915b5050505050905090565b6000610e5482612d67565b610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90614c51565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610edb906150ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610f07906150ba565b8015610f545780601f10610f2957610100808354040283529160200191610f54565b820191906000526020600020905b815481529060010190602001808311610f3757829003601f168201915b505050505081565b6000610f67826117e0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcf90614cf1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ff7612d5f565b73ffffffffffffffffffffffffffffffffffffffff161480611026575061102581611020612d5f565b61293a565b5b611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c90614b51565b60405180910390fd5b61106f8383612dd3565b505050565b600f5481565b6000600880549050905090565b60156020528060005260406000206000915090505481565b60115481565b6110b66110b0612d5f565b82612e8c565b6110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ec90614d31565b60405180910390fd5b611100838383612f6a565b505050565b600061111083611920565b8210611151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114890614a31565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b3373ffffffffffffffffffffffffffffffffffffffff166111ca826117e0565b73ffffffffffffffffffffffffffffffffffffffff1614611220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121790614c31565b60405180910390fd5b60016016600083815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f6aa3eac93d079e5e100b1029be716caa33586c96aa4baac390669fb5c2a21212826040516112929190614db1565b60405180910390a250565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6112fb612d5f565b73ffffffffffffffffffffffffffffffffffffffff16611319611a86565b73ffffffffffffffffffffffffffffffffffffffff161461136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136690614c71565b60405180910390fd5b80601360026101000a81548160ff02191690831515021790555050565b611394612d5f565b73ffffffffffffffffffffffffffffffffffffffff166113b2611a86565b73ffffffffffffffffffffffffffffffffffffffff1614611408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ff90614c71565b60405180910390fd5b6000611412611a86565b73ffffffffffffffffffffffffffffffffffffffff164760405161143590614956565b60006040518083038185875af1925050503d8060008114611472576040519150601f19603f3d011682016040523d82523d6000602084013e611477565b606091505b505090508061148557600080fd5b50565b6114a38383836040518060200160405280600081525061251d565b505050565b606060006114b583611920565b905060008167ffffffffffffffff8111156114d3576114d2615282565b5b6040519080825280602002602001820160405280156115015781602001602082028036833780820191505090505b50905060005b8281101561154b576115198582611105565b82828151811061152c5761152b615253565b5b60200260200101818152505080806115439061511d565b915050611507565b508092505050919050565b61155e612d5f565b73ffffffffffffffffffffffffffffffffffffffff1661157c611a86565b73ffffffffffffffffffffffffffffffffffffffff16146115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c990614c71565b60405180910390fd5b80600f8190555050565b6115e4612d5f565b73ffffffffffffffffffffffffffffffffffffffff16611602611a86565b73ffffffffffffffffffffffffffffffffffffffff1614611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164f90614c71565b60405180910390fd5b6001601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006116bd61107a565b82106116fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f590614d51565b60405180910390fd5b6008828154811061171257611711615253565b5b90600052602060002001549050919050565b601360019054906101000a900460ff1681565b61173f612d5f565b73ffffffffffffffffffffffffffffffffffffffff1661175d611a86565b73ffffffffffffffffffffffffffffffffffffffff16146117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117aa90614c71565b60405180910390fd5b80600b90805190602001906117c9929190613d55565b5050565b601360009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188090614b91565b60405180910390fd5b80915050919050565b600b805461189f906150ba565b80601f01602080910402602001604051908101604052809291908181526020018280546118cb906150ba565b80156119185780601f106118ed57610100808354040283529160200191611918565b820191906000526020600020905b8154815290600101906020018083116118fb57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198890614b71565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6119e0612d5f565b73ffffffffffffffffffffffffffffffffffffffff166119fe611a86565b73ffffffffffffffffffffffffffffffffffffffff1614611a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4b90614c71565b60405180910390fd5b611a5e60006131c6565b565b60185481565b60176020528060005260406000206000915054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ab8612d5f565b73ffffffffffffffffffffffffffffffffffffffff16611ad6611a86565b73ffffffffffffffffffffffffffffffffffffffff1614611b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2390614c71565b60405180910390fd5b601360009054906101000a900460ff1615611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7390614c91565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be390614bb1565b60405180910390fd5b60005b83839050811015611da8576000611c0461107a565b9050601054600182611c169190614eef565b1115611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e90614bd1565b60405180910390fd5b6000151560176000878786818110611c7257611c71615253565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16151514611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce90614af1565b60405180910390fd5b601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611d279061511d565b9190505550600160176000878786818110611d4557611d44615253565b5b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550611d9483868685818110611d8857611d87615253565b5b9050602002013561328c565b508080611da09061511d565b915050611bef565b50505050565b606060018054611dbd906150ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611de9906150ba565b8015611e365780601f10611e0b57610100808354040283529160200191611e36565b820191906000526020600020905b815481529060010190602001808311611e1957829003601f168201915b5050505050905090565b601360029054906101000a900460ff1681565b601360009054906101000a900460ff1615611ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9a90614c91565b60405180910390fd5b6000611ead61107a565b905060008211611ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee990614d91565b60405180910390fd5b601154821115611f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e90614bf1565b60405180910390fd5b6010548282611f469190614eef565b1115611f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7e90614bd1565b60405180910390fd5b611f8f611a86565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121615760011515601360029054906101000a900460ff161515141561210f57611fe63361129d565b612025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201c90614d71565b60405180910390fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060125483826120789190614eef565b11156120b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b090614ab1565b60405180910390fd5b82600e546120c79190614f76565b341015612109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210090614d11565b60405180910390fd5b50612160565b81600f5461211d9190614f76565b34101561215f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215690614d11565b60405180910390fd5b5b5b6000600190505b82811161227657601860008154809291906121829061511d565b91905055505b6001151560176000601854815260200190815260200160002060009054906101000a900460ff16151514156121d457601860008154809291906121ca9061511d565b9190505550612188565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906122249061511d565b9190505550600160176000601854815260200190815260200160002060006101000a81548160ff0219169083151502179055506122633360185461328c565b808061226e9061511d565b915050612168565b505050565b612283612d5f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e890614b11565b60405180910390fd5b80600560006122fe612d5f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166123ab612d5f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123f091906149f4565b60405180910390a35050565b612404612d5f565b73ffffffffffffffffffffffffffffffffffffffff16612422611a86565b73ffffffffffffffffffffffffffffffffffffffff1614612478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246f90614c71565b60405180910390fd5b6001601360016101000a81548160ff021916908315150217905550565b61249d612d5f565b73ffffffffffffffffffffffffffffffffffffffff166124bb611a86565b73ffffffffffffffffffffffffffffffffffffffff1614612511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250890614c71565b60405180910390fd5b61251a81612b85565b50565b61252e612528612d5f565b83612e8c565b61256d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256490614d31565b60405180910390fd5b612579848484846132aa565b50505050565b60125481565b600c8054612592906150ba565b80601f01602080910402602001604051908101604052809291908181526020018280546125be906150ba565b801561260b5780601f106125e05761010080835404028352916020019161260b565b820191906000526020600020905b8154815290600101906020018083116125ee57829003601f168201915b505050505081565b606061261e82612d67565b61265d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265490614cd1565b60405180910390fd5b60001515601360019054906101000a900460ff161515141561270b57600d8054612686906150ba565b80601f01602080910402602001604051908101604052809291908181526020018280546126b2906150ba565b80156126ff5780601f106126d4576101008083540402835291602001916126ff565b820191906000526020600020905b8154815290600101906020018083116126e257829003601f168201915b50505050509050612767565b6000612715613306565b905060008151116127355760405180602001604052806000815250612763565b8061273f84613398565b600c60405160200161275393929190614925565b6040516020818303038152906040525b9150505b919050565b612774612d5f565b73ffffffffffffffffffffffffffffffffffffffff16612792611a86565b73ffffffffffffffffffffffffffffffffffffffff16146127e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127df90614c71565b60405180910390fd5b8060128190555050565b6127fa612d5f565b73ffffffffffffffffffffffffffffffffffffffff16612818611a86565b73ffffffffffffffffffffffffffffffffffffffff161461286e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286590614c71565b60405180910390fd5b80600e8190555050565b60105481565b612886612d5f565b73ffffffffffffffffffffffffffffffffffffffff166128a4611a86565b73ffffffffffffffffffffffffffffffffffffffff16146128fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f190614c71565b60405180910390fd5b80600c9080519060200190612910929190613d55565b5050565b60166020528060005260406000206000915054906101000a900460ff1681565b600e5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6129d6612d5f565b73ffffffffffffffffffffffffffffffffffffffff166129f4611a86565b73ffffffffffffffffffffffffffffffffffffffff1614612a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4190614c71565b60405180910390fd5b60005b82829050811015612aea57600160146000858585818110612a7157612a70615253565b5b9050602002016020810190612a869190613fed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612ae29061511d565b915050612a4d565b505050565b612af7612d5f565b73ffffffffffffffffffffffffffffffffffffffff16612b15611a86565b73ffffffffffffffffffffffffffffffffffffffff1614612b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6290614c71565b60405180910390fd5b80600d9080519060200190612b81929190613d55565b5050565b612b8d612d5f565b73ffffffffffffffffffffffffffffffffffffffff16612bab611a86565b73ffffffffffffffffffffffffffffffffffffffff1614612c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf890614c71565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6890614a71565b60405180910390fd5b612c7a816131c6565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d4857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d585750612d57826134f9565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e46836117e0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e9782612d67565b612ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecd90614b31565b60405180910390fd5b6000612ee1836117e0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f5057508373ffffffffffffffffffffffffffffffffffffffff16612f3884610e49565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f615750612f60818561293a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f8a826117e0565b73ffffffffffffffffffffffffffffffffffffffff1614612fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd790614cb1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304790614ad1565b60405180910390fd5b61305b838383613563565b613066600082612dd3565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130b69190614fd0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461310d9190614eef565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6132a6828260405180602001604052806000815250613677565b5050565b6132b5848484612f6a565b6132c1848484846136d2565b613300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f790614a51565b60405180910390fd5b50505050565b6060600b8054613315906150ba565b80601f0160208091040260200160405190810160405280929190818152602001828054613341906150ba565b801561338e5780601f106133635761010080835404028352916020019161338e565b820191906000526020600020905b81548152906001019060200180831161337157829003601f168201915b5050505050905090565b606060008214156133e0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134f4565b600082905060005b600082146134125780806133fb9061511d565b915050600a8261340b9190614f45565b91506133e8565b60008167ffffffffffffffff81111561342e5761342d615282565b5b6040519080825280601f01601f1916602001820160405280156134605781602001600182028036833780820191505090505b5090505b600085146134ed576001826134799190614fd0565b9150600a856134889190615166565b60306134949190614eef565b60f81b8183815181106134aa576134a9615253565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134e69190614f45565b9450613464565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61356e838383613869565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135b1576135ac8161386e565b6135f0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135ef576135ee83826138b7565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136335761362e81613a24565b613672565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613671576136708282613af5565b5b5b505050565b6136818383613b74565b61368e60008484846136d2565b6136cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c490614a51565b60405180910390fd5b505050565b60006136f38473ffffffffffffffffffffffffffffffffffffffff16613d42565b1561385c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261371c612d5f565b8786866040518563ffffffff1660e01b815260040161373e9493929190614986565b602060405180830381600087803b15801561375857600080fd5b505af192505050801561378957506040513d601f19601f8201168201806040525081019061378691906142b7565b60015b61380c573d80600081146137b9576040519150601f19603f3d011682016040523d82523d6000602084013e6137be565b606091505b50600081511415613804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137fb90614a51565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613861565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016138c484611920565b6138ce9190614fd0565b90506000600760008481526020019081526020016000205490508181146139b3576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613a389190614fd0565b9050600060096000848152602001908152602001600020549050600060088381548110613a6857613a67615253565b5b906000526020600020015490508060088381548110613a8a57613a89615253565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613ad957613ad8615224565b5b6001900381819060005260206000200160009055905550505050565b6000613b0083611920565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bdb90614c11565b60405180910390fd5b613bed81612d67565b15613c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c2490614a91565b60405180910390fd5b613c3960008383613563565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c899190614eef565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613d61906150ba565b90600052602060002090601f016020900481019282613d835760008555613dca565b82601f10613d9c57805160ff1916838001178555613dca565b82800160010185558215613dca579182015b82811115613dc9578251825591602001919060010190613dae565b5b509050613dd79190613ddb565b5090565b5b80821115613df4576000816000905550600101613ddc565b5090565b6000613e0b613e0684614df1565b614dcc565b905082815260208101848484011115613e2757613e266152c0565b5b613e32848285615078565b509392505050565b6000613e4d613e4884614e22565b614dcc565b905082815260208101848484011115613e6957613e686152c0565b5b613e74848285615078565b509392505050565b600081359050613e8b81615999565b92915050565b60008083601f840112613ea757613ea66152b6565b5b8235905067ffffffffffffffff811115613ec457613ec36152b1565b5b602083019150836020820283011115613ee057613edf6152bb565b5b9250929050565b60008083601f840112613efd57613efc6152b6565b5b8235905067ffffffffffffffff811115613f1a57613f196152b1565b5b602083019150836020820283011115613f3657613f356152bb565b5b9250929050565b600081359050613f4c816159b0565b92915050565b600081359050613f61816159c7565b92915050565b600081519050613f76816159c7565b92915050565b600082601f830112613f9157613f906152b6565b5b8135613fa1848260208601613df8565b91505092915050565b600082601f830112613fbf57613fbe6152b6565b5b8135613fcf848260208601613e3a565b91505092915050565b600081359050613fe7816159de565b92915050565b600060208284031215614003576140026152ca565b5b600061401184828501613e7c565b91505092915050565b60008060408385031215614031576140306152ca565b5b600061403f85828601613e7c565b925050602061405085828601613e7c565b9150509250929050565b600080600060608486031215614073576140726152ca565b5b600061408186828701613e7c565b935050602061409286828701613e7c565b92505060406140a386828701613fd8565b9150509250925092565b600080600080608085870312156140c7576140c66152ca565b5b60006140d587828801613e7c565b94505060206140e687828801613e7c565b93505060406140f787828801613fd8565b925050606085013567ffffffffffffffff811115614118576141176152c5565b5b61412487828801613f7c565b91505092959194509250565b60008060408385031215614147576141466152ca565b5b600061415585828601613e7c565b925050602061416685828601613f3d565b9150509250929050565b60008060408385031215614187576141866152ca565b5b600061419585828601613e7c565b92505060206141a685828601613fd8565b9150509250929050565b600080602083850312156141c7576141c66152ca565b5b600083013567ffffffffffffffff8111156141e5576141e46152c5565b5b6141f185828601613e91565b92509250509250929050565b600080600060408486031215614216576142156152ca565b5b600084013567ffffffffffffffff811115614234576142336152c5565b5b61424086828701613ee7565b9350935050602061425386828701613e7c565b9150509250925092565b600060208284031215614273576142726152ca565b5b600061428184828501613f3d565b91505092915050565b6000602082840312156142a05761429f6152ca565b5b60006142ae84828501613f52565b91505092915050565b6000602082840312156142cd576142cc6152ca565b5b60006142db84828501613f67565b91505092915050565b6000602082840312156142fa576142f96152ca565b5b600082013567ffffffffffffffff811115614318576143176152c5565b5b61432484828501613faa565b91505092915050565b600060208284031215614343576143426152ca565b5b600061435184828501613fd8565b91505092915050565b60006143668383614907565b60208301905092915050565b61437b81615004565b82525050565b600061438c82614e78565b6143968185614ea6565b93506143a183614e53565b8060005b838110156143d25781516143b9888261435a565b97506143c483614e99565b9250506001810190506143a5565b5085935050505092915050565b6143e881615016565b82525050565b60006143f982614e83565b6144038185614eb7565b9350614413818560208601615087565b61441c816152cf565b840191505092915050565b600061443282614e8e565b61443c8185614ed3565b935061444c818560208601615087565b614455816152cf565b840191505092915050565b600061446b82614e8e565b6144758185614ee4565b9350614485818560208601615087565b80840191505092915050565b6000815461449e816150ba565b6144a88186614ee4565b945060018216600081146144c357600181146144d457614507565b60ff19831686528186019350614507565b6144dd85614e63565b60005b838110156144ff578154818901526001820191506020810190506144e0565b838801955050505b50505092915050565b600061451d602b83614ed3565b9150614528826152e0565b604082019050919050565b6000614540603283614ed3565b915061454b8261532f565b604082019050919050565b6000614563602683614ed3565b915061456e8261537e565b604082019050919050565b6000614586601c83614ed3565b9150614591826153cd565b602082019050919050565b60006145a9601c83614ed3565b91506145b4826153f6565b602082019050919050565b60006145cc602483614ed3565b91506145d78261541f565b604082019050919050565b60006145ef601283614ed3565b91506145fa8261546e565b602082019050919050565b6000614612601983614ed3565b915061461d82615497565b602082019050919050565b6000614635602c83614ed3565b9150614640826154c0565b604082019050919050565b6000614658603883614ed3565b91506146638261550f565b604082019050919050565b600061467b602a83614ed3565b91506146868261555e565b604082019050919050565b600061469e602983614ed3565b91506146a9826155ad565b604082019050919050565b60006146c1600f83614ed3565b91506146cc826155fc565b602082019050919050565b60006146e4601683614ed3565b91506146ef82615625565b602082019050919050565b6000614707602483614ed3565b91506147128261564e565b604082019050919050565b600061472a602083614ed3565b91506147358261569d565b602082019050919050565b600061474d601483614ed3565b9150614758826156c6565b602082019050919050565b6000614770602c83614ed3565b915061477b826156ef565b604082019050919050565b6000614793602083614ed3565b915061479e8261573e565b602082019050919050565b60006147b6601683614ed3565b91506147c182615767565b602082019050919050565b60006147d9602983614ed3565b91506147e482615790565b604082019050919050565b60006147fc602f83614ed3565b9150614807826157df565b604082019050919050565b600061481f602183614ed3565b915061482a8261582e565b604082019050919050565b6000614842600083614ec8565b915061484d8261587d565b600082019050919050565b6000614865601283614ed3565b915061487082615880565b602082019050919050565b6000614888603183614ed3565b9150614893826158a9565b604082019050919050565b60006148ab602c83614ed3565b91506148b6826158f8565b604082019050919050565b60006148ce601783614ed3565b91506148d982615947565b602082019050919050565b60006148f1601b83614ed3565b91506148fc82615970565b602082019050919050565b6149108161506e565b82525050565b61491f8161506e565b82525050565b60006149318286614460565b915061493d8285614460565b91506149498284614491565b9150819050949350505050565b600061496182614835565b9150819050919050565b60006020820190506149806000830184614372565b92915050565b600060808201905061499b6000830187614372565b6149a86020830186614372565b6149b56040830185614916565b81810360608301526149c781846143ee565b905095945050505050565b600060208201905081810360008301526149ec8184614381565b905092915050565b6000602082019050614a0960008301846143df565b92915050565b60006020820190508181036000830152614a298184614427565b905092915050565b60006020820190508181036000830152614a4a81614510565b9050919050565b60006020820190508181036000830152614a6a81614533565b9050919050565b60006020820190508181036000830152614a8a81614556565b9050919050565b60006020820190508181036000830152614aaa81614579565b9050919050565b60006020820190508181036000830152614aca8161459c565b9050919050565b60006020820190508181036000830152614aea816145bf565b9050919050565b60006020820190508181036000830152614b0a816145e2565b9050919050565b60006020820190508181036000830152614b2a81614605565b9050919050565b60006020820190508181036000830152614b4a81614628565b9050919050565b60006020820190508181036000830152614b6a8161464b565b9050919050565b60006020820190508181036000830152614b8a8161466e565b9050919050565b60006020820190508181036000830152614baa81614691565b9050919050565b60006020820190508181036000830152614bca816146b4565b9050919050565b60006020820190508181036000830152614bea816146d7565b9050919050565b60006020820190508181036000830152614c0a816146fa565b9050919050565b60006020820190508181036000830152614c2a8161471d565b9050919050565b60006020820190508181036000830152614c4a81614740565b9050919050565b60006020820190508181036000830152614c6a81614763565b9050919050565b60006020820190508181036000830152614c8a81614786565b9050919050565b60006020820190508181036000830152614caa816147a9565b9050919050565b60006020820190508181036000830152614cca816147cc565b9050919050565b60006020820190508181036000830152614cea816147ef565b9050919050565b60006020820190508181036000830152614d0a81614812565b9050919050565b60006020820190508181036000830152614d2a81614858565b9050919050565b60006020820190508181036000830152614d4a8161487b565b9050919050565b60006020820190508181036000830152614d6a8161489e565b9050919050565b60006020820190508181036000830152614d8a816148c1565b9050919050565b60006020820190508181036000830152614daa816148e4565b9050919050565b6000602082019050614dc66000830184614916565b92915050565b6000614dd6614de7565b9050614de282826150ec565b919050565b6000604051905090565b600067ffffffffffffffff821115614e0c57614e0b615282565b5b614e15826152cf565b9050602081019050919050565b600067ffffffffffffffff821115614e3d57614e3c615282565b5b614e46826152cf565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614efa8261506e565b9150614f058361506e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f3a57614f39615197565b5b828201905092915050565b6000614f508261506e565b9150614f5b8361506e565b925082614f6b57614f6a6151c6565b5b828204905092915050565b6000614f818261506e565b9150614f8c8361506e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fc557614fc4615197565b5b828202905092915050565b6000614fdb8261506e565b9150614fe68361506e565b925082821015614ff957614ff8615197565b5b828203905092915050565b600061500f8261504e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156150a557808201518184015260208101905061508a565b838111156150b4576000848401525b50505050565b600060028204905060018216806150d257607f821691505b602082108114156150e6576150e56151f5565b5b50919050565b6150f5826152cf565b810181811067ffffffffffffffff8211171561511457615113615282565b5b80604052505050565b60006151288261506e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561515b5761515a615197565b5b600182019050919050565b60006151718261506e565b915061517c8361506e565b92508261518c5761518b6151c6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4e465420616c7265616479206d696e7465640000000000000000000000000000600082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f696e76616c696420616464726573730000000000000000000000000000000000600082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f6f6e6c79206f776e65722063616e20636c61696d000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6159a281615004565b81146159ad57600080fd5b50565b6159b981615016565b81146159c457600080fd5b50565b6159d081615022565b81146159db57600080fd5b50565b6159e78161506e565b81146159f257600080fd5b5056fea264697066735822122070b132ffa803c30f9399d3d0931b32f911b909b591ecf89e8a26ae4fbaf57f8a64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000e54686520416c706861425954457300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054259544573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f697066732e696f2f697066732f2f62616679626569636e7479786c686977706a6e6c76617a6e33627365633668367236697a6c6d75787464343667776a7a6d6b346e347165356d6e65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f697066732e696f2f697066732f6261666b72656962766532687a75796f6e36646e7668616d7778367875336b6d326673677369746736337778707a6235737a62673432716b70346500000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061031a5760003560e01c80636c0360eb116101ab578063b88d4fde116100f7578063da3ef23f11610095578063e985e9c51161006f578063e985e9c514610bcc578063edec5f2714610c09578063f2c4ce1e14610c32578063f2fde38b14610c5b5761031a565b8063da3ef23f14610b3b578063dbe7e3bd14610b64578063e7b99ec714610ba15761031a565b8063c87b56dd116100d1578063c87b56dd14610a81578063d0eb26b014610abe578063d49479eb14610ae7578063d5abeb0114610b105761031a565b8063b88d4fde14610a02578063ba7d2c7614610a2b578063c668286214610a565761031a565b80638f44652e11610164578063a0712d681161013e578063a0712d681461097d578063a22cb46514610999578063a475b5dd146109c2578063a6f9dae1146109d95761031a565b80638f44652e146108fe57806395d89b41146109275780639c70b512146109525761031a565b80636c0360eb146107ec57806370a0823114610817578063715018a61461085457806372dd529b1461086b5780637dc0bf3f146108965780638da5cb5b146108d35761031a565b8063379607f51161026a57806344a0d68a1161022357806351830227116101fd578063518302271461073057806355f804b31461075b5780635c975abb146107845780636352211e146107af5761031a565b806344a0d68a146106a15780634a4c560d146106ca5780634f6ccce7146106f35761031a565b8063379607f5146105a25780633af32abf146105cb5780633c952764146106085780633ccfd60b1461063157806342842e0e1461063b578063438b6300146106645761031a565b8063095ea7b3116102d757806318cae269116102b157806318cae269146104d4578063239c70ae1461051157806323b872dd1461053c5780632f745c59146105655761031a565b8063095ea7b31461045557806313faede61461047e57806318160ddd146104a95761031a565b806301ffc9a71461031f57806302329a291461035c57806306c933d81461038557806306fdde03146103c2578063081812fc146103ed578063081c8c441461042a575b600080fd5b34801561032b57600080fd5b506103466004803603810190610341919061428a565b610c84565b60405161035391906149f4565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e919061425d565b610cfe565b005b34801561039157600080fd5b506103ac60048036038101906103a79190613fed565b610d97565b6040516103b991906149f4565b60405180910390f35b3480156103ce57600080fd5b506103d7610db7565b6040516103e49190614a0f565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f919061432d565b610e49565b604051610421919061496b565b60405180910390f35b34801561043657600080fd5b5061043f610ece565b60405161044c9190614a0f565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190614170565b610f5c565b005b34801561048a57600080fd5b50610493611074565b6040516104a09190614db1565b60405180910390f35b3480156104b557600080fd5b506104be61107a565b6040516104cb9190614db1565b60405180910390f35b3480156104e057600080fd5b506104fb60048036038101906104f69190613fed565b611087565b6040516105089190614db1565b60405180910390f35b34801561051d57600080fd5b5061052661109f565b6040516105339190614db1565b60405180910390f35b34801561054857600080fd5b50610563600480360381019061055e919061405a565b6110a5565b005b34801561057157600080fd5b5061058c60048036038101906105879190614170565b611105565b6040516105999190614db1565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c4919061432d565b6111aa565b005b3480156105d757600080fd5b506105f260048036038101906105ed9190613fed565b61129d565b6040516105ff91906149f4565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a919061425d565b6112f3565b005b61063961138c565b005b34801561064757600080fd5b50610662600480360381019061065d919061405a565b611488565b005b34801561067057600080fd5b5061068b60048036038101906106869190613fed565b6114a8565b60405161069891906149d2565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c3919061432d565b611556565b005b3480156106d657600080fd5b506106f160048036038101906106ec9190613fed565b6115dc565b005b3480156106ff57600080fd5b5061071a6004803603810190610715919061432d565b6116b3565b6040516107279190614db1565b60405180910390f35b34801561073c57600080fd5b50610745611724565b60405161075291906149f4565b60405180910390f35b34801561076757600080fd5b50610782600480360381019061077d91906142e4565b611737565b005b34801561079057600080fd5b506107996117cd565b6040516107a691906149f4565b60405180910390f35b3480156107bb57600080fd5b506107d660048036038101906107d1919061432d565b6117e0565b6040516107e3919061496b565b60405180910390f35b3480156107f857600080fd5b50610801611892565b60405161080e9190614a0f565b60405180910390f35b34801561082357600080fd5b5061083e60048036038101906108399190613fed565b611920565b60405161084b9190614db1565b60405180910390f35b34801561086057600080fd5b506108696119d8565b005b34801561087757600080fd5b50610880611a60565b60405161088d9190614db1565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b8919061432d565b611a66565b6040516108ca91906149f4565b60405180910390f35b3480156108df57600080fd5b506108e8611a86565b6040516108f5919061496b565b60405180910390f35b34801561090a57600080fd5b50610925600480360381019061092091906141fd565b611ab0565b005b34801561093357600080fd5b5061093c611dae565b6040516109499190614a0f565b60405180910390f35b34801561095e57600080fd5b50610967611e40565b60405161097491906149f4565b60405180910390f35b6109976004803603810190610992919061432d565b611e53565b005b3480156109a557600080fd5b506109c060048036038101906109bb9190614130565b61227b565b005b3480156109ce57600080fd5b506109d76123fc565b005b3480156109e557600080fd5b50610a0060048036038101906109fb9190613fed565b612495565b005b348015610a0e57600080fd5b50610a296004803603810190610a2491906140ad565b61251d565b005b348015610a3757600080fd5b50610a4061257f565b604051610a4d9190614db1565b60405180910390f35b348015610a6257600080fd5b50610a6b612585565b604051610a789190614a0f565b60405180910390f35b348015610a8d57600080fd5b50610aa86004803603810190610aa3919061432d565b612613565b604051610ab59190614a0f565b60405180910390f35b348015610aca57600080fd5b50610ae56004803603810190610ae0919061432d565b61276c565b005b348015610af357600080fd5b50610b0e6004803603810190610b09919061432d565b6127f2565b005b348015610b1c57600080fd5b50610b25612878565b604051610b329190614db1565b60405180910390f35b348015610b4757600080fd5b50610b626004803603810190610b5d91906142e4565b61287e565b005b348015610b7057600080fd5b50610b8b6004803603810190610b86919061432d565b612914565b604051610b9891906149f4565b60405180910390f35b348015610bad57600080fd5b50610bb6612934565b604051610bc39190614db1565b60405180910390f35b348015610bd857600080fd5b50610bf36004803603810190610bee919061401a565b61293a565b604051610c0091906149f4565b60405180910390f35b348015610c1557600080fd5b50610c306004803603810190610c2b91906141b0565b6129ce565b005b348015610c3e57600080fd5b50610c596004803603810190610c5491906142e4565b612aef565b005b348015610c6757600080fd5b50610c826004803603810190610c7d9190613fed565b612b85565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cf75750610cf682612c7d565b5b9050919050565b610d06612d5f565b73ffffffffffffffffffffffffffffffffffffffff16610d24611a86565b73ffffffffffffffffffffffffffffffffffffffff1614610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7190614c71565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b60146020528060005260406000206000915054906101000a900460ff1681565b606060008054610dc6906150ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610df2906150ba565b8015610e3f5780601f10610e1457610100808354040283529160200191610e3f565b820191906000526020600020905b815481529060010190602001808311610e2257829003601f168201915b5050505050905090565b6000610e5482612d67565b610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90614c51565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610edb906150ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610f07906150ba565b8015610f545780601f10610f2957610100808354040283529160200191610f54565b820191906000526020600020905b815481529060010190602001808311610f3757829003601f168201915b505050505081565b6000610f67826117e0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcf90614cf1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ff7612d5f565b73ffffffffffffffffffffffffffffffffffffffff161480611026575061102581611020612d5f565b61293a565b5b611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c90614b51565b60405180910390fd5b61106f8383612dd3565b505050565b600f5481565b6000600880549050905090565b60156020528060005260406000206000915090505481565b60115481565b6110b66110b0612d5f565b82612e8c565b6110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ec90614d31565b60405180910390fd5b611100838383612f6a565b505050565b600061111083611920565b8210611151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114890614a31565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b3373ffffffffffffffffffffffffffffffffffffffff166111ca826117e0565b73ffffffffffffffffffffffffffffffffffffffff1614611220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121790614c31565b60405180910390fd5b60016016600083815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f6aa3eac93d079e5e100b1029be716caa33586c96aa4baac390669fb5c2a21212826040516112929190614db1565b60405180910390a250565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6112fb612d5f565b73ffffffffffffffffffffffffffffffffffffffff16611319611a86565b73ffffffffffffffffffffffffffffffffffffffff161461136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136690614c71565b60405180910390fd5b80601360026101000a81548160ff02191690831515021790555050565b611394612d5f565b73ffffffffffffffffffffffffffffffffffffffff166113b2611a86565b73ffffffffffffffffffffffffffffffffffffffff1614611408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ff90614c71565b60405180910390fd5b6000611412611a86565b73ffffffffffffffffffffffffffffffffffffffff164760405161143590614956565b60006040518083038185875af1925050503d8060008114611472576040519150601f19603f3d011682016040523d82523d6000602084013e611477565b606091505b505090508061148557600080fd5b50565b6114a38383836040518060200160405280600081525061251d565b505050565b606060006114b583611920565b905060008167ffffffffffffffff8111156114d3576114d2615282565b5b6040519080825280602002602001820160405280156115015781602001602082028036833780820191505090505b50905060005b8281101561154b576115198582611105565b82828151811061152c5761152b615253565b5b60200260200101818152505080806115439061511d565b915050611507565b508092505050919050565b61155e612d5f565b73ffffffffffffffffffffffffffffffffffffffff1661157c611a86565b73ffffffffffffffffffffffffffffffffffffffff16146115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c990614c71565b60405180910390fd5b80600f8190555050565b6115e4612d5f565b73ffffffffffffffffffffffffffffffffffffffff16611602611a86565b73ffffffffffffffffffffffffffffffffffffffff1614611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164f90614c71565b60405180910390fd5b6001601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006116bd61107a565b82106116fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f590614d51565b60405180910390fd5b6008828154811061171257611711615253565b5b90600052602060002001549050919050565b601360019054906101000a900460ff1681565b61173f612d5f565b73ffffffffffffffffffffffffffffffffffffffff1661175d611a86565b73ffffffffffffffffffffffffffffffffffffffff16146117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117aa90614c71565b60405180910390fd5b80600b90805190602001906117c9929190613d55565b5050565b601360009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188090614b91565b60405180910390fd5b80915050919050565b600b805461189f906150ba565b80601f01602080910402602001604051908101604052809291908181526020018280546118cb906150ba565b80156119185780601f106118ed57610100808354040283529160200191611918565b820191906000526020600020905b8154815290600101906020018083116118fb57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198890614b71565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6119e0612d5f565b73ffffffffffffffffffffffffffffffffffffffff166119fe611a86565b73ffffffffffffffffffffffffffffffffffffffff1614611a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4b90614c71565b60405180910390fd5b611a5e60006131c6565b565b60185481565b60176020528060005260406000206000915054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ab8612d5f565b73ffffffffffffffffffffffffffffffffffffffff16611ad6611a86565b73ffffffffffffffffffffffffffffffffffffffff1614611b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2390614c71565b60405180910390fd5b601360009054906101000a900460ff1615611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7390614c91565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be390614bb1565b60405180910390fd5b60005b83839050811015611da8576000611c0461107a565b9050601054600182611c169190614eef565b1115611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e90614bd1565b60405180910390fd5b6000151560176000878786818110611c7257611c71615253565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16151514611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce90614af1565b60405180910390fd5b601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611d279061511d565b9190505550600160176000878786818110611d4557611d44615253565b5b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550611d9483868685818110611d8857611d87615253565b5b9050602002013561328c565b508080611da09061511d565b915050611bef565b50505050565b606060018054611dbd906150ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611de9906150ba565b8015611e365780601f10611e0b57610100808354040283529160200191611e36565b820191906000526020600020905b815481529060010190602001808311611e1957829003601f168201915b5050505050905090565b601360029054906101000a900460ff1681565b601360009054906101000a900460ff1615611ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9a90614c91565b60405180910390fd5b6000611ead61107a565b905060008211611ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee990614d91565b60405180910390fd5b601154821115611f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e90614bf1565b60405180910390fd5b6010548282611f469190614eef565b1115611f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7e90614bd1565b60405180910390fd5b611f8f611a86565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121615760011515601360029054906101000a900460ff161515141561210f57611fe63361129d565b612025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201c90614d71565b60405180910390fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060125483826120789190614eef565b11156120b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b090614ab1565b60405180910390fd5b82600e546120c79190614f76565b341015612109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210090614d11565b60405180910390fd5b50612160565b81600f5461211d9190614f76565b34101561215f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215690614d11565b60405180910390fd5b5b5b6000600190505b82811161227657601860008154809291906121829061511d565b91905055505b6001151560176000601854815260200190815260200160002060009054906101000a900460ff16151514156121d457601860008154809291906121ca9061511d565b9190505550612188565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906122249061511d565b9190505550600160176000601854815260200190815260200160002060006101000a81548160ff0219169083151502179055506122633360185461328c565b808061226e9061511d565b915050612168565b505050565b612283612d5f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e890614b11565b60405180910390fd5b80600560006122fe612d5f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166123ab612d5f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123f091906149f4565b60405180910390a35050565b612404612d5f565b73ffffffffffffffffffffffffffffffffffffffff16612422611a86565b73ffffffffffffffffffffffffffffffffffffffff1614612478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246f90614c71565b60405180910390fd5b6001601360016101000a81548160ff021916908315150217905550565b61249d612d5f565b73ffffffffffffffffffffffffffffffffffffffff166124bb611a86565b73ffffffffffffffffffffffffffffffffffffffff1614612511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250890614c71565b60405180910390fd5b61251a81612b85565b50565b61252e612528612d5f565b83612e8c565b61256d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256490614d31565b60405180910390fd5b612579848484846132aa565b50505050565b60125481565b600c8054612592906150ba565b80601f01602080910402602001604051908101604052809291908181526020018280546125be906150ba565b801561260b5780601f106125e05761010080835404028352916020019161260b565b820191906000526020600020905b8154815290600101906020018083116125ee57829003601f168201915b505050505081565b606061261e82612d67565b61265d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265490614cd1565b60405180910390fd5b60001515601360019054906101000a900460ff161515141561270b57600d8054612686906150ba565b80601f01602080910402602001604051908101604052809291908181526020018280546126b2906150ba565b80156126ff5780601f106126d4576101008083540402835291602001916126ff565b820191906000526020600020905b8154815290600101906020018083116126e257829003601f168201915b50505050509050612767565b6000612715613306565b905060008151116127355760405180602001604052806000815250612763565b8061273f84613398565b600c60405160200161275393929190614925565b6040516020818303038152906040525b9150505b919050565b612774612d5f565b73ffffffffffffffffffffffffffffffffffffffff16612792611a86565b73ffffffffffffffffffffffffffffffffffffffff16146127e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127df90614c71565b60405180910390fd5b8060128190555050565b6127fa612d5f565b73ffffffffffffffffffffffffffffffffffffffff16612818611a86565b73ffffffffffffffffffffffffffffffffffffffff161461286e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286590614c71565b60405180910390fd5b80600e8190555050565b60105481565b612886612d5f565b73ffffffffffffffffffffffffffffffffffffffff166128a4611a86565b73ffffffffffffffffffffffffffffffffffffffff16146128fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f190614c71565b60405180910390fd5b80600c9080519060200190612910929190613d55565b5050565b60166020528060005260406000206000915054906101000a900460ff1681565b600e5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6129d6612d5f565b73ffffffffffffffffffffffffffffffffffffffff166129f4611a86565b73ffffffffffffffffffffffffffffffffffffffff1614612a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4190614c71565b60405180910390fd5b60005b82829050811015612aea57600160146000858585818110612a7157612a70615253565b5b9050602002016020810190612a869190613fed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612ae29061511d565b915050612a4d565b505050565b612af7612d5f565b73ffffffffffffffffffffffffffffffffffffffff16612b15611a86565b73ffffffffffffffffffffffffffffffffffffffff1614612b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6290614c71565b60405180910390fd5b80600d9080519060200190612b81929190613d55565b5050565b612b8d612d5f565b73ffffffffffffffffffffffffffffffffffffffff16612bab611a86565b73ffffffffffffffffffffffffffffffffffffffff1614612c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf890614c71565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6890614a71565b60405180910390fd5b612c7a816131c6565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d4857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d585750612d57826134f9565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e46836117e0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e9782612d67565b612ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecd90614b31565b60405180910390fd5b6000612ee1836117e0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f5057508373ffffffffffffffffffffffffffffffffffffffff16612f3884610e49565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f615750612f60818561293a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f8a826117e0565b73ffffffffffffffffffffffffffffffffffffffff1614612fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd790614cb1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304790614ad1565b60405180910390fd5b61305b838383613563565b613066600082612dd3565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130b69190614fd0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461310d9190614eef565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6132a6828260405180602001604052806000815250613677565b5050565b6132b5848484612f6a565b6132c1848484846136d2565b613300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f790614a51565b60405180910390fd5b50505050565b6060600b8054613315906150ba565b80601f0160208091040260200160405190810160405280929190818152602001828054613341906150ba565b801561338e5780601f106133635761010080835404028352916020019161338e565b820191906000526020600020905b81548152906001019060200180831161337157829003601f168201915b5050505050905090565b606060008214156133e0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134f4565b600082905060005b600082146134125780806133fb9061511d565b915050600a8261340b9190614f45565b91506133e8565b60008167ffffffffffffffff81111561342e5761342d615282565b5b6040519080825280601f01601f1916602001820160405280156134605781602001600182028036833780820191505090505b5090505b600085146134ed576001826134799190614fd0565b9150600a856134889190615166565b60306134949190614eef565b60f81b8183815181106134aa576134a9615253565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134e69190614f45565b9450613464565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61356e838383613869565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135b1576135ac8161386e565b6135f0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135ef576135ee83826138b7565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136335761362e81613a24565b613672565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613671576136708282613af5565b5b5b505050565b6136818383613b74565b61368e60008484846136d2565b6136cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c490614a51565b60405180910390fd5b505050565b60006136f38473ffffffffffffffffffffffffffffffffffffffff16613d42565b1561385c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261371c612d5f565b8786866040518563ffffffff1660e01b815260040161373e9493929190614986565b602060405180830381600087803b15801561375857600080fd5b505af192505050801561378957506040513d601f19601f8201168201806040525081019061378691906142b7565b60015b61380c573d80600081146137b9576040519150601f19603f3d011682016040523d82523d6000602084013e6137be565b606091505b50600081511415613804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137fb90614a51565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613861565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016138c484611920565b6138ce9190614fd0565b90506000600760008481526020019081526020016000205490508181146139b3576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613a389190614fd0565b9050600060096000848152602001908152602001600020549050600060088381548110613a6857613a67615253565b5b906000526020600020015490508060088381548110613a8a57613a89615253565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613ad957613ad8615224565b5b6001900381819060005260206000200160009055905550505050565b6000613b0083611920565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bdb90614c11565b60405180910390fd5b613bed81612d67565b15613c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c2490614a91565b60405180910390fd5b613c3960008383613563565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c899190614eef565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613d61906150ba565b90600052602060002090601f016020900481019282613d835760008555613dca565b82601f10613d9c57805160ff1916838001178555613dca565b82800160010185558215613dca579182015b82811115613dc9578251825591602001919060010190613dae565b5b509050613dd79190613ddb565b5090565b5b80821115613df4576000816000905550600101613ddc565b5090565b6000613e0b613e0684614df1565b614dcc565b905082815260208101848484011115613e2757613e266152c0565b5b613e32848285615078565b509392505050565b6000613e4d613e4884614e22565b614dcc565b905082815260208101848484011115613e6957613e686152c0565b5b613e74848285615078565b509392505050565b600081359050613e8b81615999565b92915050565b60008083601f840112613ea757613ea66152b6565b5b8235905067ffffffffffffffff811115613ec457613ec36152b1565b5b602083019150836020820283011115613ee057613edf6152bb565b5b9250929050565b60008083601f840112613efd57613efc6152b6565b5b8235905067ffffffffffffffff811115613f1a57613f196152b1565b5b602083019150836020820283011115613f3657613f356152bb565b5b9250929050565b600081359050613f4c816159b0565b92915050565b600081359050613f61816159c7565b92915050565b600081519050613f76816159c7565b92915050565b600082601f830112613f9157613f906152b6565b5b8135613fa1848260208601613df8565b91505092915050565b600082601f830112613fbf57613fbe6152b6565b5b8135613fcf848260208601613e3a565b91505092915050565b600081359050613fe7816159de565b92915050565b600060208284031215614003576140026152ca565b5b600061401184828501613e7c565b91505092915050565b60008060408385031215614031576140306152ca565b5b600061403f85828601613e7c565b925050602061405085828601613e7c565b9150509250929050565b600080600060608486031215614073576140726152ca565b5b600061408186828701613e7c565b935050602061409286828701613e7c565b92505060406140a386828701613fd8565b9150509250925092565b600080600080608085870312156140c7576140c66152ca565b5b60006140d587828801613e7c565b94505060206140e687828801613e7c565b93505060406140f787828801613fd8565b925050606085013567ffffffffffffffff811115614118576141176152c5565b5b61412487828801613f7c565b91505092959194509250565b60008060408385031215614147576141466152ca565b5b600061415585828601613e7c565b925050602061416685828601613f3d565b9150509250929050565b60008060408385031215614187576141866152ca565b5b600061419585828601613e7c565b92505060206141a685828601613fd8565b9150509250929050565b600080602083850312156141c7576141c66152ca565b5b600083013567ffffffffffffffff8111156141e5576141e46152c5565b5b6141f185828601613e91565b92509250509250929050565b600080600060408486031215614216576142156152ca565b5b600084013567ffffffffffffffff811115614234576142336152c5565b5b61424086828701613ee7565b9350935050602061425386828701613e7c565b9150509250925092565b600060208284031215614273576142726152ca565b5b600061428184828501613f3d565b91505092915050565b6000602082840312156142a05761429f6152ca565b5b60006142ae84828501613f52565b91505092915050565b6000602082840312156142cd576142cc6152ca565b5b60006142db84828501613f67565b91505092915050565b6000602082840312156142fa576142f96152ca565b5b600082013567ffffffffffffffff811115614318576143176152c5565b5b61432484828501613faa565b91505092915050565b600060208284031215614343576143426152ca565b5b600061435184828501613fd8565b91505092915050565b60006143668383614907565b60208301905092915050565b61437b81615004565b82525050565b600061438c82614e78565b6143968185614ea6565b93506143a183614e53565b8060005b838110156143d25781516143b9888261435a565b97506143c483614e99565b9250506001810190506143a5565b5085935050505092915050565b6143e881615016565b82525050565b60006143f982614e83565b6144038185614eb7565b9350614413818560208601615087565b61441c816152cf565b840191505092915050565b600061443282614e8e565b61443c8185614ed3565b935061444c818560208601615087565b614455816152cf565b840191505092915050565b600061446b82614e8e565b6144758185614ee4565b9350614485818560208601615087565b80840191505092915050565b6000815461449e816150ba565b6144a88186614ee4565b945060018216600081146144c357600181146144d457614507565b60ff19831686528186019350614507565b6144dd85614e63565b60005b838110156144ff578154818901526001820191506020810190506144e0565b838801955050505b50505092915050565b600061451d602b83614ed3565b9150614528826152e0565b604082019050919050565b6000614540603283614ed3565b915061454b8261532f565b604082019050919050565b6000614563602683614ed3565b915061456e8261537e565b604082019050919050565b6000614586601c83614ed3565b9150614591826153cd565b602082019050919050565b60006145a9601c83614ed3565b91506145b4826153f6565b602082019050919050565b60006145cc602483614ed3565b91506145d78261541f565b604082019050919050565b60006145ef601283614ed3565b91506145fa8261546e565b602082019050919050565b6000614612601983614ed3565b915061461d82615497565b602082019050919050565b6000614635602c83614ed3565b9150614640826154c0565b604082019050919050565b6000614658603883614ed3565b91506146638261550f565b604082019050919050565b600061467b602a83614ed3565b91506146868261555e565b604082019050919050565b600061469e602983614ed3565b91506146a9826155ad565b604082019050919050565b60006146c1600f83614ed3565b91506146cc826155fc565b602082019050919050565b60006146e4601683614ed3565b91506146ef82615625565b602082019050919050565b6000614707602483614ed3565b91506147128261564e565b604082019050919050565b600061472a602083614ed3565b91506147358261569d565b602082019050919050565b600061474d601483614ed3565b9150614758826156c6565b602082019050919050565b6000614770602c83614ed3565b915061477b826156ef565b604082019050919050565b6000614793602083614ed3565b915061479e8261573e565b602082019050919050565b60006147b6601683614ed3565b91506147c182615767565b602082019050919050565b60006147d9602983614ed3565b91506147e482615790565b604082019050919050565b60006147fc602f83614ed3565b9150614807826157df565b604082019050919050565b600061481f602183614ed3565b915061482a8261582e565b604082019050919050565b6000614842600083614ec8565b915061484d8261587d565b600082019050919050565b6000614865601283614ed3565b915061487082615880565b602082019050919050565b6000614888603183614ed3565b9150614893826158a9565b604082019050919050565b60006148ab602c83614ed3565b91506148b6826158f8565b604082019050919050565b60006148ce601783614ed3565b91506148d982615947565b602082019050919050565b60006148f1601b83614ed3565b91506148fc82615970565b602082019050919050565b6149108161506e565b82525050565b61491f8161506e565b82525050565b60006149318286614460565b915061493d8285614460565b91506149498284614491565b9150819050949350505050565b600061496182614835565b9150819050919050565b60006020820190506149806000830184614372565b92915050565b600060808201905061499b6000830187614372565b6149a86020830186614372565b6149b56040830185614916565b81810360608301526149c781846143ee565b905095945050505050565b600060208201905081810360008301526149ec8184614381565b905092915050565b6000602082019050614a0960008301846143df565b92915050565b60006020820190508181036000830152614a298184614427565b905092915050565b60006020820190508181036000830152614a4a81614510565b9050919050565b60006020820190508181036000830152614a6a81614533565b9050919050565b60006020820190508181036000830152614a8a81614556565b9050919050565b60006020820190508181036000830152614aaa81614579565b9050919050565b60006020820190508181036000830152614aca8161459c565b9050919050565b60006020820190508181036000830152614aea816145bf565b9050919050565b60006020820190508181036000830152614b0a816145e2565b9050919050565b60006020820190508181036000830152614b2a81614605565b9050919050565b60006020820190508181036000830152614b4a81614628565b9050919050565b60006020820190508181036000830152614b6a8161464b565b9050919050565b60006020820190508181036000830152614b8a8161466e565b9050919050565b60006020820190508181036000830152614baa81614691565b9050919050565b60006020820190508181036000830152614bca816146b4565b9050919050565b60006020820190508181036000830152614bea816146d7565b9050919050565b60006020820190508181036000830152614c0a816146fa565b9050919050565b60006020820190508181036000830152614c2a8161471d565b9050919050565b60006020820190508181036000830152614c4a81614740565b9050919050565b60006020820190508181036000830152614c6a81614763565b9050919050565b60006020820190508181036000830152614c8a81614786565b9050919050565b60006020820190508181036000830152614caa816147a9565b9050919050565b60006020820190508181036000830152614cca816147cc565b9050919050565b60006020820190508181036000830152614cea816147ef565b9050919050565b60006020820190508181036000830152614d0a81614812565b9050919050565b60006020820190508181036000830152614d2a81614858565b9050919050565b60006020820190508181036000830152614d4a8161487b565b9050919050565b60006020820190508181036000830152614d6a8161489e565b9050919050565b60006020820190508181036000830152614d8a816148c1565b9050919050565b60006020820190508181036000830152614daa816148e4565b9050919050565b6000602082019050614dc66000830184614916565b92915050565b6000614dd6614de7565b9050614de282826150ec565b919050565b6000604051905090565b600067ffffffffffffffff821115614e0c57614e0b615282565b5b614e15826152cf565b9050602081019050919050565b600067ffffffffffffffff821115614e3d57614e3c615282565b5b614e46826152cf565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614efa8261506e565b9150614f058361506e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f3a57614f39615197565b5b828201905092915050565b6000614f508261506e565b9150614f5b8361506e565b925082614f6b57614f6a6151c6565b5b828204905092915050565b6000614f818261506e565b9150614f8c8361506e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fc557614fc4615197565b5b828202905092915050565b6000614fdb8261506e565b9150614fe68361506e565b925082821015614ff957614ff8615197565b5b828203905092915050565b600061500f8261504e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156150a557808201518184015260208101905061508a565b838111156150b4576000848401525b50505050565b600060028204905060018216806150d257607f821691505b602082108114156150e6576150e56151f5565b5b50919050565b6150f5826152cf565b810181811067ffffffffffffffff8211171561511457615113615282565b5b80604052505050565b60006151288261506e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561515b5761515a615197565b5b600182019050919050565b60006151718261506e565b915061517c8361506e565b92508261518c5761518b6151c6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4e465420616c7265616479206d696e7465640000000000000000000000000000600082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f696e76616c696420616464726573730000000000000000000000000000000000600082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f6f6e6c79206f776e65722063616e20636c61696d000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6159a281615004565b81146159ad57600080fd5b50565b6159b981615016565b81146159c457600080fd5b50565b6159d081615022565b81146159db57600080fd5b50565b6159e78161506e565b81146159f257600080fd5b5056fea264697066735822122070b132ffa803c30f9399d3d0931b32f911b909b591ecf89e8a26ae4fbaf57f8a64736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000e54686520416c706861425954457300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054259544573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f697066732e696f2f697066732f2f62616679626569636e7479786c686977706a6e6c76617a6e33627365633668367236697a6c6d75787464343667776a7a6d6b346e347165356d6e65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f697066732e696f2f697066732f6261666b72656962766532687a75796f6e36646e7668616d7778367875336b6d326673677369746736337778707a6235737a62673432716b70346500000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): The AlphaBYTEs
Arg [1] : _symbol (string): BYTEs
Arg [2] : _initBaseURI (string): https://ipfs.io/ipfs//bafybeicntyxlhiwpjnlvazn3bsec6h6r6izlmuxtd46gwjzmk4n4qe5mne
Arg [3] : _initNotRevealedUri (string): https://ipfs.io/ipfs/bafkreibve2hzuyon6dnvhamwx6xu3km2fsgsitg63wxpzb5szbg42qkp4e

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [5] : 54686520416c7068614259544573000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 4259544573000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [9] : 68747470733a2f2f697066732e696f2f697066732f2f62616679626569636e74
Arg [10] : 79786c686977706a6e6c76617a6e33627365633668367236697a6c6d75787464
Arg [11] : 343667776a7a6d6b346e347165356d6e65000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [13] : 68747470733a2f2f697066732e696f2f697066732f6261666b72656962766532
Arg [14] : 687a75796f6e36646e7668616d7778367875336b6d3266736773697467363377
Arg [15] : 78707a6235737a62673432716b70346500000000000000000000000000000000


Deployed Bytecode Sourcemap

61378:5685:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53497:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66444:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61866:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41336:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42895:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61532:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42418:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61611:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54137:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61923:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61682:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43785:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53805:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64410:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64291:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66525:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66911:149;;;:::i;:::-;;44195:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64607:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65765:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66799:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54327:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61794:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66084:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61763:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41030:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61464:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40760:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30238:94;;;;;;;;;;;;;:::i;:::-;;62070:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62027:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29587:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63768:517;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41505:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61827:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62560:1200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43188:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65480:65;;;;;;;;;;;;;:::i;:::-;;65663:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44451:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61719:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61490:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64961:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65553:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65851:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61647:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66188:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61983:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61565:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43554:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66628:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66318:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30487:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53497:224;53599:4;53638:35;53623:50;;;:11;:50;;;;:90;;;;53677:36;53701:11;53677:23;:36::i;:::-;53623:90;53616:97;;53497:224;;;:::o;66444:73::-;29818:12;:10;:12::i;:::-;29807:23;;:7;:5;:7::i;:::-;:23;;;29799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66505:6:::1;66496;;:15;;;;;;;;;;;;;;;;;;66444:73:::0;:::o;61866:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;41336:100::-;41390:13;41423:5;41416:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41336:100;:::o;42895:221::-;42971:7;42999:16;43007:7;42999;:16::i;:::-;42991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43084:15;:24;43100:7;43084:24;;;;;;;;;;;;;;;;;;;;;43077:31;;42895:221;;;:::o;61532:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42418:411::-;42499:13;42515:23;42530:7;42515:14;:23::i;:::-;42499:39;;42563:5;42557:11;;:2;:11;;;;42549:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42657:5;42641:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;42666:37;42683:5;42690:12;:10;:12::i;:::-;42666:16;:37::i;:::-;42641:62;42619:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;42800:21;42809:2;42813:7;42800:8;:21::i;:::-;42488:341;42418:411;;:::o;61611:31::-;;;;:::o;54137:113::-;54198:7;54225:10;:17;;;;54218:24;;54137:113;:::o;61923:55::-;;;;;;;;;;;;;;;;;:::o;61682:32::-;;;;:::o;43785:339::-;43980:41;43999:12;:10;:12::i;:::-;44013:7;43980:18;:41::i;:::-;43972:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;44088:28;44098:4;44104:2;44108:7;44088:9;:28::i;:::-;43785:339;;;:::o;53805:256::-;53902:7;53938:23;53955:5;53938:16;:23::i;:::-;53930:5;:31;53922:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;54027:12;:19;54040:5;54027:19;;;;;;;;;;;;;;;:26;54047:5;54027:26;;;;;;;;;;;;54020:33;;53805:256;;;;:::o;64410:191::-;64486:10;64465:31;;:17;64473:8;64465:7;:17::i;:::-;:31;;;64457:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;64548:4;64528:7;:17;64536:8;64528:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;64584:10;64566:29;;;64574:8;64566:29;;;;;;:::i;:::-;;;;;;;;64410:191;:::o;64291:113::-;64350:4;64371:20;:27;64392:5;64371:27;;;;;;;;;;;;;;;;;;;;;;;;;64363:35;;64291:113;;;:::o;66525:95::-;29818:12;:10;:12::i;:::-;29807:23;;:7;:5;:7::i;:::-;:23;;;29799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66608:6:::1;66590:15;;:24;;;;;;;;;;;;;;;;;;66525:95:::0;:::o;66911:149::-;29818:12;:10;:12::i;:::-;29807:23;;:7;:5;:7::i;:::-;:23;;;29799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66966:7:::1;66987;:5;:7::i;:::-;66979:21;;67008;66979:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66965:69;;;67049:2;67041:11;;;::::0;::::1;;66956:104;66911:149::o:0;44195:185::-;44333:39;44350:4;44356:2;44360:7;44333:39;;;;;;;;;;;;:16;:39::i;:::-;44195:185;;;:::o;64607:348::-;64682:16;64710:23;64736:17;64746:6;64736:9;:17::i;:::-;64710:43;;64760:25;64802:15;64788:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64760:58;;64830:9;64825:103;64845:15;64841:1;:19;64825:103;;;64890:30;64910:6;64918:1;64890:19;:30::i;:::-;64876:8;64885:1;64876:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;64862:3;;;;;:::i;:::-;;;;64825:103;;;;64941:8;64934:15;;;;64607:348;;;:::o;65765:80::-;29818:12;:10;:12::i;:::-;29807:23;;:7;:5;:7::i;:::-;:23;;;29799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65831:8:::1;65824:4;:15;;;;65765:80:::0;:::o;66799:108::-;29818:12;:10;:12::i;:::-;29807:23;;:7;:5;:7::i;:::-;:23;;;29799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66893:4:::1;66865:20;:27;66886:5;66865:27;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;66799:108:::0;:::o;54327:233::-;54402:7;54438:30;:28;:30::i;:::-;54430:5;:38;54422:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;54535:10;54546:5;54535:17;;;;;;;;:::i;:::-;;;;;;;;;;54528:24;;54327:233;;;:::o;61794:28::-;;;;;;;;;;;;;:::o;66084:98::-;29818:12;:10;:12::i;:::-;29807:23;;:7;:5;:7::i;:::-;:23;;;29799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66165:11:::1;66155:7;:21;;;;;;;;;;;;:::i;:::-;;66084:98:::0;:::o;61763:26::-;;;;;;;;;;;;;:::o;41030:239::-;41102:7;41122:13;41138:7;:16;41146:7;41138:16;;;;;;;;;;;;;;;;;;;;;41122:32;;41190:1;41173:19;;:5;:19;;;;41165:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41256:5;41249:12;;;41030:239;;;:::o;61464:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40760:208::-;40832:7;40877:1;40860:19;;:5;:19;;;;40852:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;40944:9;:16;40954:5;40944:16;;;;;;;;;;;;;;;;40937:23;;40760:208;;;:::o;30238:94::-;29818:12;:10;:12::i;:::-;29807:23;;:7;:5;:7::i;:::-;:23;;;29799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30303:21:::1;30321:1;30303:9;:21::i;:::-;30238:94::o:0;62070:30::-;;;;:::o;62027:38::-;;;;;;;;;;;;;;;;;;;;;;:::o;29587:87::-;29633:7;29660:6;;;;;;;;;;;29653:13;;29587:87;:::o;63768:517::-;29818:12;:10;:12::i;:::-;29807:23;;:7;:5;:7::i;:::-;:23;;;29799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63858:6:::1;;;;;;;;;;;63857:7;63849:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63921:1;63906:17;;:3;:17;;;;63898:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;63954:6;63950:330;63965:9;;:16;;63963:1;:18;63950:330;;;63995:14;64012:13;:11;:13::i;:::-;63995:30;;64056:9;;64051:1;64042:6;:10;;;;:::i;:::-;:23;;64034:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;64135:5;64111:29;;:6;:20;64118:9;;64128:1;64118:12;;;;;;;:::i;:::-;;;;;;;;64111:20;;;;;;;;;;;;;;;;;;;;;:29;;;64103:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;64172:20;:25;64193:3;64172:25;;;;;;;;;;;;;;;;:27;;;;;;;;;:::i;:::-;;;;;;64231:4;64208:6;:20;64215:9;;64225:1;64215:12;;;;;;;:::i;:::-;;;;;;;;64208:20;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;64244:28;64254:3;64259:9;;64269:1;64259:12;;;;;;;:::i;:::-;;;;;;;;64244:9;:28::i;:::-;63986:294;63982:3;;;;;:::i;:::-;;;;63950:330;;;;63768:517:::0;;;:::o;41505:104::-;41561:13;41594:7;41587:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41505:104;:::o;61827:34::-;;;;;;;;;;;;;:::o;62560:1200::-;62626:6;;;;;;;;;;;62625:7;62617:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62666:14;62683:13;:11;:13::i;:::-;62666:30;;62725:1;62711:11;:15;62703:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;62788:13;;62773:11;:28;;62765:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;62881:9;;62866:11;62857:6;:20;;;;:::i;:::-;:33;;62849:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62944:7;:5;:7::i;:::-;62930:21;;:10;:21;;;62926:521;;62986:4;62967:23;;:15;;;;;;;;;;;:23;;;62964:476;;;63015:25;63029:10;63015:13;:25::i;:::-;63007:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;63083:24;63110:20;:32;63131:10;63110:32;;;;;;;;;;;;;;;;63083:59;;63199:18;;63184:11;63165:16;:30;;;;:::i;:::-;:52;;63157:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;63302:11;63286:13;;:27;;;;:::i;:::-;63273:9;:40;;63265:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;62992:356;62964:476;;;63394:11;63387:4;;:18;;;;:::i;:::-;63374:9;:31;;63366:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;62964:476;62926:521;63464:9;63476:1;63464:13;;63459:296;63484:11;63479:1;:16;63459:296;;63511:11;;:13;;;;;;;;;:::i;:::-;;;;;;63533:78;63564:4;63541:27;;:6;:19;63548:11;;63541:19;;;;;;;;;;;;;;;;;;;;;:27;;;63533:78;;;63588:11;;:13;;;;;;;;;:::i;:::-;;;;;;63533:78;;;63619:20;:32;63640:10;63619:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;63692:4;63670:6;:19;63677:11;;63670:19;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;63705:34;63715:10;63727:11;;63705:9;:34::i;:::-;63497:3;;;;;:::i;:::-;;;;63459:296;;;;62610:1150;62560:1200;:::o;43188:295::-;43303:12;:10;:12::i;:::-;43291:24;;:8;:24;;;;43283:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;43403:8;43358:18;:32;43377:12;:10;:12::i;:::-;43358:32;;;;;;;;;;;;;;;:42;43391:8;43358:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;43456:8;43427:48;;43442:12;:10;:12::i;:::-;43427:48;;;43466:8;43427:48;;;;;;:::i;:::-;;;;;;;;43188:295;;:::o;65480:65::-;29818:12;:10;:12::i;:::-;29807:23;;:7;:5;:7::i;:::-;:23;;;29799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65535:4:::1;65524:8;;:15;;;;;;;;;;;;;;;;;;65480:65::o:0;65663:96::-;29818:12;:10;:12::i;:::-;29807:23;;:7;:5;:7::i;:::-;:23;;;29799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65726:27:::1;65744:8;65726:17;:27::i;:::-;65663:96:::0;:::o;44451:328::-;44626:41;44645:12;:10;:12::i;:::-;44659:7;44626:18;:41::i;:::-;44618:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;44732:39;44746:4;44752:2;44756:7;44765:5;44732:13;:39::i;:::-;44451:328;;;;:::o;61719:39::-;;;;:::o;61490:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64961:497::-;65059:13;65100:16;65108:7;65100;:16::i;:::-;65084:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;65209:5;65197:17;;:8;;;;;;;;;;;:17;;;65194:62;;;65234:14;65227:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65194:62;65264:28;65295:10;:8;:10::i;:::-;65264:41;;65350:1;65325:14;65319:28;:32;:133;;;;;;;;;;;;;;;;;65387:14;65403:18;:7;:16;:18::i;:::-;65423:13;65370:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65319:133;65312:140;;;64961:497;;;;:::o;65553:104::-;29818:12;:10;:12::i;:::-;29807:23;;:7;:5;:7::i;:::-;:23;;;29799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65645:6:::1;65624:18;:27;;;;65553:104:::0;:::o;65851:98::-;29818:12;:10;:12::i;:::-;29807:23;;:7;:5;:7::i;:::-;:23;;;29799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65935:8:::1;65919:13;:24;;;;65851:98:::0;:::o;61647:30::-;;;;:::o;66188:122::-;29818:12;:10;:12::i;:::-;29807:23;;:7;:5;:7::i;:::-;:23;;;29799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66287:17:::1;66271:13;:33;;;;;;;;;;;;:::i;:::-;;66188:122:::0;:::o;61983:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;61565:40::-;;;;:::o;43554:164::-;43651:4;43675:18;:25;43694:5;43675:25;;;;;;;;;;;;;;;:35;43701:8;43675:35;;;;;;;;;;;;;;;;;;;;;;;;;43668:42;;43554:164;;;;:::o;66628:168::-;29818:12;:10;:12::i;:::-;29807:23;;:7;:5;:7::i;:::-;:23;;;29799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66707:6:::1;66703:88;66718:6;;:13;;66716:1;:15;66703:88;;;66779:4;66747:20;:31;66768:6;;66775:1;66768:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;66747:31;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;66732:3;;;;;:::i;:::-;;;;66703:88;;;;66628:168:::0;;:::o;66318:120::-;29818:12;:10;:12::i;:::-;29807:23;;:7;:5;:7::i;:::-;:23;;;29799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66417:15:::1;66400:14;:32;;;;;;;;;;;;:::i;:::-;;66318:120:::0;:::o;30487:192::-;29818:12;:10;:12::i;:::-;29807:23;;:7;:5;:7::i;:::-;:23;;;29799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30596:1:::1;30576:22;;:8;:22;;;;30568:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30652:19;30662:8;30652:9;:19::i;:::-;30487:192:::0;:::o;40391:305::-;40493:4;40545:25;40530:40;;;:11;:40;;;;:105;;;;40602:33;40587:48;;;:11;:48;;;;40530:105;:158;;;;40652:36;40676:11;40652:23;:36::i;:::-;40530:158;40510:178;;40391:305;;;:::o;15894:98::-;15947:7;15974:10;15967:17;;15894:98;:::o;46289:127::-;46354:4;46406:1;46378:30;;:7;:16;46386:7;46378:16;;;;;;;;;;;;;;;;;;;;;:30;;;;46371:37;;46289:127;;;:::o;50271:174::-;50373:2;50346:15;:24;50362:7;50346:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;50429:7;50425:2;50391:46;;50400:23;50415:7;50400:14;:23::i;:::-;50391:46;;;;;;;;;;;;50271:174;;:::o;46583:348::-;46676:4;46701:16;46709:7;46701;:16::i;:::-;46693:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46777:13;46793:23;46808:7;46793:14;:23::i;:::-;46777:39;;46846:5;46835:16;;:7;:16;;;:51;;;;46879:7;46855:31;;:20;46867:7;46855:11;:20::i;:::-;:31;;;46835:51;:87;;;;46890:32;46907:5;46914:7;46890:16;:32::i;:::-;46835:87;46827:96;;;46583:348;;;;:::o;49575:578::-;49734:4;49707:31;;:23;49722:7;49707:14;:23::i;:::-;:31;;;49699:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;49817:1;49803:16;;:2;:16;;;;49795:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;49873:39;49894:4;49900:2;49904:7;49873:20;:39::i;:::-;49977:29;49994:1;49998:7;49977:8;:29::i;:::-;50038:1;50019:9;:15;50029:4;50019:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;50067:1;50050:9;:13;50060:2;50050:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;50098:2;50079:7;:16;50087:7;50079:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;50137:7;50133:2;50118:27;;50127:4;50118:27;;;;;;;;;;;;49575:578;;;:::o;30687:173::-;30743:16;30762:6;;;;;;;;;;;30743:25;;30788:8;30779:6;;:17;;;;;;;;;;;;;;;;;;30843:8;30812:40;;30833:8;30812:40;;;;;;;;;;;;30732:128;30687:173;:::o;47273:110::-;47349:26;47359:2;47363:7;47349:26;;;;;;;;;;;;:9;:26::i;:::-;47273:110;;:::o;45661:315::-;45818:28;45828:4;45834:2;45838:7;45818:9;:28::i;:::-;45865:48;45888:4;45894:2;45898:7;45907:5;45865:22;:48::i;:::-;45857:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;45661:315;;;;:::o;62439:102::-;62499:13;62528:7;62521:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62439:102;:::o;4893:723::-;4949:13;5179:1;5170:5;:10;5166:53;;;5197:10;;;;;;;;;;;;;;;;;;;;;5166:53;5229:12;5244:5;5229:20;;5260:14;5285:78;5300:1;5292:4;:9;5285:78;;5318:8;;;;;:::i;:::-;;;;5349:2;5341:10;;;;;:::i;:::-;;;5285:78;;;5373:19;5405:6;5395:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5373:39;;5423:154;5439:1;5430:5;:10;5423:154;;5467:1;5457:11;;;;;:::i;:::-;;;5534:2;5526:5;:10;;;;:::i;:::-;5513:2;:24;;;;:::i;:::-;5500:39;;5483:6;5490;5483:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5563:2;5554:11;;;;;:::i;:::-;;;5423:154;;;5601:6;5587:21;;;;;4893:723;;;;:::o;15061:157::-;15146:4;15185:25;15170:40;;;:11;:40;;;;15163:47;;15061:157;;;:::o;55173:589::-;55317:45;55344:4;55350:2;55354:7;55317:26;:45::i;:::-;55395:1;55379:18;;:4;:18;;;55375:187;;;55414:40;55446:7;55414:31;:40::i;:::-;55375:187;;;55484:2;55476:10;;:4;:10;;;55472:90;;55503:47;55536:4;55542:7;55503:32;:47::i;:::-;55472:90;55375:187;55590:1;55576:16;;:2;:16;;;55572:183;;;55609:45;55646:7;55609:36;:45::i;:::-;55572:183;;;55682:4;55676:10;;:2;:10;;;55672:83;;55703:40;55731:2;55735:7;55703:27;:40::i;:::-;55672:83;55572:183;55173:589;;;:::o;47610:321::-;47740:18;47746:2;47750:7;47740:5;:18::i;:::-;47791:54;47822:1;47826:2;47830:7;47839:5;47791:22;:54::i;:::-;47769:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;47610:321;;;:::o;51010:799::-;51165:4;51186:15;:2;:13;;;:15::i;:::-;51182:620;;;51238:2;51222:36;;;51259:12;:10;:12::i;:::-;51273:4;51279:7;51288:5;51222:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51218:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51481:1;51464:6;:13;:18;51460:272;;;51507:60;;;;;;;;;;:::i;:::-;;;;;;;;51460:272;51682:6;51676:13;51667:6;51663:2;51659:15;51652:38;51218:529;51355:41;;;51345:51;;;:6;:51;;;;51338:58;;;;;51182:620;51786:4;51779:11;;51010:799;;;;;;;:::o;52381:126::-;;;;:::o;56485:164::-;56589:10;:17;;;;56562:15;:24;56578:7;56562:24;;;;;;;;;;;:44;;;;56617:10;56633:7;56617:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56485:164;:::o;57276:988::-;57542:22;57592:1;57567:22;57584:4;57567:16;:22::i;:::-;:26;;;;:::i;:::-;57542:51;;57604:18;57625:17;:26;57643:7;57625:26;;;;;;;;;;;;57604:47;;57772:14;57758:10;:28;57754:328;;57803:19;57825:12;:18;57838:4;57825:18;;;;;;;;;;;;;;;:34;57844:14;57825:34;;;;;;;;;;;;57803:56;;57909:11;57876:12;:18;57889:4;57876:18;;;;;;;;;;;;;;;:30;57895:10;57876:30;;;;;;;;;;;:44;;;;58026:10;57993:17;:30;58011:11;57993:30;;;;;;;;;;;:43;;;;57788:294;57754:328;58178:17;:26;58196:7;58178:26;;;;;;;;;;;58171:33;;;58222:12;:18;58235:4;58222:18;;;;;;;;;;;;;;;:34;58241:14;58222:34;;;;;;;;;;;58215:41;;;57357:907;;57276:988;;:::o;58559:1079::-;58812:22;58857:1;58837:10;:17;;;;:21;;;;:::i;:::-;58812:46;;58869:18;58890:15;:24;58906:7;58890:24;;;;;;;;;;;;58869:45;;59241:19;59263:10;59274:14;59263:26;;;;;;;;:::i;:::-;;;;;;;;;;59241:48;;59327:11;59302:10;59313;59302:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;59438:10;59407:15;:28;59423:11;59407:28;;;;;;;;;;;:41;;;;59579:15;:24;59595:7;59579:24;;;;;;;;;;;59572:31;;;59614:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58630:1008;;;58559:1079;:::o;56063:221::-;56148:14;56165:20;56182:2;56165:16;:20::i;:::-;56148:37;;56223:7;56196:12;:16;56209:2;56196:16;;;;;;;;;;;;;;;:24;56213:6;56196:24;;;;;;;;;;;:34;;;;56270:6;56241:17;:26;56259:7;56241:26;;;;;;;;;;;:35;;;;56137:147;56063:221;;:::o;48267:382::-;48361:1;48347:16;;:2;:16;;;;48339:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;48420:16;48428:7;48420;:16::i;:::-;48419:17;48411:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48482:45;48511:1;48515:2;48519:7;48482:20;:45::i;:::-;48557:1;48540:9;:13;48550:2;48540:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;48588:2;48569:7;:16;48577:7;48569:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48633:7;48629:2;48608:33;;48625:1;48608:33;;;;;;;;;;;;48267:382;;:::o;31677:387::-;31737:4;31945:12;32012:7;32000:20;31992:28;;32055:1;32048:4;:8;32041:15;;;31677:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1594:::-;1667:8;1677:6;1727:3;1720:4;1712:6;1708:17;1704:27;1694:122;;1735:79;;:::i;:::-;1694:122;1848:6;1835:20;1825:30;;1878:18;1870:6;1867:30;1864:117;;;1900:79;;:::i;:::-;1864:117;2014:4;2006:6;2002:17;1990:29;;2068:3;2060:4;2052:6;2048:17;2038:8;2034:32;2031:41;2028:128;;;2075:79;;:::i;:::-;2028:128;1594:568;;;;;:::o;2168:133::-;2211:5;2249:6;2236:20;2227:29;;2265:30;2289:5;2265:30;:::i;:::-;2168:133;;;;:::o;2307:137::-;2352:5;2390:6;2377:20;2368:29;;2406:32;2432:5;2406:32;:::i;:::-;2307:137;;;;:::o;2450:141::-;2506:5;2537:6;2531:13;2522:22;;2553:32;2579:5;2553:32;:::i;:::-;2450:141;;;;:::o;2610:338::-;2665:5;2714:3;2707:4;2699:6;2695:17;2691:27;2681:122;;2722:79;;:::i;:::-;2681:122;2839:6;2826:20;2864:78;2938:3;2930:6;2923:4;2915:6;2911:17;2864:78;:::i;:::-;2855:87;;2671:277;2610:338;;;;:::o;2968:340::-;3024:5;3073:3;3066:4;3058:6;3054:17;3050:27;3040:122;;3081:79;;:::i;:::-;3040:122;3198:6;3185:20;3223:79;3298:3;3290:6;3283:4;3275:6;3271:17;3223:79;:::i;:::-;3214:88;;3030:278;2968:340;;;;:::o;3314:139::-;3360:5;3398:6;3385:20;3376:29;;3414:33;3441:5;3414:33;:::i;:::-;3314:139;;;;:::o;3459:329::-;3518:6;3567:2;3555:9;3546:7;3542:23;3538:32;3535:119;;;3573:79;;:::i;:::-;3535:119;3693:1;3718:53;3763:7;3754:6;3743:9;3739:22;3718:53;:::i;:::-;3708:63;;3664:117;3459:329;;;;:::o;3794:474::-;3862:6;3870;3919:2;3907:9;3898:7;3894:23;3890:32;3887:119;;;3925:79;;:::i;:::-;3887:119;4045:1;4070:53;4115:7;4106:6;4095:9;4091:22;4070:53;:::i;:::-;4060:63;;4016:117;4172:2;4198:53;4243:7;4234:6;4223:9;4219:22;4198:53;:::i;:::-;4188:63;;4143:118;3794:474;;;;;:::o;4274:619::-;4351:6;4359;4367;4416:2;4404:9;4395:7;4391:23;4387:32;4384:119;;;4422:79;;:::i;:::-;4384:119;4542:1;4567:53;4612:7;4603:6;4592:9;4588:22;4567:53;:::i;:::-;4557:63;;4513:117;4669:2;4695:53;4740:7;4731:6;4720:9;4716:22;4695:53;:::i;:::-;4685:63;;4640:118;4797:2;4823:53;4868:7;4859:6;4848:9;4844:22;4823:53;:::i;:::-;4813:63;;4768:118;4274:619;;;;;:::o;4899:943::-;4994:6;5002;5010;5018;5067:3;5055:9;5046:7;5042:23;5038:33;5035:120;;;5074:79;;:::i;:::-;5035:120;5194:1;5219:53;5264:7;5255:6;5244:9;5240:22;5219:53;:::i;:::-;5209:63;;5165:117;5321:2;5347:53;5392:7;5383:6;5372:9;5368:22;5347:53;:::i;:::-;5337:63;;5292:118;5449:2;5475:53;5520:7;5511:6;5500:9;5496:22;5475:53;:::i;:::-;5465:63;;5420:118;5605:2;5594:9;5590:18;5577:32;5636:18;5628:6;5625:30;5622:117;;;5658:79;;:::i;:::-;5622:117;5763:62;5817:7;5808:6;5797:9;5793:22;5763:62;:::i;:::-;5753:72;;5548:287;4899:943;;;;;;;:::o;5848:468::-;5913:6;5921;5970:2;5958:9;5949:7;5945:23;5941:32;5938:119;;;5976:79;;:::i;:::-;5938:119;6096:1;6121:53;6166:7;6157:6;6146:9;6142:22;6121:53;:::i;:::-;6111:63;;6067:117;6223:2;6249:50;6291:7;6282:6;6271:9;6267:22;6249:50;:::i;:::-;6239:60;;6194:115;5848:468;;;;;:::o;6322:474::-;6390:6;6398;6447:2;6435:9;6426:7;6422:23;6418:32;6415:119;;;6453:79;;:::i;:::-;6415:119;6573:1;6598:53;6643:7;6634:6;6623:9;6619:22;6598:53;:::i;:::-;6588:63;;6544:117;6700:2;6726:53;6771:7;6762:6;6751:9;6747:22;6726:53;:::i;:::-;6716:63;;6671:118;6322:474;;;;;:::o;6802:559::-;6888:6;6896;6945:2;6933:9;6924:7;6920:23;6916:32;6913:119;;;6951:79;;:::i;:::-;6913:119;7099:1;7088:9;7084:17;7071:31;7129:18;7121:6;7118:30;7115:117;;;7151:79;;:::i;:::-;7115:117;7264:80;7336:7;7327:6;7316:9;7312:22;7264:80;:::i;:::-;7246:98;;;;7042:312;6802:559;;;;;:::o;7367:704::-;7462:6;7470;7478;7527:2;7515:9;7506:7;7502:23;7498:32;7495:119;;;7533:79;;:::i;:::-;7495:119;7681:1;7670:9;7666:17;7653:31;7711:18;7703:6;7700:30;7697:117;;;7733:79;;:::i;:::-;7697:117;7846:80;7918:7;7909:6;7898:9;7894:22;7846:80;:::i;:::-;7828:98;;;;7624:312;7975:2;8001:53;8046:7;8037:6;8026:9;8022:22;8001:53;:::i;:::-;7991:63;;7946:118;7367:704;;;;;:::o;8077:323::-;8133:6;8182:2;8170:9;8161:7;8157:23;8153:32;8150:119;;;8188:79;;:::i;:::-;8150:119;8308:1;8333:50;8375:7;8366:6;8355:9;8351:22;8333:50;:::i;:::-;8323:60;;8279:114;8077:323;;;;:::o;8406:327::-;8464:6;8513:2;8501:9;8492:7;8488:23;8484:32;8481:119;;;8519:79;;:::i;:::-;8481:119;8639:1;8664:52;8708:7;8699:6;8688:9;8684:22;8664:52;:::i;:::-;8654:62;;8610:116;8406:327;;;;:::o;8739:349::-;8808:6;8857:2;8845:9;8836:7;8832:23;8828:32;8825:119;;;8863:79;;:::i;:::-;8825:119;8983:1;9008:63;9063:7;9054:6;9043:9;9039:22;9008:63;:::i;:::-;8998:73;;8954:127;8739:349;;;;:::o;9094:509::-;9163:6;9212:2;9200:9;9191:7;9187:23;9183:32;9180:119;;;9218:79;;:::i;:::-;9180:119;9366:1;9355:9;9351:17;9338:31;9396:18;9388:6;9385:30;9382:117;;;9418:79;;:::i;:::-;9382:117;9523:63;9578:7;9569:6;9558:9;9554:22;9523:63;:::i;:::-;9513:73;;9309:287;9094:509;;;;:::o;9609:329::-;9668:6;9717:2;9705:9;9696:7;9692:23;9688:32;9685:119;;;9723:79;;:::i;:::-;9685:119;9843:1;9868:53;9913:7;9904:6;9893:9;9889:22;9868:53;:::i;:::-;9858:63;;9814:117;9609:329;;;;:::o;9944:179::-;10013:10;10034:46;10076:3;10068:6;10034:46;:::i;:::-;10112:4;10107:3;10103:14;10089:28;;9944:179;;;;:::o;10129:118::-;10216:24;10234:5;10216:24;:::i;:::-;10211:3;10204:37;10129:118;;:::o;10283:732::-;10402:3;10431:54;10479:5;10431:54;:::i;:::-;10501:86;10580:6;10575:3;10501:86;:::i;:::-;10494:93;;10611:56;10661:5;10611:56;:::i;:::-;10690:7;10721:1;10706:284;10731:6;10728:1;10725:13;10706:284;;;10807:6;10801:13;10834:63;10893:3;10878:13;10834:63;:::i;:::-;10827:70;;10920:60;10973:6;10920:60;:::i;:::-;10910:70;;10766:224;10753:1;10750;10746:9;10741:14;;10706:284;;;10710:14;11006:3;10999:10;;10407:608;;;10283:732;;;;:::o;11021:109::-;11102:21;11117:5;11102:21;:::i;:::-;11097:3;11090:34;11021:109;;:::o;11136:360::-;11222:3;11250:38;11282:5;11250:38;:::i;:::-;11304:70;11367:6;11362:3;11304:70;:::i;:::-;11297:77;;11383:52;11428:6;11423:3;11416:4;11409:5;11405:16;11383:52;:::i;:::-;11460:29;11482:6;11460:29;:::i;:::-;11455:3;11451:39;11444:46;;11226:270;11136:360;;;;:::o;11502:364::-;11590:3;11618:39;11651:5;11618:39;:::i;:::-;11673:71;11737:6;11732:3;11673:71;:::i;:::-;11666:78;;11753:52;11798:6;11793:3;11786:4;11779:5;11775:16;11753:52;:::i;:::-;11830:29;11852:6;11830:29;:::i;:::-;11825:3;11821:39;11814:46;;11594:272;11502:364;;;;:::o;11872:377::-;11978:3;12006:39;12039:5;12006:39;:::i;:::-;12061:89;12143:6;12138:3;12061:89;:::i;:::-;12054:96;;12159:52;12204:6;12199:3;12192:4;12185:5;12181:16;12159:52;:::i;:::-;12236:6;12231:3;12227:16;12220:23;;11982:267;11872:377;;;;:::o;12279:845::-;12382:3;12419:5;12413:12;12448:36;12474:9;12448:36;:::i;:::-;12500:89;12582:6;12577:3;12500:89;:::i;:::-;12493:96;;12620:1;12609:9;12605:17;12636:1;12631:137;;;;12782:1;12777:341;;;;12598:520;;12631:137;12715:4;12711:9;12700;12696:25;12691:3;12684:38;12751:6;12746:3;12742:16;12735:23;;12631:137;;12777:341;12844:38;12876:5;12844:38;:::i;:::-;12904:1;12918:154;12932:6;12929:1;12926:13;12918:154;;;13006:7;13000:14;12996:1;12991:3;12987:11;12980:35;13056:1;13047:7;13043:15;13032:26;;12954:4;12951:1;12947:12;12942:17;;12918:154;;;13101:6;13096:3;13092:16;13085:23;;12784:334;;12598:520;;12386:738;;12279:845;;;;:::o;13130:366::-;13272:3;13293:67;13357:2;13352:3;13293:67;:::i;:::-;13286:74;;13369:93;13458:3;13369:93;:::i;:::-;13487:2;13482:3;13478:12;13471:19;;13130:366;;;:::o;13502:::-;13644:3;13665:67;13729:2;13724:3;13665:67;:::i;:::-;13658:74;;13741:93;13830:3;13741:93;:::i;:::-;13859:2;13854:3;13850:12;13843:19;;13502:366;;;:::o;13874:::-;14016:3;14037:67;14101:2;14096:3;14037:67;:::i;:::-;14030:74;;14113:93;14202:3;14113:93;:::i;:::-;14231:2;14226:3;14222:12;14215:19;;13874:366;;;:::o;14246:::-;14388:3;14409:67;14473:2;14468:3;14409:67;:::i;:::-;14402:74;;14485:93;14574:3;14485:93;:::i;:::-;14603:2;14598:3;14594:12;14587:19;;14246:366;;;:::o;14618:::-;14760:3;14781:67;14845:2;14840:3;14781:67;:::i;:::-;14774:74;;14857:93;14946:3;14857:93;:::i;:::-;14975:2;14970:3;14966:12;14959:19;;14618:366;;;:::o;14990:::-;15132:3;15153:67;15217:2;15212:3;15153:67;:::i;:::-;15146:74;;15229:93;15318:3;15229:93;:::i;:::-;15347:2;15342:3;15338:12;15331:19;;14990:366;;;:::o;15362:::-;15504:3;15525:67;15589:2;15584:3;15525:67;:::i;:::-;15518:74;;15601:93;15690:3;15601:93;:::i;:::-;15719:2;15714:3;15710:12;15703:19;;15362:366;;;:::o;15734:::-;15876:3;15897:67;15961:2;15956:3;15897:67;:::i;:::-;15890:74;;15973:93;16062:3;15973:93;:::i;:::-;16091:2;16086:3;16082:12;16075:19;;15734:366;;;:::o;16106:::-;16248:3;16269:67;16333:2;16328:3;16269:67;:::i;:::-;16262:74;;16345:93;16434:3;16345:93;:::i;:::-;16463:2;16458:3;16454:12;16447:19;;16106:366;;;:::o;16478:::-;16620:3;16641:67;16705:2;16700:3;16641:67;:::i;:::-;16634:74;;16717:93;16806:3;16717:93;:::i;:::-;16835:2;16830:3;16826:12;16819:19;;16478:366;;;:::o;16850:::-;16992:3;17013:67;17077:2;17072:3;17013:67;:::i;:::-;17006:74;;17089:93;17178:3;17089:93;:::i;:::-;17207:2;17202:3;17198:12;17191:19;;16850:366;;;:::o;17222:::-;17364:3;17385:67;17449:2;17444:3;17385:67;:::i;:::-;17378:74;;17461:93;17550:3;17461:93;:::i;:::-;17579:2;17574:3;17570:12;17563:19;;17222:366;;;:::o;17594:::-;17736:3;17757:67;17821:2;17816:3;17757:67;:::i;:::-;17750:74;;17833:93;17922:3;17833:93;:::i;:::-;17951:2;17946:3;17942:12;17935:19;;17594:366;;;:::o;17966:::-;18108:3;18129:67;18193:2;18188:3;18129:67;:::i;:::-;18122:74;;18205:93;18294:3;18205:93;:::i;:::-;18323:2;18318:3;18314:12;18307:19;;17966:366;;;:::o;18338:::-;18480:3;18501:67;18565:2;18560:3;18501:67;:::i;:::-;18494:74;;18577:93;18666:3;18577:93;:::i;:::-;18695:2;18690:3;18686:12;18679:19;;18338:366;;;:::o;18710:::-;18852:3;18873:67;18937:2;18932:3;18873:67;:::i;:::-;18866:74;;18949:93;19038:3;18949:93;:::i;:::-;19067:2;19062:3;19058:12;19051:19;;18710:366;;;:::o;19082:::-;19224:3;19245:67;19309:2;19304:3;19245:67;:::i;:::-;19238:74;;19321:93;19410:3;19321:93;:::i;:::-;19439:2;19434:3;19430:12;19423:19;;19082:366;;;:::o;19454:::-;19596:3;19617:67;19681:2;19676:3;19617:67;:::i;:::-;19610:74;;19693:93;19782:3;19693:93;:::i;:::-;19811:2;19806:3;19802:12;19795:19;;19454:366;;;:::o;19826:::-;19968:3;19989:67;20053:2;20048:3;19989:67;:::i;:::-;19982:74;;20065:93;20154:3;20065:93;:::i;:::-;20183:2;20178:3;20174:12;20167:19;;19826:366;;;:::o;20198:::-;20340:3;20361:67;20425:2;20420:3;20361:67;:::i;:::-;20354:74;;20437:93;20526:3;20437:93;:::i;:::-;20555:2;20550:3;20546:12;20539:19;;20198:366;;;:::o;20570:::-;20712:3;20733:67;20797:2;20792:3;20733:67;:::i;:::-;20726:74;;20809:93;20898:3;20809:93;:::i;:::-;20927:2;20922:3;20918:12;20911:19;;20570:366;;;:::o;20942:::-;21084:3;21105:67;21169:2;21164:3;21105:67;:::i;:::-;21098:74;;21181:93;21270:3;21181:93;:::i;:::-;21299:2;21294:3;21290:12;21283:19;;20942:366;;;:::o;21314:::-;21456:3;21477:67;21541:2;21536:3;21477:67;:::i;:::-;21470:74;;21553:93;21642:3;21553:93;:::i;:::-;21671:2;21666:3;21662:12;21655:19;;21314:366;;;:::o;21686:398::-;21845:3;21866:83;21947:1;21942:3;21866:83;:::i;:::-;21859:90;;21958:93;22047:3;21958:93;:::i;:::-;22076:1;22071:3;22067:11;22060:18;;21686:398;;;:::o;22090:366::-;22232:3;22253:67;22317:2;22312:3;22253:67;:::i;:::-;22246:74;;22329:93;22418:3;22329:93;:::i;:::-;22447:2;22442:3;22438:12;22431:19;;22090:366;;;:::o;22462:::-;22604:3;22625:67;22689:2;22684:3;22625:67;:::i;:::-;22618:74;;22701:93;22790:3;22701:93;:::i;:::-;22819:2;22814:3;22810:12;22803:19;;22462:366;;;:::o;22834:::-;22976:3;22997:67;23061:2;23056:3;22997:67;:::i;:::-;22990:74;;23073:93;23162:3;23073:93;:::i;:::-;23191:2;23186:3;23182:12;23175:19;;22834:366;;;:::o;23206:::-;23348:3;23369:67;23433:2;23428:3;23369:67;:::i;:::-;23362:74;;23445:93;23534:3;23445:93;:::i;:::-;23563:2;23558:3;23554:12;23547:19;;23206:366;;;:::o;23578:::-;23720:3;23741:67;23805:2;23800:3;23741:67;:::i;:::-;23734:74;;23817:93;23906:3;23817:93;:::i;:::-;23935:2;23930:3;23926:12;23919:19;;23578:366;;;:::o;23950:108::-;24027:24;24045:5;24027:24;:::i;:::-;24022:3;24015:37;23950:108;;:::o;24064:118::-;24151:24;24169:5;24151:24;:::i;:::-;24146:3;24139:37;24064:118;;:::o;24188:589::-;24413:3;24435:95;24526:3;24517:6;24435:95;:::i;:::-;24428:102;;24547:95;24638:3;24629:6;24547:95;:::i;:::-;24540:102;;24659:92;24747:3;24738:6;24659:92;:::i;:::-;24652:99;;24768:3;24761:10;;24188:589;;;;;;:::o;24783:379::-;24967:3;24989:147;25132:3;24989:147;:::i;:::-;24982:154;;25153:3;25146:10;;24783:379;;;:::o;25168:222::-;25261:4;25299:2;25288:9;25284:18;25276:26;;25312:71;25380:1;25369:9;25365:17;25356:6;25312:71;:::i;:::-;25168:222;;;;:::o;25396:640::-;25591:4;25629:3;25618:9;25614:19;25606:27;;25643:71;25711:1;25700:9;25696:17;25687:6;25643:71;:::i;:::-;25724:72;25792:2;25781:9;25777:18;25768:6;25724:72;:::i;:::-;25806;25874:2;25863:9;25859:18;25850:6;25806:72;:::i;:::-;25925:9;25919:4;25915:20;25910:2;25899:9;25895:18;25888:48;25953:76;26024:4;26015:6;25953:76;:::i;:::-;25945:84;;25396:640;;;;;;;:::o;26042:373::-;26185:4;26223:2;26212:9;26208:18;26200:26;;26272:9;26266:4;26262:20;26258:1;26247:9;26243:17;26236:47;26300:108;26403:4;26394:6;26300:108;:::i;:::-;26292:116;;26042:373;;;;:::o;26421:210::-;26508:4;26546:2;26535:9;26531:18;26523:26;;26559:65;26621:1;26610:9;26606:17;26597:6;26559:65;:::i;:::-;26421:210;;;;:::o;26637:313::-;26750:4;26788:2;26777:9;26773:18;26765:26;;26837:9;26831:4;26827:20;26823:1;26812:9;26808:17;26801:47;26865:78;26938:4;26929:6;26865:78;:::i;:::-;26857:86;;26637:313;;;;:::o;26956:419::-;27122:4;27160:2;27149:9;27145:18;27137:26;;27209:9;27203:4;27199:20;27195:1;27184:9;27180:17;27173:47;27237:131;27363:4;27237:131;:::i;:::-;27229:139;;26956:419;;;:::o;27381:::-;27547:4;27585:2;27574:9;27570:18;27562:26;;27634:9;27628:4;27624:20;27620:1;27609:9;27605:17;27598:47;27662:131;27788:4;27662:131;:::i;:::-;27654:139;;27381:419;;;:::o;27806:::-;27972:4;28010:2;27999:9;27995:18;27987:26;;28059:9;28053:4;28049:20;28045:1;28034:9;28030:17;28023:47;28087:131;28213:4;28087:131;:::i;:::-;28079:139;;27806:419;;;:::o;28231:::-;28397:4;28435:2;28424:9;28420:18;28412:26;;28484:9;28478:4;28474:20;28470:1;28459:9;28455:17;28448:47;28512:131;28638:4;28512:131;:::i;:::-;28504:139;;28231:419;;;:::o;28656:::-;28822:4;28860:2;28849:9;28845:18;28837:26;;28909:9;28903:4;28899:20;28895:1;28884:9;28880:17;28873:47;28937:131;29063:4;28937:131;:::i;:::-;28929:139;;28656:419;;;:::o;29081:::-;29247:4;29285:2;29274:9;29270:18;29262:26;;29334:9;29328:4;29324:20;29320:1;29309:9;29305:17;29298:47;29362:131;29488:4;29362:131;:::i;:::-;29354:139;;29081:419;;;:::o;29506:::-;29672:4;29710:2;29699:9;29695:18;29687:26;;29759:9;29753:4;29749:20;29745:1;29734:9;29730:17;29723:47;29787:131;29913:4;29787:131;:::i;:::-;29779:139;;29506:419;;;:::o;29931:::-;30097:4;30135:2;30124:9;30120:18;30112:26;;30184:9;30178:4;30174:20;30170:1;30159:9;30155:17;30148:47;30212:131;30338:4;30212:131;:::i;:::-;30204:139;;29931:419;;;:::o;30356:::-;30522:4;30560:2;30549:9;30545:18;30537:26;;30609:9;30603:4;30599:20;30595:1;30584:9;30580:17;30573:47;30637:131;30763:4;30637:131;:::i;:::-;30629:139;;30356:419;;;:::o;30781:::-;30947:4;30985:2;30974:9;30970:18;30962:26;;31034:9;31028:4;31024:20;31020:1;31009:9;31005:17;30998:47;31062:131;31188:4;31062:131;:::i;:::-;31054:139;;30781:419;;;:::o;31206:::-;31372:4;31410:2;31399:9;31395:18;31387:26;;31459:9;31453:4;31449:20;31445:1;31434:9;31430:17;31423:47;31487:131;31613:4;31487:131;:::i;:::-;31479:139;;31206:419;;;:::o;31631:::-;31797:4;31835:2;31824:9;31820:18;31812:26;;31884:9;31878:4;31874:20;31870:1;31859:9;31855:17;31848:47;31912:131;32038:4;31912:131;:::i;:::-;31904:139;;31631:419;;;:::o;32056:::-;32222:4;32260:2;32249:9;32245:18;32237:26;;32309:9;32303:4;32299:20;32295:1;32284:9;32280:17;32273:47;32337:131;32463:4;32337:131;:::i;:::-;32329:139;;32056:419;;;:::o;32481:::-;32647:4;32685:2;32674:9;32670:18;32662:26;;32734:9;32728:4;32724:20;32720:1;32709:9;32705:17;32698:47;32762:131;32888:4;32762:131;:::i;:::-;32754:139;;32481:419;;;:::o;32906:::-;33072:4;33110:2;33099:9;33095:18;33087:26;;33159:9;33153:4;33149:20;33145:1;33134:9;33130:17;33123:47;33187:131;33313:4;33187:131;:::i;:::-;33179:139;;32906:419;;;:::o;33331:::-;33497:4;33535:2;33524:9;33520:18;33512:26;;33584:9;33578:4;33574:20;33570:1;33559:9;33555:17;33548:47;33612:131;33738:4;33612:131;:::i;:::-;33604:139;;33331:419;;;:::o;33756:::-;33922:4;33960:2;33949:9;33945:18;33937:26;;34009:9;34003:4;33999:20;33995:1;33984:9;33980:17;33973:47;34037:131;34163:4;34037:131;:::i;:::-;34029:139;;33756:419;;;:::o;34181:::-;34347:4;34385:2;34374:9;34370:18;34362:26;;34434:9;34428:4;34424:20;34420:1;34409:9;34405:17;34398:47;34462:131;34588:4;34462:131;:::i;:::-;34454:139;;34181:419;;;:::o;34606:::-;34772:4;34810:2;34799:9;34795:18;34787:26;;34859:9;34853:4;34849:20;34845:1;34834:9;34830:17;34823:47;34887:131;35013:4;34887:131;:::i;:::-;34879:139;;34606:419;;;:::o;35031:::-;35197:4;35235:2;35224:9;35220:18;35212:26;;35284:9;35278:4;35274:20;35270:1;35259:9;35255:17;35248:47;35312:131;35438:4;35312:131;:::i;:::-;35304:139;;35031:419;;;:::o;35456:::-;35622:4;35660:2;35649:9;35645:18;35637:26;;35709:9;35703:4;35699:20;35695:1;35684:9;35680:17;35673:47;35737:131;35863:4;35737:131;:::i;:::-;35729:139;;35456:419;;;:::o;35881:::-;36047:4;36085:2;36074:9;36070:18;36062:26;;36134:9;36128:4;36124:20;36120:1;36109:9;36105:17;36098:47;36162:131;36288:4;36162:131;:::i;:::-;36154:139;;35881:419;;;:::o;36306:::-;36472:4;36510:2;36499:9;36495:18;36487:26;;36559:9;36553:4;36549:20;36545:1;36534:9;36530:17;36523:47;36587:131;36713:4;36587:131;:::i;:::-;36579:139;;36306:419;;;:::o;36731:::-;36897:4;36935:2;36924:9;36920:18;36912:26;;36984:9;36978:4;36974:20;36970:1;36959:9;36955:17;36948:47;37012:131;37138:4;37012:131;:::i;:::-;37004:139;;36731:419;;;:::o;37156:::-;37322:4;37360:2;37349:9;37345:18;37337:26;;37409:9;37403:4;37399:20;37395:1;37384:9;37380:17;37373:47;37437:131;37563:4;37437:131;:::i;:::-;37429:139;;37156:419;;;:::o;37581:::-;37747:4;37785:2;37774:9;37770:18;37762:26;;37834:9;37828:4;37824:20;37820:1;37809:9;37805:17;37798:47;37862:131;37988:4;37862:131;:::i;:::-;37854:139;;37581:419;;;:::o;38006:::-;38172:4;38210:2;38199:9;38195:18;38187:26;;38259:9;38253:4;38249:20;38245:1;38234:9;38230:17;38223:47;38287:131;38413:4;38287:131;:::i;:::-;38279:139;;38006:419;;;:::o;38431:::-;38597:4;38635:2;38624:9;38620:18;38612:26;;38684:9;38678:4;38674:20;38670:1;38659:9;38655:17;38648:47;38712:131;38838:4;38712:131;:::i;:::-;38704:139;;38431:419;;;:::o;38856:222::-;38949:4;38987:2;38976:9;38972:18;38964:26;;39000:71;39068:1;39057:9;39053:17;39044:6;39000:71;:::i;:::-;38856:222;;;;:::o;39084:129::-;39118:6;39145:20;;:::i;:::-;39135:30;;39174:33;39202:4;39194:6;39174:33;:::i;:::-;39084:129;;;:::o;39219:75::-;39252:6;39285:2;39279:9;39269:19;;39219:75;:::o;39300:307::-;39361:4;39451:18;39443:6;39440:30;39437:56;;;39473:18;;:::i;:::-;39437:56;39511:29;39533:6;39511:29;:::i;:::-;39503:37;;39595:4;39589;39585:15;39577:23;;39300:307;;;:::o;39613:308::-;39675:4;39765:18;39757:6;39754:30;39751:56;;;39787:18;;:::i;:::-;39751:56;39825:29;39847:6;39825:29;:::i;:::-;39817:37;;39909:4;39903;39899:15;39891:23;;39613:308;;;:::o;39927:132::-;39994:4;40017:3;40009:11;;40047:4;40042:3;40038:14;40030:22;;39927:132;;;:::o;40065:141::-;40114:4;40137:3;40129:11;;40160:3;40157:1;40150:14;40194:4;40191:1;40181:18;40173:26;;40065:141;;;:::o;40212:114::-;40279:6;40313:5;40307:12;40297:22;;40212:114;;;:::o;40332:98::-;40383:6;40417:5;40411:12;40401:22;;40332:98;;;:::o;40436:99::-;40488:6;40522:5;40516:12;40506:22;;40436:99;;;:::o;40541:113::-;40611:4;40643;40638:3;40634:14;40626:22;;40541:113;;;:::o;40660:184::-;40759:11;40793:6;40788:3;40781:19;40833:4;40828:3;40824:14;40809:29;;40660:184;;;;:::o;40850:168::-;40933:11;40967:6;40962:3;40955:19;41007:4;41002:3;40998:14;40983:29;;40850:168;;;;:::o;41024:147::-;41125:11;41162:3;41147:18;;41024:147;;;;:::o;41177:169::-;41261:11;41295:6;41290:3;41283:19;41335:4;41330:3;41326:14;41311:29;;41177:169;;;;:::o;41352:148::-;41454:11;41491:3;41476:18;;41352:148;;;;:::o;41506:305::-;41546:3;41565:20;41583:1;41565:20;:::i;:::-;41560:25;;41599:20;41617:1;41599:20;:::i;:::-;41594:25;;41753:1;41685:66;41681:74;41678:1;41675:81;41672:107;;;41759:18;;:::i;:::-;41672:107;41803:1;41800;41796:9;41789:16;;41506:305;;;;:::o;41817:185::-;41857:1;41874:20;41892:1;41874:20;:::i;:::-;41869:25;;41908:20;41926:1;41908:20;:::i;:::-;41903:25;;41947:1;41937:35;;41952:18;;:::i;:::-;41937:35;41994:1;41991;41987:9;41982:14;;41817:185;;;;:::o;42008:348::-;42048:7;42071:20;42089:1;42071:20;:::i;:::-;42066:25;;42105:20;42123:1;42105:20;:::i;:::-;42100:25;;42293:1;42225:66;42221:74;42218:1;42215:81;42210:1;42203:9;42196:17;42192:105;42189:131;;;42300:18;;:::i;:::-;42189:131;42348:1;42345;42341:9;42330:20;;42008:348;;;;:::o;42362:191::-;42402:4;42422:20;42440:1;42422:20;:::i;:::-;42417:25;;42456:20;42474:1;42456:20;:::i;:::-;42451:25;;42495:1;42492;42489:8;42486:34;;;42500:18;;:::i;:::-;42486:34;42545:1;42542;42538:9;42530:17;;42362:191;;;;:::o;42559:96::-;42596:7;42625:24;42643:5;42625:24;:::i;:::-;42614:35;;42559:96;;;:::o;42661:90::-;42695:7;42738:5;42731:13;42724:21;42713:32;;42661:90;;;:::o;42757:149::-;42793:7;42833:66;42826:5;42822:78;42811:89;;42757:149;;;:::o;42912:126::-;42949:7;42989:42;42982:5;42978:54;42967:65;;42912:126;;;:::o;43044:77::-;43081:7;43110:5;43099:16;;43044:77;;;:::o;43127:154::-;43211:6;43206:3;43201;43188:30;43273:1;43264:6;43259:3;43255:16;43248:27;43127:154;;;:::o;43287:307::-;43355:1;43365:113;43379:6;43376:1;43373:13;43365:113;;;43464:1;43459:3;43455:11;43449:18;43445:1;43440:3;43436:11;43429:39;43401:2;43398:1;43394:10;43389:15;;43365:113;;;43496:6;43493:1;43490:13;43487:101;;;43576:1;43567:6;43562:3;43558:16;43551:27;43487:101;43336:258;43287:307;;;:::o;43600:320::-;43644:6;43681:1;43675:4;43671:12;43661:22;;43728:1;43722:4;43718:12;43749:18;43739:81;;43805:4;43797:6;43793:17;43783:27;;43739:81;43867:2;43859:6;43856:14;43836:18;43833:38;43830:84;;;43886:18;;:::i;:::-;43830:84;43651:269;43600:320;;;:::o;43926:281::-;44009:27;44031:4;44009:27;:::i;:::-;44001:6;43997:40;44139:6;44127:10;44124:22;44103:18;44091:10;44088:34;44085:62;44082:88;;;44150:18;;:::i;:::-;44082:88;44190:10;44186:2;44179:22;43969:238;43926:281;;:::o;44213:233::-;44252:3;44275:24;44293:5;44275:24;:::i;:::-;44266:33;;44321:66;44314:5;44311:77;44308:103;;;44391:18;;:::i;:::-;44308:103;44438:1;44431:5;44427:13;44420:20;;44213:233;;;:::o;44452:176::-;44484:1;44501:20;44519:1;44501:20;:::i;:::-;44496:25;;44535:20;44553:1;44535:20;:::i;:::-;44530:25;;44574:1;44564:35;;44579:18;;:::i;:::-;44564:35;44620:1;44617;44613:9;44608:14;;44452:176;;;;:::o;44634:180::-;44682:77;44679:1;44672:88;44779:4;44776:1;44769:15;44803:4;44800:1;44793:15;44820:180;44868:77;44865:1;44858:88;44965:4;44962:1;44955:15;44989:4;44986:1;44979:15;45006:180;45054:77;45051:1;45044:88;45151:4;45148:1;45141:15;45175:4;45172:1;45165:15;45192:180;45240:77;45237:1;45230:88;45337:4;45334:1;45327:15;45361:4;45358:1;45351:15;45378:180;45426:77;45423:1;45416:88;45523:4;45520:1;45513:15;45547:4;45544:1;45537:15;45564:180;45612:77;45609:1;45602:88;45709:4;45706:1;45699:15;45733:4;45730:1;45723:15;45750:117;45859:1;45856;45849:12;45873:117;45982:1;45979;45972:12;45996:117;46105:1;46102;46095:12;46119:117;46228:1;46225;46218:12;46242:117;46351:1;46348;46341:12;46365:117;46474:1;46471;46464:12;46488:102;46529:6;46580:2;46576:7;46571:2;46564:5;46560:14;46556:28;46546:38;;46488:102;;;:::o;46596:230::-;46736:34;46732:1;46724:6;46720:14;46713:58;46805:13;46800:2;46792:6;46788:15;46781:38;46596:230;:::o;46832:237::-;46972:34;46968:1;46960:6;46956:14;46949:58;47041:20;47036:2;47028:6;47024:15;47017:45;46832:237;:::o;47075:225::-;47215:34;47211:1;47203:6;47199:14;47192:58;47284:8;47279:2;47271:6;47267:15;47260:33;47075:225;:::o;47306:178::-;47446:30;47442:1;47434:6;47430:14;47423:54;47306:178;:::o;47490:::-;47630:30;47626:1;47618:6;47614:14;47607:54;47490:178;:::o;47674:223::-;47814:34;47810:1;47802:6;47798:14;47791:58;47883:6;47878:2;47870:6;47866:15;47859:31;47674:223;:::o;47903:168::-;48043:20;48039:1;48031:6;48027:14;48020:44;47903:168;:::o;48077:175::-;48217:27;48213:1;48205:6;48201:14;48194:51;48077:175;:::o;48258:231::-;48398:34;48394:1;48386:6;48382:14;48375:58;48467:14;48462:2;48454:6;48450:15;48443:39;48258:231;:::o;48495:243::-;48635:34;48631:1;48623:6;48619:14;48612:58;48704:26;48699:2;48691:6;48687:15;48680:51;48495:243;:::o;48744:229::-;48884:34;48880:1;48872:6;48868:14;48861:58;48953:12;48948:2;48940:6;48936:15;48929:37;48744:229;:::o;48979:228::-;49119:34;49115:1;49107:6;49103:14;49096:58;49188:11;49183:2;49175:6;49171:15;49164:36;48979:228;:::o;49213:165::-;49353:17;49349:1;49341:6;49337:14;49330:41;49213:165;:::o;49384:172::-;49524:24;49520:1;49512:6;49508:14;49501:48;49384:172;:::o;49562:223::-;49702:34;49698:1;49690:6;49686:14;49679:58;49771:6;49766:2;49758:6;49754:15;49747:31;49562:223;:::o;49791:182::-;49931:34;49927:1;49919:6;49915:14;49908:58;49791:182;:::o;49979:170::-;50119:22;50115:1;50107:6;50103:14;50096:46;49979:170;:::o;50155:231::-;50295:34;50291:1;50283:6;50279:14;50272:58;50364:14;50359:2;50351:6;50347:15;50340:39;50155:231;:::o;50392:182::-;50532:34;50528:1;50520:6;50516:14;50509:58;50392:182;:::o;50580:172::-;50720:24;50716:1;50708:6;50704:14;50697:48;50580:172;:::o;50758:228::-;50898:34;50894:1;50886:6;50882:14;50875:58;50967:11;50962:2;50954:6;50950:15;50943:36;50758:228;:::o;50992:234::-;51132:34;51128:1;51120:6;51116:14;51109:58;51201:17;51196:2;51188:6;51184:15;51177:42;50992:234;:::o;51232:220::-;51372:34;51368:1;51360:6;51356:14;51349:58;51441:3;51436:2;51428:6;51424:15;51417:28;51232:220;:::o;51458:114::-;;:::o;51578:168::-;51718:20;51714:1;51706:6;51702:14;51695:44;51578:168;:::o;51752:236::-;51892:34;51888:1;51880:6;51876:14;51869:58;51961:19;51956:2;51948:6;51944:15;51937:44;51752:236;:::o;51994:231::-;52134:34;52130:1;52122:6;52118:14;52111:58;52203:14;52198:2;52190:6;52186:15;52179:39;51994:231;:::o;52231:173::-;52371:25;52367:1;52359:6;52355:14;52348:49;52231:173;:::o;52410:177::-;52550:29;52546:1;52538:6;52534:14;52527:53;52410:177;:::o;52593:122::-;52666:24;52684:5;52666:24;:::i;:::-;52659:5;52656:35;52646:63;;52705:1;52702;52695:12;52646:63;52593:122;:::o;52721:116::-;52791:21;52806:5;52791:21;:::i;:::-;52784:5;52781:32;52771:60;;52827:1;52824;52817:12;52771:60;52721:116;:::o;52843:120::-;52915:23;52932:5;52915:23;:::i;:::-;52908:5;52905:34;52895:62;;52953:1;52950;52943:12;52895:62;52843:120;:::o;52969:122::-;53042:24;53060:5;53042:24;:::i;:::-;53035:5;53032:35;53022:63;;53081:1;53078;53071:12;53022:63;52969:122;:::o

Swarm Source

ipfs://70b132ffa803c30f9399d3d0931b32f911b909b591ecf89e8a26ae4fbaf57f8a
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.