ETH Price: $2,890.76 (-5.18%)
Gas: 4 Gwei

Token

Goblin Boys (GB)
 

Overview

Max Total Supply

5,555 GB

Holders

1,416

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 GB
0x73f92C1a3636f7fb49721c7464435390c87A70a6
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:
GoblinBoys

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 16: boys.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ERC721A.sol";
import "./Ownable.sol";
import "./EIP712.sol";

contract GoblinBoys is ERC721A, EIP712, Ownable {
    using Strings for uint256;

    uint256 public maxSupply = 5555;

    uint256 public price = 0.008 ether;

    uint256 public maxPerTx = 10;

    uint256 public maxFreeAmountForGoblintownHolders = 2000;

    uint256 public maxAmountForPerHolders = 2;

    uint256 public maxPerWallet = 60;

    uint256 public maxFreePerWallet = 2;

    uint256 public maxFreeAmount = 1500;

    bool public mintEnabled;

    bool public revealed;

    string public baseURI;

    string public unrevealedURI;

    uint256 mintedForHolders;

    mapping(address => uint256) private _mintedFreeAmount;

    bytes32 public constant MINT_CALL_HASH_TYPE =
        keccak256("mint(address receiver,uint256 amount)");

    address public cSigner;

    constructor() ERC721A("Goblin Boys", "GB") EIP712("Goblin Boys", "1") {
        _safeMint(msg.sender, 10);
    }

    function mint(uint256 amt) external payable {
        uint256 cost = price;
        bool freeMint = ((_mintedFreeAmount[msg.sender] + amt <=
            maxFreePerWallet) && (amt <= maxFreePerWallet)) ||
            msg.sender == owner();
        if (freeMint) {
            cost = 0;
        }

        require(msg.value >= amt * cost, "Please send the exact amount.");
        require(totalSupply() + amt < maxSupply + 1, "No more Goblin Boys");
        require(mintEnabled, "Minting is not live yet.");
        require(amt < maxPerTx + 1, "Max per TX reached.");
        require(
            _numberMinted(msg.sender) + amt <= maxPerWallet,
            "Too many per wallet!"
        );

        if (freeMint) {
            _mintedFreeAmount[msg.sender] += amt;
        }

        _safeMint(msg.sender, amt);
    }

    function goblinHolderMint(
        uint256 amountV,
        bytes32 r,
        bytes32 s
    ) external {
        uint256 amount = uint248(amountV);
        uint8 v = uint8(amountV >> 248);

        require(
            mintedForHolders + maxAmountForPerHolders <
                maxFreeAmountForGoblintownHolders,
            "No more free Goblin Boys for holders"
        );
        require(totalSupply() + 1 < maxSupply + 1, "No more Goblin Boys");

        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                ECDSA.toTypedDataHash(
                    _domainSeparatorV4(),
                    keccak256(
                        abi.encode(MINT_CALL_HASH_TYPE, msg.sender, amount)
                    )
                )
            )
        );
        require(ecrecover(digest, v, r, s) == cSigner, "Invalid signer");
        mintedForHolders += maxAmountForPerHolders;
        _safeMint(msg.sender, maxAmountForPerHolders);
    }

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

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        return
            revealed
                ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json"))
                : unrevealedURI;
    }

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

    function setSigner(address signer) public onlyOwner {
        cSigner = signer;
    }

    function setUnrevealedURI(string memory uri) public onlyOwner {
        unrevealedURI = uri;
    }

    function setPrice(uint256 _newPrice) external onlyOwner {
        price = _newPrice;
    }

    function setMaxFreeAmount(uint256 _amount) external onlyOwner {
        maxFreeAmount = _amount;
    }

    function setMaxFreePerWallet(uint256 _amount) external onlyOwner {
        maxFreePerWallet = _amount;
    }

    function setMaxAmountForPerHolders(uint256 _amount) external onlyOwner {
        maxAmountForPerHolders = _amount;
    }

    function flipSale() external onlyOwner {
        mintEnabled = !mintEnabled;
    }

    function flipReveal() external onlyOwner {
        revealed = !revealed;
    }

    function withdraw() external onlyOwner {
        (bool success, ) = payable(msg.sender).call{
            value: address(this).balance
        }("");
        require(success, "Transfer failed.");
    }
}

File 1 of 16: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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 3 of 16: Context.sol
// SPDX-License-Identifier: MIT

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 4 of 16: ECDSA.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    function tryRecover(bytes32 hash, bytes memory signature)
        internal
        pure
        returns (address, RecoverError)
    {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    function recover(bytes32 hash, bytes memory signature)
        internal
        pure
        returns (address)
    {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(
                vs,
                0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
            )
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        if (
            uint256(s) >
            0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0
        ) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash)
        internal
        pure
        returns (bytes32)
    {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return
            keccak256(
                abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
            );
    }

    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", domainSeparator, structHash)
            );
    }
}

File 5 of 16: EIP712.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ECDSA.sol";

abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(
            typeHash,
            hashedName,
            hashedVersion
        );
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return
                _buildDomainSeparator(
                    _TYPE_HASH,
                    _HASHED_NAME,
                    _HASHED_VERSION
                );
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    typeHash,
                    nameHash,
                    versionHash,
                    block.chainid,
                    address(this)
                )
            );
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash)
        internal
        view
        virtual
        returns (bytes32)
    {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

File 6 of 16: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 7 of 16: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @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 overridden 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 {
        _setApprovalForAll(_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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

    /**
     * @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.
     * - `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 tokenId
    ) internal virtual {}
}

File 8 of 16: ERC721A.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./IERC721Enumerable.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index)
        public
        view
        override
        returns (uint256)
    {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        uint256 curr = tokenId;

        unchecked {
            if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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)
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        if (operator == _msgSender()) revert ApproveToCaller();

        _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 {
        _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 {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (
                    safe &&
                    !_checkOnERC721Received(address(0), to, updatedIndex, _data)
                ) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership
                        .startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership
                        .startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

File 9 of 16: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @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 10 of 16: IERC165.sol
// SPDX-License-Identifier: MIT

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 11 of 16: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 12 of 16: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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 13 of 16: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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 14 of 16: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 15 of 16: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";
/**
 * @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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 16 of 16: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":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":[],"name":"MINT_CALL_HASH_TYPE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSale","outputs":[],"stateMutability":"nonpayable","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":"amountV","type":"uint256"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"goblinHolderMint","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":[],"name":"maxAmountForPerHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeAmountForGoblintownHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","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":"amt","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","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":"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":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxAmountForPerHolders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxFreeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxFreePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setUnrevealedURI","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":[{"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":[],"name":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101206040526115b3600955661c6bf526340000600a55600a600b556107d0600c556002600d55603c600e556002600f556105dc6010553480156200004357600080fd5b506040518060400160405280600b81526020017f476f626c696e20426f79730000000000000000000000000000000000000000008152506040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600b81526020017f476f626c696e20426f79730000000000000000000000000000000000000000008152506040518060400160405280600281526020017f47420000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001349291906200084e565b5080600390805190602001906200014d9291906200084e565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260c081815250508160e081815250504660a08181525050620001b88184846200029760201b60201c565b6080818152505080610100818152505050505050506000620001df620002d360201b60201c565b905080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200029133600a620002db60201b60201c565b62000bc7565b60008383834630604051602001620002b495949392919062000a0f565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b620002fd8282604051806020016040528060008152506200030160201b60201c565b5050565b6200031683838360016200031b60201b60201c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000389576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415620003c5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620003da60008683876200067060201b60201c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156200064b57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015620005fd5750620005fb60008884886200067660201b60201c565b155b1562000635576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505062000578565b5080600081905550506200066960008683876200082560201b60201c565b5050505050565b50505050565b6000620006a48473ffffffffffffffffffffffffffffffffffffffff166200082b60201b6200265b1760201c565b1562000818578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006d6620002d360201b60201c565b8786866040518563ffffffff1660e01b8152600401620006fa9493929190620009bb565b602060405180830381600087803b1580156200071557600080fd5b505af19250505080156200074957506040513d601f19601f8201168201806040525081019062000746919062000915565b60015b620007c7573d80600081146200077c576040519150601f19603f3d011682016040523d82523d6000602084013e62000781565b606091505b50600081511415620007bf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506200081d565b600190505b949350505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546200085c9062000b32565b90600052602060002090601f016020900481019282620008805760008555620008cc565b82601f106200089b57805160ff1916838001178555620008cc565b82800160010185558215620008cc579182015b82811115620008cb578251825591602001919060010190620008ae565b5b509050620008db9190620008df565b5090565b5b80821115620008fa576000816000905550600101620008e0565b5090565b6000815190506200090f8162000bad565b92915050565b6000602082840312156200092e576200092d62000b97565b5b60006200093e84828501620008fe565b91505092915050565b620009528162000a88565b82525050565b620009638162000a9c565b82525050565b6000620009768262000a6c565b62000982818562000a77565b93506200099481856020860162000afc565b6200099f8162000b9c565b840191505092915050565b620009b58162000af2565b82525050565b6000608082019050620009d2600083018762000947565b620009e1602083018662000947565b620009f06040830185620009aa565b818103606083015262000a04818462000969565b905095945050505050565b600060a08201905062000a26600083018862000958565b62000a35602083018762000958565b62000a44604083018662000958565b62000a536060830185620009aa565b62000a62608083018462000947565b9695505050505050565b600081519050919050565b600082825260208201905092915050565b600062000a958262000ad2565b9050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000b1c57808201518184015260208101905062000aff565b8381111562000b2c576000848401525b50505050565b6000600282049050600182168062000b4b57607f821691505b6020821081141562000b625762000b6162000b68565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b62000bb88162000aa6565b811462000bc457600080fd5b50565b60805160a05160c05160e05161010051614c2f62000c0c6000396000612fa001526000612fe201526000612fc101526000612f4d01526000612f750152614c2f6000f3fe6080604052600436106102725760003560e01c80637035bf181161014f578063a7027357116100c1578063d5abeb011161007a578063d5abeb011461090b578063e985e9c514610936578063f2fde38b14610973578063f892c6e21461099c578063f968adbe146109c7578063fe2c7fee146109f257610272565b8063a7027357146107fb578063b88d4fde14610826578063bf71f0a21461084f578063c688387f14610878578063c87b56dd146108a3578063d1239730146108e057610272565b806390b880a01161011357806390b880a01461070e57806391b7f5ed1461073757806395d89b4114610760578063a035b1fe1461078b578063a0712d68146107b6578063a22cb465146107d257610272565b80637035bf181461064d57806370a0823114610678578063715018a6146106b55780637ba5e621146106cc5780638da5cb5b146106e357610272565b80633ce0eab1116101e857806355f804b3116101ac57806355f804b31461053f5780635760cc5d146105685780636352211e146105935780636c0360eb146105d05780636c19e783146105fb5780636d7c4a4b1461062457610272565b80633ce0eab11461045857806342842e0e14610483578063453c2310146104ac5780634f6ccce7146104d7578063518302271461051457610272565b806318160ddd1161023a57806318160ddd1461036e5780631de3c8051461039957806323b872dd146103c45780632f745c59146103ed5780633b84d9c61461042a5780633ccfd60b1461044157610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780630c23bb3f14610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613bb2565b610a1b565b6040516102ab919061416e565b60405180910390f35b3480156102c057600080fd5b506102c9610b65565b6040516102d69190614273565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613c55565b610bf7565b6040516103139190614107565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613b72565b610c73565b005b34801561035157600080fd5b5061036c60048036038101906103679190613c55565b610d7e565b005b34801561037a57600080fd5b50610383610e04565b60405161039091906143f5565b60405180910390f35b3480156103a557600080fd5b506103ae610e12565b6040516103bb91906143f5565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190613a5c565b610e18565b005b3480156103f957600080fd5b50610414600480360381019061040f9190613b72565b610e28565b60405161042191906143f5565b60405180910390f35b34801561043657600080fd5b5061043f611001565b005b34801561044d57600080fd5b506104566110a9565b005b34801561046457600080fd5b5061046d6111d4565b60405161047a91906143f5565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190613a5c565b6111da565b005b3480156104b857600080fd5b506104c16111fa565b6040516104ce91906143f5565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613c55565b611200565b60405161050b91906143f5565b60405180910390f35b34801561052057600080fd5b50610529611345565b604051610536919061416e565b60405180910390f35b34801561054b57600080fd5b5061056660048036038101906105619190613c0c565b611358565b005b34801561057457600080fd5b5061057d6113ee565b60405161058a9190614107565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b59190613c55565b611414565b6040516105c79190614107565b60405180910390f35b3480156105dc57600080fd5b506105e561142a565b6040516105f29190614273565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d91906139ef565b6114b8565b005b34801561063057600080fd5b5061064b60048036038101906106469190613c55565b611578565b005b34801561065957600080fd5b506106626115fe565b60405161066f9190614273565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a91906139ef565b61168c565b6040516106ac91906143f5565b60405180910390f35b3480156106c157600080fd5b506106ca61175c565b005b3480156106d857600080fd5b506106e1611899565b005b3480156106ef57600080fd5b506106f8611941565b6040516107059190614107565b60405180910390f35b34801561071a57600080fd5b5061073560048036038101906107309190613c82565b61196b565b005b34801561074357600080fd5b5061075e60048036038101906107599190613c55565b611be2565b005b34801561076c57600080fd5b50610775611c68565b6040516107829190614273565b60405180910390f35b34801561079757600080fd5b506107a0611cfa565b6040516107ad91906143f5565b60405180910390f35b6107d060048036038101906107cb9190613c55565b611d00565b005b3480156107de57600080fd5b506107f960048036038101906107f49190613b32565b611fc4565b005b34801561080757600080fd5b5061081061213c565b60405161081d91906143f5565b60405180910390f35b34801561083257600080fd5b5061084d60048036038101906108489190613aaf565b612142565b005b34801561085b57600080fd5b5061087660048036038101906108719190613c55565b612195565b005b34801561088457600080fd5b5061088d61221b565b60405161089a9190614189565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c59190613c55565b61223f565b6040516108d79190614273565b60405180910390f35b3480156108ec57600080fd5b506108f5612360565b604051610902919061416e565b60405180910390f35b34801561091757600080fd5b50610920612373565b60405161092d91906143f5565b60405180910390f35b34801561094257600080fd5b5061095d60048036038101906109589190613a1c565b612379565b60405161096a919061416e565b60405180910390f35b34801561097f57600080fd5b5061099a600480360381019061099591906139ef565b61240d565b005b3480156109a857600080fd5b506109b16125b9565b6040516109be91906143f5565b60405180910390f35b3480156109d357600080fd5b506109dc6125bf565b6040516109e991906143f5565b60405180910390f35b3480156109fe57600080fd5b50610a196004803603810190610a149190613c0c565b6125c5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b4e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5e5750610b5d8261267e565b5b9050919050565b606060028054610b74906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba0906146dc565b8015610bed5780601f10610bc257610100808354040283529160200191610bed565b820191906000526020600020905b815481529060010190602001808311610bd057829003601f168201915b5050505050905090565b6000610c02826126e8565b610c38576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7e82611414565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d05612722565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d375750610d3581610d30612722565b612379565b155b15610d6e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d7983838361272a565b505050565b610d86612722565b73ffffffffffffffffffffffffffffffffffffffff16610da4611941565b73ffffffffffffffffffffffffffffffffffffffff1614610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df190614315565b60405180910390fd5b8060108190555050565b600060015460005403905090565b600d5481565b610e238383836127dc565b505050565b6000610e338361168c565b8210610e6b576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054905060008060005b83811015610ff5576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610f545750610fe8565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f9457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fe65786841415610fdd578195505050505050610ffb565b83806001019450505b505b8080600101915050610e77565b50600080fd5b92915050565b611009612722565b73ffffffffffffffffffffffffffffffffffffffff16611027611941565b73ffffffffffffffffffffffffffffffffffffffff161461107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490614315565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b6110b1612722565b73ffffffffffffffffffffffffffffffffffffffff166110cf611941565b73ffffffffffffffffffffffffffffffffffffffff1614611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c90614315565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161114b906140f2565b60006040518083038185875af1925050503d8060008114611188576040519150601f19603f3d011682016040523d82523d6000602084013e61118d565b606091505b50509050806111d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c890614395565b60405180910390fd5b50565b600c5481565b6111f583838360405180602001604052806000815250612142565b505050565b600e5481565b60008060005490506000805b8281101561130d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516112ff57858314156112f65781945050505050611340565b82806001019350505b50808060010191505061120c565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b601160019054906101000a900460ff1681565b611360612722565b73ffffffffffffffffffffffffffffffffffffffff1661137e611941565b73ffffffffffffffffffffffffffffffffffffffff16146113d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cb90614315565b60405180910390fd5b80601290805190602001906113ea9291906137ab565b5050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061141f82612ccd565b600001519050919050565b60128054611437906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611463906146dc565b80156114b05780601f10611485576101008083540402835291602001916114b0565b820191906000526020600020905b81548152906001019060200180831161149357829003601f168201915b505050505081565b6114c0612722565b73ffffffffffffffffffffffffffffffffffffffff166114de611941565b73ffffffffffffffffffffffffffffffffffffffff1614611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b90614315565b60405180910390fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611580612722565b73ffffffffffffffffffffffffffffffffffffffff1661159e611941565b73ffffffffffffffffffffffffffffffffffffffff16146115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb90614315565b60405180910390fd5b80600f8190555050565b6013805461160b906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611637906146dc565b80156116845780601f1061165957610100808354040283529160200191611684565b820191906000526020600020905b81548152906001019060200180831161166757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611764612722565b73ffffffffffffffffffffffffffffffffffffffff16611782611941565b73ffffffffffffffffffffffffffffffffffffffff16146117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf90614315565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6118a1612722565b73ffffffffffffffffffffffffffffffffffffffff166118bf611941565b73ffffffffffffffffffffffffffffffffffffffff1614611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90614315565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050600060f885901c9050600c54600d546014546119ad91906144fa565b106119ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e4906143b5565b60405180910390fd5b60016009546119fc91906144fa565b6001611a06610e04565b611a1091906144fa565b10611a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a47906142d5565b60405180910390fd5b6000611aad611a5d612f49565b7f6ac0707cac0c442e03ae738b183f3fb620ee941711ca779bae1b0422a39331ea3386604051602001611a92939291906141a4565b6040516020818303038152906040528051906020012061300c565b604051602001611abd9190614095565b604051602081830303815290604052805190602001209050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018284888860405160008152602001604052604051611b31949392919061422e565b6020604051602081039080840390855afa158015611b53573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa906142f5565b60405180910390fd5b600d5460146000828254611bc791906144fa565b92505081905550611bda33600d5461303f565b505050505050565b611bea612722565b73ffffffffffffffffffffffffffffffffffffffff16611c08611941565b73ffffffffffffffffffffffffffffffffffffffff1614611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5590614315565b60405180910390fd5b80600a8190555050565b606060038054611c77906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca3906146dc565b8015611cf05780601f10611cc557610100808354040283529160200191611cf0565b820191906000526020600020905b815481529060010190602001808311611cd357829003601f168201915b5050505050905090565b600a5481565b6000600a5490506000600f5483601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d5791906144fa565b11158015611d675750600f548311155b80611da45750611d75611941565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b90508015611db157600091505b8183611dbd9190614581565b341015611dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df690614375565b60405180910390fd5b6001600954611e0e91906144fa565b83611e17610e04565b611e2191906144fa565b10611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e58906142d5565b60405180910390fd5b601160009054906101000a900460ff16611eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea790614335565b60405180910390fd5b6001600b54611ebf91906144fa565b8310611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef7906143d5565b60405180910390fd5b600e5483611f0d3361305d565b611f1791906144fa565b1115611f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4f906142b5565b60405180910390fd5b8015611fb55782601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fad91906144fa565b925050819055505b611fbf338461303f565b505050565b611fcc612722565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612031576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061203e612722565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120eb612722565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612130919061416e565b60405180910390a35050565b600f5481565b61214d8484846127dc565b6121598484848461312d565b61218f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61219d612722565b73ffffffffffffffffffffffffffffffffffffffff166121bb611941565b73ffffffffffffffffffffffffffffffffffffffff1614612211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220890614315565b60405180910390fd5b80600d8190555050565b7f6ac0707cac0c442e03ae738b183f3fb620ee941711ca779bae1b0422a39331ea81565b606061224a826126e8565b612289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228090614355565b60405180910390fd5b601160019054906101000a900460ff1661232d57601380546122aa906146dc565b80601f01602080910402602001604051908101604052809291908181526020018280546122d6906146dc565b80156123235780601f106122f857610100808354040283529160200191612323565b820191906000526020600020905b81548152906001019060200180831161230657829003601f168201915b5050505050612359565b6012612338836132bb565b604051602001612349929190614066565b6040516020818303038152906040525b9050919050565b601160009054906101000a900460ff1681565b60095481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612415612722565b73ffffffffffffffffffffffffffffffffffffffff16612433611941565b73ffffffffffffffffffffffffffffffffffffffff1614612489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248090614315565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f090614295565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b600b5481565b6125cd612722565b73ffffffffffffffffffffffffffffffffffffffff166125eb611941565b73ffffffffffffffffffffffffffffffffffffffff1614612641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263890614315565b60405180910390fd5b80601390805190602001906126579291906137ab565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080548210801561271b575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006127e782612ccd565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661280e612722565b73ffffffffffffffffffffffffffffffffffffffff1614806128415750612840826000015161283b612722565b612379565b5b80612886575061284f612722565b73ffffffffffffffffffffffffffffffffffffffff1661286e84610bf7565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806128bf576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612928576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561298f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61299c858585600161341c565b6129ac600084846000015161272a565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c5d57600054811015612c5c5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cc68585856001613422565b5050505050565b612cd5613831565b6000829050600054811015612f12576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612f1057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612df4578092505050612f44565b5b600115612f0f57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f0a578092505050612f44565b612df5565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60007f0000000000000000000000000000000000000000000000000000000000000000461415612f9b577f00000000000000000000000000000000000000000000000000000000000000009050613009565b6130067f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613428565b90505b90565b600082826040516020016130219291906140bb565b60405160208183030381529060405280519060200120905092915050565b613059828260405180602001604052806000815250613462565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130c5576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600061314e8473ffffffffffffffffffffffffffffffffffffffff1661265b565b156132ae578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613177612722565b8786866040518563ffffffff1660e01b81526004016131999493929190614122565b602060405180830381600087803b1580156131b357600080fd5b505af19250505080156131e457506040513d601f19601f820116820180604052508101906131e19190613bdf565b60015b61325e573d8060008114613214576040519150601f19603f3d011682016040523d82523d6000602084013e613219565b606091505b50600081511415613256576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132b3565b600190505b949350505050565b60606000821415613303576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613417565b600082905060005b6000821461333557808061331e9061473f565b915050600a8261332e9190614550565b915061330b565b60008167ffffffffffffffff8111156133515761335061487f565b5b6040519080825280601f01601f1916602001820160405280156133835781602001600182028036833780820191505090505b5090505b600085146134105760018261339c91906145db565b9150600a856133ab9190614792565b60306133b791906144fa565b60f81b8183815181106133cd576133cc614850565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134099190614550565b9450613387565b8093505050505b919050565b50505050565b50505050565b600083838346306040516020016134439594939291906141db565b6040516020818303038152906040528051906020012090509392505050565b61346f8383836001613474565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156134e1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561351c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613529600086838761341c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561378e57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156137425750613740600088848861312d565b155b15613779576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506136c7565b5080600081905550506137a46000868387613422565b5050505050565b8280546137b7906146dc565b90600052602060002090601f0160209004810192826137d95760008555613820565b82601f106137f257805160ff1916838001178555613820565b82800160010185558215613820579182015b8281111561381f578251825591602001919060010190613804565b5b50905061382d9190613874565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561388d576000816000905550600101613875565b5090565b60006138a461389f84614435565b614410565b9050828152602081018484840111156138c0576138bf6148b3565b5b6138cb84828561469a565b509392505050565b60006138e66138e184614466565b614410565b905082815260208101848484011115613902576139016148b3565b5b61390d84828561469a565b509392505050565b60008135905061392481614b86565b92915050565b60008135905061393981614b9d565b92915050565b60008135905061394e81614bb4565b92915050565b60008135905061396381614bcb565b92915050565b60008151905061397881614bcb565b92915050565b600082601f830112613993576139926148ae565b5b81356139a3848260208601613891565b91505092915050565b600082601f8301126139c1576139c06148ae565b5b81356139d18482602086016138d3565b91505092915050565b6000813590506139e981614be2565b92915050565b600060208284031215613a0557613a046148bd565b5b6000613a1384828501613915565b91505092915050565b60008060408385031215613a3357613a326148bd565b5b6000613a4185828601613915565b9250506020613a5285828601613915565b9150509250929050565b600080600060608486031215613a7557613a746148bd565b5b6000613a8386828701613915565b9350506020613a9486828701613915565b9250506040613aa5868287016139da565b9150509250925092565b60008060008060808587031215613ac957613ac86148bd565b5b6000613ad787828801613915565b9450506020613ae887828801613915565b9350506040613af9878288016139da565b925050606085013567ffffffffffffffff811115613b1a57613b196148b8565b5b613b268782880161397e565b91505092959194509250565b60008060408385031215613b4957613b486148bd565b5b6000613b5785828601613915565b9250506020613b688582860161392a565b9150509250929050565b60008060408385031215613b8957613b886148bd565b5b6000613b9785828601613915565b9250506020613ba8858286016139da565b9150509250929050565b600060208284031215613bc857613bc76148bd565b5b6000613bd684828501613954565b91505092915050565b600060208284031215613bf557613bf46148bd565b5b6000613c0384828501613969565b91505092915050565b600060208284031215613c2257613c216148bd565b5b600082013567ffffffffffffffff811115613c4057613c3f6148b8565b5b613c4c848285016139ac565b91505092915050565b600060208284031215613c6b57613c6a6148bd565b5b6000613c79848285016139da565b91505092915050565b600080600060608486031215613c9b57613c9a6148bd565b5b6000613ca9868287016139da565b9350506020613cba8682870161393f565b9250506040613ccb8682870161393f565b9150509250925092565b613cde8161460f565b82525050565b613ced81614621565b82525050565b613cfc8161462d565b82525050565b613d13613d0e8261462d565b614788565b82525050565b6000613d24826144ac565b613d2e81856144c2565b9350613d3e8185602086016146a9565b613d47816148c2565b840191505092915050565b6000613d5d826144b7565b613d6781856144de565b9350613d778185602086016146a9565b613d80816148c2565b840191505092915050565b6000613d96826144b7565b613da081856144ef565b9350613db08185602086016146a9565b80840191505092915050565b60008154613dc9816146dc565b613dd381866144ef565b94506001821660008114613dee5760018114613dff57613e32565b60ff19831686528186019350613e32565b613e0885614497565b60005b83811015613e2a57815481890152600182019150602081019050613e0b565b838801955050505b50505092915050565b6000613e48601c836144ef565b9150613e53826148d3565b601c82019050919050565b6000613e6b6026836144de565b9150613e76826148fc565b604082019050919050565b6000613e8e6002836144ef565b9150613e998261494b565b600282019050919050565b6000613eb16014836144de565b9150613ebc82614974565b602082019050919050565b6000613ed46013836144de565b9150613edf8261499d565b602082019050919050565b6000613ef7600e836144de565b9150613f02826149c6565b602082019050919050565b6000613f1a6005836144ef565b9150613f25826149ef565b600582019050919050565b6000613f3d6020836144de565b9150613f4882614a18565b602082019050919050565b6000613f606018836144de565b9150613f6b82614a41565b602082019050919050565b6000613f83602f836144de565b9150613f8e82614a6a565b604082019050919050565b6000613fa6601d836144de565b9150613fb182614ab9565b602082019050919050565b6000613fc96000836144d3565b9150613fd482614ae2565b600082019050919050565b6000613fec6010836144de565b9150613ff782614ae5565b602082019050919050565b600061400f6024836144de565b915061401a82614b0e565b604082019050919050565b60006140326013836144de565b915061403d82614b5d565b602082019050919050565b61405181614683565b82525050565b6140608161468d565b82525050565b60006140728285613dbc565b915061407e8284613d8b565b915061408982613f0d565b91508190509392505050565b60006140a082613e3b565b91506140ac8284613d02565b60208201915081905092915050565b60006140c682613e81565b91506140d28285613d02565b6020820191506140e28284613d02565b6020820191508190509392505050565b60006140fd82613fbc565b9150819050919050565b600060208201905061411c6000830184613cd5565b92915050565b60006080820190506141376000830187613cd5565b6141446020830186613cd5565b6141516040830185614048565b81810360608301526141638184613d19565b905095945050505050565b60006020820190506141836000830184613ce4565b92915050565b600060208201905061419e6000830184613cf3565b92915050565b60006060820190506141b96000830186613cf3565b6141c66020830185613cd5565b6141d36040830184614048565b949350505050565b600060a0820190506141f06000830188613cf3565b6141fd6020830187613cf3565b61420a6040830186613cf3565b6142176060830185614048565b6142246080830184613cd5565b9695505050505050565b60006080820190506142436000830187613cf3565b6142506020830186614057565b61425d6040830185613cf3565b61426a6060830184613cf3565b95945050505050565b6000602082019050818103600083015261428d8184613d52565b905092915050565b600060208201905081810360008301526142ae81613e5e565b9050919050565b600060208201905081810360008301526142ce81613ea4565b9050919050565b600060208201905081810360008301526142ee81613ec7565b9050919050565b6000602082019050818103600083015261430e81613eea565b9050919050565b6000602082019050818103600083015261432e81613f30565b9050919050565b6000602082019050818103600083015261434e81613f53565b9050919050565b6000602082019050818103600083015261436e81613f76565b9050919050565b6000602082019050818103600083015261438e81613f99565b9050919050565b600060208201905081810360008301526143ae81613fdf565b9050919050565b600060208201905081810360008301526143ce81614002565b9050919050565b600060208201905081810360008301526143ee81614025565b9050919050565b600060208201905061440a6000830184614048565b92915050565b600061441a61442b565b9050614426828261470e565b919050565b6000604051905090565b600067ffffffffffffffff8211156144505761444f61487f565b5b614459826148c2565b9050602081019050919050565b600067ffffffffffffffff8211156144815761448061487f565b5b61448a826148c2565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061450582614683565b915061451083614683565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614545576145446147c3565b5b828201905092915050565b600061455b82614683565b915061456683614683565b925082614576576145756147f2565b5b828204905092915050565b600061458c82614683565b915061459783614683565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145d0576145cf6147c3565b5b828202905092915050565b60006145e682614683565b91506145f183614683565b925082821015614604576146036147c3565b5b828203905092915050565b600061461a82614663565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156146c75780820151818401526020810190506146ac565b838111156146d6576000848401525b50505050565b600060028204905060018216806146f457607f821691505b6020821081141561470857614707614821565b5b50919050565b614717826148c2565b810181811067ffffffffffffffff821117156147365761473561487f565b5b80604052505050565b600061474a82614683565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561477d5761477c6147c3565b5b600182019050919050565b6000819050919050565b600061479d82614683565b91506147a883614683565b9250826147b8576147b76147f2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f546f6f206d616e79207065722077616c6c657421000000000000000000000000600082015250565b7f4e6f206d6f726520476f626c696e20426f797300000000000000000000000000600082015250565b7f496e76616c6964207369676e6572000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d696e74696e67206973206e6f74206c697665207965742e0000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e6f206d6f7265206672656520476f626c696e20426f797320666f7220686f6c60008201527f6465727300000000000000000000000000000000000000000000000000000000602082015250565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b614b8f8161460f565b8114614b9a57600080fd5b50565b614ba681614621565b8114614bb157600080fd5b50565b614bbd8161462d565b8114614bc857600080fd5b50565b614bd481614637565b8114614bdf57600080fd5b50565b614beb81614683565b8114614bf657600080fd5b5056fea26469706673582212202fe6a5cb6ad4cc99f50d3e9c743df3522b1d0c555056e1fa4881a4c90010bf6664736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102725760003560e01c80637035bf181161014f578063a7027357116100c1578063d5abeb011161007a578063d5abeb011461090b578063e985e9c514610936578063f2fde38b14610973578063f892c6e21461099c578063f968adbe146109c7578063fe2c7fee146109f257610272565b8063a7027357146107fb578063b88d4fde14610826578063bf71f0a21461084f578063c688387f14610878578063c87b56dd146108a3578063d1239730146108e057610272565b806390b880a01161011357806390b880a01461070e57806391b7f5ed1461073757806395d89b4114610760578063a035b1fe1461078b578063a0712d68146107b6578063a22cb465146107d257610272565b80637035bf181461064d57806370a0823114610678578063715018a6146106b55780637ba5e621146106cc5780638da5cb5b146106e357610272565b80633ce0eab1116101e857806355f804b3116101ac57806355f804b31461053f5780635760cc5d146105685780636352211e146105935780636c0360eb146105d05780636c19e783146105fb5780636d7c4a4b1461062457610272565b80633ce0eab11461045857806342842e0e14610483578063453c2310146104ac5780634f6ccce7146104d7578063518302271461051457610272565b806318160ddd1161023a57806318160ddd1461036e5780631de3c8051461039957806323b872dd146103c45780632f745c59146103ed5780633b84d9c61461042a5780633ccfd60b1461044157610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780630c23bb3f14610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613bb2565b610a1b565b6040516102ab919061416e565b60405180910390f35b3480156102c057600080fd5b506102c9610b65565b6040516102d69190614273565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613c55565b610bf7565b6040516103139190614107565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613b72565b610c73565b005b34801561035157600080fd5b5061036c60048036038101906103679190613c55565b610d7e565b005b34801561037a57600080fd5b50610383610e04565b60405161039091906143f5565b60405180910390f35b3480156103a557600080fd5b506103ae610e12565b6040516103bb91906143f5565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190613a5c565b610e18565b005b3480156103f957600080fd5b50610414600480360381019061040f9190613b72565b610e28565b60405161042191906143f5565b60405180910390f35b34801561043657600080fd5b5061043f611001565b005b34801561044d57600080fd5b506104566110a9565b005b34801561046457600080fd5b5061046d6111d4565b60405161047a91906143f5565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190613a5c565b6111da565b005b3480156104b857600080fd5b506104c16111fa565b6040516104ce91906143f5565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613c55565b611200565b60405161050b91906143f5565b60405180910390f35b34801561052057600080fd5b50610529611345565b604051610536919061416e565b60405180910390f35b34801561054b57600080fd5b5061056660048036038101906105619190613c0c565b611358565b005b34801561057457600080fd5b5061057d6113ee565b60405161058a9190614107565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b59190613c55565b611414565b6040516105c79190614107565b60405180910390f35b3480156105dc57600080fd5b506105e561142a565b6040516105f29190614273565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d91906139ef565b6114b8565b005b34801561063057600080fd5b5061064b60048036038101906106469190613c55565b611578565b005b34801561065957600080fd5b506106626115fe565b60405161066f9190614273565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a91906139ef565b61168c565b6040516106ac91906143f5565b60405180910390f35b3480156106c157600080fd5b506106ca61175c565b005b3480156106d857600080fd5b506106e1611899565b005b3480156106ef57600080fd5b506106f8611941565b6040516107059190614107565b60405180910390f35b34801561071a57600080fd5b5061073560048036038101906107309190613c82565b61196b565b005b34801561074357600080fd5b5061075e60048036038101906107599190613c55565b611be2565b005b34801561076c57600080fd5b50610775611c68565b6040516107829190614273565b60405180910390f35b34801561079757600080fd5b506107a0611cfa565b6040516107ad91906143f5565b60405180910390f35b6107d060048036038101906107cb9190613c55565b611d00565b005b3480156107de57600080fd5b506107f960048036038101906107f49190613b32565b611fc4565b005b34801561080757600080fd5b5061081061213c565b60405161081d91906143f5565b60405180910390f35b34801561083257600080fd5b5061084d60048036038101906108489190613aaf565b612142565b005b34801561085b57600080fd5b5061087660048036038101906108719190613c55565b612195565b005b34801561088457600080fd5b5061088d61221b565b60405161089a9190614189565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c59190613c55565b61223f565b6040516108d79190614273565b60405180910390f35b3480156108ec57600080fd5b506108f5612360565b604051610902919061416e565b60405180910390f35b34801561091757600080fd5b50610920612373565b60405161092d91906143f5565b60405180910390f35b34801561094257600080fd5b5061095d60048036038101906109589190613a1c565b612379565b60405161096a919061416e565b60405180910390f35b34801561097f57600080fd5b5061099a600480360381019061099591906139ef565b61240d565b005b3480156109a857600080fd5b506109b16125b9565b6040516109be91906143f5565b60405180910390f35b3480156109d357600080fd5b506109dc6125bf565b6040516109e991906143f5565b60405180910390f35b3480156109fe57600080fd5b50610a196004803603810190610a149190613c0c565b6125c5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b4e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5e5750610b5d8261267e565b5b9050919050565b606060028054610b74906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba0906146dc565b8015610bed5780601f10610bc257610100808354040283529160200191610bed565b820191906000526020600020905b815481529060010190602001808311610bd057829003601f168201915b5050505050905090565b6000610c02826126e8565b610c38576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7e82611414565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d05612722565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d375750610d3581610d30612722565b612379565b155b15610d6e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d7983838361272a565b505050565b610d86612722565b73ffffffffffffffffffffffffffffffffffffffff16610da4611941565b73ffffffffffffffffffffffffffffffffffffffff1614610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df190614315565b60405180910390fd5b8060108190555050565b600060015460005403905090565b600d5481565b610e238383836127dc565b505050565b6000610e338361168c565b8210610e6b576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054905060008060005b83811015610ff5576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610f545750610fe8565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f9457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fe65786841415610fdd578195505050505050610ffb565b83806001019450505b505b8080600101915050610e77565b50600080fd5b92915050565b611009612722565b73ffffffffffffffffffffffffffffffffffffffff16611027611941565b73ffffffffffffffffffffffffffffffffffffffff161461107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490614315565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b6110b1612722565b73ffffffffffffffffffffffffffffffffffffffff166110cf611941565b73ffffffffffffffffffffffffffffffffffffffff1614611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c90614315565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161114b906140f2565b60006040518083038185875af1925050503d8060008114611188576040519150601f19603f3d011682016040523d82523d6000602084013e61118d565b606091505b50509050806111d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c890614395565b60405180910390fd5b50565b600c5481565b6111f583838360405180602001604052806000815250612142565b505050565b600e5481565b60008060005490506000805b8281101561130d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516112ff57858314156112f65781945050505050611340565b82806001019350505b50808060010191505061120c565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b601160019054906101000a900460ff1681565b611360612722565b73ffffffffffffffffffffffffffffffffffffffff1661137e611941565b73ffffffffffffffffffffffffffffffffffffffff16146113d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cb90614315565b60405180910390fd5b80601290805190602001906113ea9291906137ab565b5050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061141f82612ccd565b600001519050919050565b60128054611437906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611463906146dc565b80156114b05780601f10611485576101008083540402835291602001916114b0565b820191906000526020600020905b81548152906001019060200180831161149357829003601f168201915b505050505081565b6114c0612722565b73ffffffffffffffffffffffffffffffffffffffff166114de611941565b73ffffffffffffffffffffffffffffffffffffffff1614611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b90614315565b60405180910390fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611580612722565b73ffffffffffffffffffffffffffffffffffffffff1661159e611941565b73ffffffffffffffffffffffffffffffffffffffff16146115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb90614315565b60405180910390fd5b80600f8190555050565b6013805461160b906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611637906146dc565b80156116845780601f1061165957610100808354040283529160200191611684565b820191906000526020600020905b81548152906001019060200180831161166757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611764612722565b73ffffffffffffffffffffffffffffffffffffffff16611782611941565b73ffffffffffffffffffffffffffffffffffffffff16146117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf90614315565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6118a1612722565b73ffffffffffffffffffffffffffffffffffffffff166118bf611941565b73ffffffffffffffffffffffffffffffffffffffff1614611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90614315565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050600060f885901c9050600c54600d546014546119ad91906144fa565b106119ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e4906143b5565b60405180910390fd5b60016009546119fc91906144fa565b6001611a06610e04565b611a1091906144fa565b10611a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a47906142d5565b60405180910390fd5b6000611aad611a5d612f49565b7f6ac0707cac0c442e03ae738b183f3fb620ee941711ca779bae1b0422a39331ea3386604051602001611a92939291906141a4565b6040516020818303038152906040528051906020012061300c565b604051602001611abd9190614095565b604051602081830303815290604052805190602001209050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018284888860405160008152602001604052604051611b31949392919061422e565b6020604051602081039080840390855afa158015611b53573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa906142f5565b60405180910390fd5b600d5460146000828254611bc791906144fa565b92505081905550611bda33600d5461303f565b505050505050565b611bea612722565b73ffffffffffffffffffffffffffffffffffffffff16611c08611941565b73ffffffffffffffffffffffffffffffffffffffff1614611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5590614315565b60405180910390fd5b80600a8190555050565b606060038054611c77906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca3906146dc565b8015611cf05780601f10611cc557610100808354040283529160200191611cf0565b820191906000526020600020905b815481529060010190602001808311611cd357829003601f168201915b5050505050905090565b600a5481565b6000600a5490506000600f5483601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d5791906144fa565b11158015611d675750600f548311155b80611da45750611d75611941565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b90508015611db157600091505b8183611dbd9190614581565b341015611dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df690614375565b60405180910390fd5b6001600954611e0e91906144fa565b83611e17610e04565b611e2191906144fa565b10611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e58906142d5565b60405180910390fd5b601160009054906101000a900460ff16611eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea790614335565b60405180910390fd5b6001600b54611ebf91906144fa565b8310611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef7906143d5565b60405180910390fd5b600e5483611f0d3361305d565b611f1791906144fa565b1115611f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4f906142b5565b60405180910390fd5b8015611fb55782601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fad91906144fa565b925050819055505b611fbf338461303f565b505050565b611fcc612722565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612031576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061203e612722565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120eb612722565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612130919061416e565b60405180910390a35050565b600f5481565b61214d8484846127dc565b6121598484848461312d565b61218f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61219d612722565b73ffffffffffffffffffffffffffffffffffffffff166121bb611941565b73ffffffffffffffffffffffffffffffffffffffff1614612211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220890614315565b60405180910390fd5b80600d8190555050565b7f6ac0707cac0c442e03ae738b183f3fb620ee941711ca779bae1b0422a39331ea81565b606061224a826126e8565b612289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228090614355565b60405180910390fd5b601160019054906101000a900460ff1661232d57601380546122aa906146dc565b80601f01602080910402602001604051908101604052809291908181526020018280546122d6906146dc565b80156123235780601f106122f857610100808354040283529160200191612323565b820191906000526020600020905b81548152906001019060200180831161230657829003601f168201915b5050505050612359565b6012612338836132bb565b604051602001612349929190614066565b6040516020818303038152906040525b9050919050565b601160009054906101000a900460ff1681565b60095481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612415612722565b73ffffffffffffffffffffffffffffffffffffffff16612433611941565b73ffffffffffffffffffffffffffffffffffffffff1614612489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248090614315565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f090614295565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b600b5481565b6125cd612722565b73ffffffffffffffffffffffffffffffffffffffff166125eb611941565b73ffffffffffffffffffffffffffffffffffffffff1614612641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263890614315565b60405180910390fd5b80601390805190602001906126579291906137ab565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080548210801561271b575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006127e782612ccd565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661280e612722565b73ffffffffffffffffffffffffffffffffffffffff1614806128415750612840826000015161283b612722565b612379565b5b80612886575061284f612722565b73ffffffffffffffffffffffffffffffffffffffff1661286e84610bf7565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806128bf576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612928576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561298f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61299c858585600161341c565b6129ac600084846000015161272a565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c5d57600054811015612c5c5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cc68585856001613422565b5050505050565b612cd5613831565b6000829050600054811015612f12576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612f1057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612df4578092505050612f44565b5b600115612f0f57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f0a578092505050612f44565b612df5565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60007f0000000000000000000000000000000000000000000000000000000000000001461415612f9b577fd3f6002cc223a07f5b1a38963173c0c162d8e0843b3b52b6551bb65c43d74ae19050613009565b6130067f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f3cf49be14ac7878f6c747e97f83edc511ece97723e8674d48634ca06a6bcf4187fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6613428565b90505b90565b600082826040516020016130219291906140bb565b60405160208183030381529060405280519060200120905092915050565b613059828260405180602001604052806000815250613462565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130c5576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600061314e8473ffffffffffffffffffffffffffffffffffffffff1661265b565b156132ae578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613177612722565b8786866040518563ffffffff1660e01b81526004016131999493929190614122565b602060405180830381600087803b1580156131b357600080fd5b505af19250505080156131e457506040513d601f19601f820116820180604052508101906131e19190613bdf565b60015b61325e573d8060008114613214576040519150601f19603f3d011682016040523d82523d6000602084013e613219565b606091505b50600081511415613256576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132b3565b600190505b949350505050565b60606000821415613303576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613417565b600082905060005b6000821461333557808061331e9061473f565b915050600a8261332e9190614550565b915061330b565b60008167ffffffffffffffff8111156133515761335061487f565b5b6040519080825280601f01601f1916602001820160405280156133835781602001600182028036833780820191505090505b5090505b600085146134105760018261339c91906145db565b9150600a856133ab9190614792565b60306133b791906144fa565b60f81b8183815181106133cd576133cc614850565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134099190614550565b9450613387565b8093505050505b919050565b50505050565b50505050565b600083838346306040516020016134439594939291906141db565b6040516020818303038152906040528051906020012090509392505050565b61346f8383836001613474565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156134e1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561351c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613529600086838761341c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561378e57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156137425750613740600088848861312d565b155b15613779576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506136c7565b5080600081905550506137a46000868387613422565b5050505050565b8280546137b7906146dc565b90600052602060002090601f0160209004810192826137d95760008555613820565b82601f106137f257805160ff1916838001178555613820565b82800160010185558215613820579182015b8281111561381f578251825591602001919060010190613804565b5b50905061382d9190613874565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561388d576000816000905550600101613875565b5090565b60006138a461389f84614435565b614410565b9050828152602081018484840111156138c0576138bf6148b3565b5b6138cb84828561469a565b509392505050565b60006138e66138e184614466565b614410565b905082815260208101848484011115613902576139016148b3565b5b61390d84828561469a565b509392505050565b60008135905061392481614b86565b92915050565b60008135905061393981614b9d565b92915050565b60008135905061394e81614bb4565b92915050565b60008135905061396381614bcb565b92915050565b60008151905061397881614bcb565b92915050565b600082601f830112613993576139926148ae565b5b81356139a3848260208601613891565b91505092915050565b600082601f8301126139c1576139c06148ae565b5b81356139d18482602086016138d3565b91505092915050565b6000813590506139e981614be2565b92915050565b600060208284031215613a0557613a046148bd565b5b6000613a1384828501613915565b91505092915050565b60008060408385031215613a3357613a326148bd565b5b6000613a4185828601613915565b9250506020613a5285828601613915565b9150509250929050565b600080600060608486031215613a7557613a746148bd565b5b6000613a8386828701613915565b9350506020613a9486828701613915565b9250506040613aa5868287016139da565b9150509250925092565b60008060008060808587031215613ac957613ac86148bd565b5b6000613ad787828801613915565b9450506020613ae887828801613915565b9350506040613af9878288016139da565b925050606085013567ffffffffffffffff811115613b1a57613b196148b8565b5b613b268782880161397e565b91505092959194509250565b60008060408385031215613b4957613b486148bd565b5b6000613b5785828601613915565b9250506020613b688582860161392a565b9150509250929050565b60008060408385031215613b8957613b886148bd565b5b6000613b9785828601613915565b9250506020613ba8858286016139da565b9150509250929050565b600060208284031215613bc857613bc76148bd565b5b6000613bd684828501613954565b91505092915050565b600060208284031215613bf557613bf46148bd565b5b6000613c0384828501613969565b91505092915050565b600060208284031215613c2257613c216148bd565b5b600082013567ffffffffffffffff811115613c4057613c3f6148b8565b5b613c4c848285016139ac565b91505092915050565b600060208284031215613c6b57613c6a6148bd565b5b6000613c79848285016139da565b91505092915050565b600080600060608486031215613c9b57613c9a6148bd565b5b6000613ca9868287016139da565b9350506020613cba8682870161393f565b9250506040613ccb8682870161393f565b9150509250925092565b613cde8161460f565b82525050565b613ced81614621565b82525050565b613cfc8161462d565b82525050565b613d13613d0e8261462d565b614788565b82525050565b6000613d24826144ac565b613d2e81856144c2565b9350613d3e8185602086016146a9565b613d47816148c2565b840191505092915050565b6000613d5d826144b7565b613d6781856144de565b9350613d778185602086016146a9565b613d80816148c2565b840191505092915050565b6000613d96826144b7565b613da081856144ef565b9350613db08185602086016146a9565b80840191505092915050565b60008154613dc9816146dc565b613dd381866144ef565b94506001821660008114613dee5760018114613dff57613e32565b60ff19831686528186019350613e32565b613e0885614497565b60005b83811015613e2a57815481890152600182019150602081019050613e0b565b838801955050505b50505092915050565b6000613e48601c836144ef565b9150613e53826148d3565b601c82019050919050565b6000613e6b6026836144de565b9150613e76826148fc565b604082019050919050565b6000613e8e6002836144ef565b9150613e998261494b565b600282019050919050565b6000613eb16014836144de565b9150613ebc82614974565b602082019050919050565b6000613ed46013836144de565b9150613edf8261499d565b602082019050919050565b6000613ef7600e836144de565b9150613f02826149c6565b602082019050919050565b6000613f1a6005836144ef565b9150613f25826149ef565b600582019050919050565b6000613f3d6020836144de565b9150613f4882614a18565b602082019050919050565b6000613f606018836144de565b9150613f6b82614a41565b602082019050919050565b6000613f83602f836144de565b9150613f8e82614a6a565b604082019050919050565b6000613fa6601d836144de565b9150613fb182614ab9565b602082019050919050565b6000613fc96000836144d3565b9150613fd482614ae2565b600082019050919050565b6000613fec6010836144de565b9150613ff782614ae5565b602082019050919050565b600061400f6024836144de565b915061401a82614b0e565b604082019050919050565b60006140326013836144de565b915061403d82614b5d565b602082019050919050565b61405181614683565b82525050565b6140608161468d565b82525050565b60006140728285613dbc565b915061407e8284613d8b565b915061408982613f0d565b91508190509392505050565b60006140a082613e3b565b91506140ac8284613d02565b60208201915081905092915050565b60006140c682613e81565b91506140d28285613d02565b6020820191506140e28284613d02565b6020820191508190509392505050565b60006140fd82613fbc565b9150819050919050565b600060208201905061411c6000830184613cd5565b92915050565b60006080820190506141376000830187613cd5565b6141446020830186613cd5565b6141516040830185614048565b81810360608301526141638184613d19565b905095945050505050565b60006020820190506141836000830184613ce4565b92915050565b600060208201905061419e6000830184613cf3565b92915050565b60006060820190506141b96000830186613cf3565b6141c66020830185613cd5565b6141d36040830184614048565b949350505050565b600060a0820190506141f06000830188613cf3565b6141fd6020830187613cf3565b61420a6040830186613cf3565b6142176060830185614048565b6142246080830184613cd5565b9695505050505050565b60006080820190506142436000830187613cf3565b6142506020830186614057565b61425d6040830185613cf3565b61426a6060830184613cf3565b95945050505050565b6000602082019050818103600083015261428d8184613d52565b905092915050565b600060208201905081810360008301526142ae81613e5e565b9050919050565b600060208201905081810360008301526142ce81613ea4565b9050919050565b600060208201905081810360008301526142ee81613ec7565b9050919050565b6000602082019050818103600083015261430e81613eea565b9050919050565b6000602082019050818103600083015261432e81613f30565b9050919050565b6000602082019050818103600083015261434e81613f53565b9050919050565b6000602082019050818103600083015261436e81613f76565b9050919050565b6000602082019050818103600083015261438e81613f99565b9050919050565b600060208201905081810360008301526143ae81613fdf565b9050919050565b600060208201905081810360008301526143ce81614002565b9050919050565b600060208201905081810360008301526143ee81614025565b9050919050565b600060208201905061440a6000830184614048565b92915050565b600061441a61442b565b9050614426828261470e565b919050565b6000604051905090565b600067ffffffffffffffff8211156144505761444f61487f565b5b614459826148c2565b9050602081019050919050565b600067ffffffffffffffff8211156144815761448061487f565b5b61448a826148c2565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061450582614683565b915061451083614683565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614545576145446147c3565b5b828201905092915050565b600061455b82614683565b915061456683614683565b925082614576576145756147f2565b5b828204905092915050565b600061458c82614683565b915061459783614683565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145d0576145cf6147c3565b5b828202905092915050565b60006145e682614683565b91506145f183614683565b925082821015614604576146036147c3565b5b828203905092915050565b600061461a82614663565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156146c75780820151818401526020810190506146ac565b838111156146d6576000848401525b50505050565b600060028204905060018216806146f457607f821691505b6020821081141561470857614707614821565b5b50919050565b614717826148c2565b810181811067ffffffffffffffff821117156147365761473561487f565b5b80604052505050565b600061474a82614683565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561477d5761477c6147c3565b5b600182019050919050565b6000819050919050565b600061479d82614683565b91506147a883614683565b9250826147b8576147b76147f2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f546f6f206d616e79207065722077616c6c657421000000000000000000000000600082015250565b7f4e6f206d6f726520476f626c696e20426f797300000000000000000000000000600082015250565b7f496e76616c6964207369676e6572000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d696e74696e67206973206e6f74206c697665207965742e0000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e6f206d6f7265206672656520476f626c696e20426f797320666f7220686f6c60008201527f6465727300000000000000000000000000000000000000000000000000000000602082015250565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b614b8f8161460f565b8114614b9a57600080fd5b50565b614ba681614621565b8114614bb157600080fd5b50565b614bbd8161462d565b8114614bc857600080fd5b50565b614bd481614637565b8114614bdf57600080fd5b50565b614beb81614683565b8114614bf657600080fd5b5056fea26469706673582212202fe6a5cb6ad4cc99f50d3e9c743df3522b1d0c555056e1fa4881a4c90010bf6664736f6c63430008070033

Deployed Bytecode Sourcemap

129:4373:15:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6016:410:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8629:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10173:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9750:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3779:102:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3248:278:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;391:41:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11104:164:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4836:1113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4215:78:15;;;;;;;;;;;;;:::i;:::-;;4299:201;;;;;;;;;;;;;:::i;:::-;;329:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11334:179:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;439:32:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3812:731:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;592:20:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3396:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;883:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8445:122:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;619:21:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3488:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3887:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;647:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6485:203:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1693:145:13;;;;;;;;;;;;;:::i;:::-;;4127:82:15;;;;;;;;;;;;;:::i;:::-;;1061:85:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1853:1010:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3683:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8791:102:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;253:34:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1030:817;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10476:294:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;478:35:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11579:332:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4001:120:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;772:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2981:409;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;562:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;215:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10836:206:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1987:240:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;520:35:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;294:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3579:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6016:410:6;6158:4;6212:25;6197:40;;;:11;:40;;;;:104;;;;6268:33;6253:48;;;:11;:48;;;;6197:104;:170;;;;6332:35;6317:50;;;:11;:50;;;;6197:170;:222;;;;6383:36;6407:11;6383:23;:36::i;:::-;6197:222;6178:241;;6016:410;;;:::o;8629:98::-;8683:13;8715:5;8708:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8629:98;:::o;10173:236::-;10273:7;10301:16;10309:7;10301;:16::i;:::-;10296:64;;10326:34;;;;;;;;;;;;;;10296:64;10378:15;:24;10394:7;10378:24;;;;;;;;;;;;;;;;;;;;;10371:31;;10173:236;;;:::o;9750:362::-;9822:13;9838:24;9854:7;9838:15;:24::i;:::-;9822:40;;9882:5;9876:11;;:2;:11;;;9872:48;;;9896:24;;;;;;;;;;;;;;9872:48;9951:5;9935:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;9961:37;9978:5;9985:12;:10;:12::i;:::-;9961:16;:37::i;:::-;9960:38;9935:63;9931:136;;;10021:35;;;;;;;;;;;;;;9931:136;10077:28;10086:2;10090:7;10099:5;10077:8;:28::i;:::-;9812:300;9750:362;;:::o;3779:102:15:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3867:7:15::1;3851:13;:23;;;;3779:102:::0;:::o;3248:278:6:-;3309:7;3497:12;;3481:13;;:28;3474:35;;3248:278;:::o;391:41:15:-;;;;:::o;11104:164:6:-;11233:28;11243:4;11249:2;11253:7;11233:9;:28::i;:::-;11104:164;;;:::o;4836:1113::-;4957:7;4993:16;5003:5;4993:9;:16::i;:::-;4984:5;:25;4980:61;;5018:23;;;;;;;;;;;;;;4980:61;5051:22;5076:13;;5051:38;;5099:19;5128:25;5324:9;5319:543;5339:14;5335:1;:18;5319:543;;;5378:31;5412:11;:14;5424:1;5412:14;;;;;;;;;;;5378:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5448:9;:16;;;5444:71;;;5488:8;;;5444:71;5562:1;5536:28;;:9;:14;;;:28;;;5532:109;;5608:9;:14;;;5588:34;;5532:109;5683:5;5662:26;;:17;:26;;;5658:190;;;5731:5;5716:11;:20;5712:83;;;5771:1;5764:8;;;;;;;;;5712:83;5816:13;;;;;;;5658:190;5360:502;5319:543;5355:3;;;;;;;5319:543;;;;5934:8;;;4836:1113;;;;;:::o;4215:78:15:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4278:8:15::1;;;;;;;;;;;4277:9;4266:8;;:20;;;;;;;;;;;;;;;;;;4215:78::o:0;4299:201::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4349:12:15::1;4375:10;4367:24;;4412:21;4367:80;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4348:99;;;4465:7;4457:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;4338:162;4299:201::o:0;329:55::-;;;;:::o;11334:179:6:-;11467:39;11484:4;11490:2;11494:7;11467:39;;;;;;;;;;;;:16;:39::i;:::-;11334:179;;;:::o;439:32:15:-;;;;:::o;3812:731:6:-;3911:7;3934:22;3959:13;;3934:38;;3982:19;4172:9;4167:320;4187:14;4183:1;:18;4167:320;;;4226:31;4260:11;:14;4272:1;4260:14;;;;;;;;;;;4226:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4297:9;:16;;;4292:181;;4356:5;4341:11;:20;4337:83;;;4396:1;4389:8;;;;;;;;4337:83;4441:13;;;;;;;4292:181;4208:279;4203:3;;;;;;;4167:320;;;;4513:23;;;;;;;;;;;;;;3812:731;;;;:::o;592:20:15:-;;;;;;;;;;;;;:::o;3396:86::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3472:3:15::1;3462:7;:13;;;;;;;;;;;;:::i;:::-;;3396:86:::0;:::o;883:22::-;;;;;;;;;;;;;:::o;8445:122:6:-;8509:7;8535:20;8547:7;8535:11;:20::i;:::-;:25;;;8528:32;;8445:122;;;:::o;619:21:15:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3488:85::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3560:6:15::1;3550:7;;:16;;;;;;;;;;;;;;;;;;3488:85:::0;:::o;3887:108::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3981:7:15::1;3962:16;:26;;;;3887:108:::0;:::o;647:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6485:203:6:-;6549:7;6589:1;6572:19;;:5;:19;;;6568:60;;;6600:28;;;;;;;;;;;;;;6568:60;6653:12;:19;6666:5;6653:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;6645:36;;6638:43;;6485:203;;;:::o;1693:145:13:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1799:1:::1;1762:40;;1783:6;;;;;;;;;;;1762:40;;;;;;;;;;;;1829:1;1812:6;;:19;;;;;;;;;;;;;;;;;;1693:145::o:0;4127:82:15:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4191:11:15::1;;;;;;;;;;;4190:12;4176:11;;:26;;;;;;;;;;;;;;;;;;4127:82::o:0;1061:85:13:-;1107:7;1133:6;;;;;;;;;;;1126:13;;1061:85;:::o;1853:1010:15:-;1967:14;1992:7;1967:33;;;;2010:7;2037:3;2026:7;:14;;2010:31;;2133:33;;2092:22;;2073:16;;:41;;;;:::i;:::-;:93;2052:176;;;;;;;;;;;;:::i;:::-;;;;;;;;;2278:1;2266:9;;:13;;;;:::i;:::-;2262:1;2246:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:33;2238:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;2314:14;2440:211;2483:20;:18;:20::i;:::-;826:50;2592:10;2604:6;2560:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2525:108;;;;;;2440:21;:211::i;:::-;2354:311;;;;;;;;:::i;:::-;;;;;;;;;;;;;2331:344;;;;;;2314:361;;2723:7;;;;;;;;;;;2693:37;;:26;2703:6;2711:1;2714;2717;2693:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;2685:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;2779:22;;2759:16;;:42;;;;;;;:::i;:::-;;;;;;;;2811:45;2821:10;2833:22;;2811:9;:45::i;:::-;1957:906;;;1853:1010;;;:::o;3683:90::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3757:9:15::1;3749:5;:17;;;;3683:90:::0;:::o;8791:102:6:-;8847:13;8879:7;8872:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8791:102;:::o;253:34:15:-;;;;:::o;1030:817::-;1084:12;1099:5;;1084:20;;1114:13;1183:16;;1164:3;1132:17;:29;1150:10;1132:29;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;:67;;1131:98;;;;;1212:16;;1205:3;:23;;1131:98;1130:137;;;;1260:7;:5;:7::i;:::-;1246:21;;:10;:21;;;1130:137;1114:153;;1281:8;1277:47;;;1312:1;1305:8;;1277:47;1361:4;1355:3;:10;;;;:::i;:::-;1342:9;:23;;1334:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;1451:1;1439:9;;:13;;;;:::i;:::-;1433:3;1417:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:35;1409:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1494:11;;;;;;;;;;;1486:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;1569:1;1558:8;;:12;;;;:::i;:::-;1552:3;:18;1544:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;1660:12;;1653:3;1625:25;1639:10;1625:13;:25::i;:::-;:31;;;;:::i;:::-;:47;;1604:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;1733:8;1729:75;;;1790:3;1757:17;:29;1775:10;1757:29;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;1729:75;1814:26;1824:10;1836:3;1814:9;:26::i;:::-;1074:773;;1030:817;:::o;10476:294:6:-;10598:12;:10;:12::i;:::-;10586:24;;:8;:24;;;10582:54;;;10619:17;;;;;;;;;;;;;;10582:54;10692:8;10647:18;:32;10666:12;:10;:12::i;:::-;10647:32;;;;;;;;;;;;;;;:42;10680:8;10647:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;10744:8;10715:48;;10730:12;:10;:12::i;:::-;10715:48;;;10754:8;10715:48;;;;;;:::i;:::-;;;;;;;;10476:294;;:::o;478:35:15:-;;;;:::o;11579:332:6:-;11740:28;11750:4;11756:2;11760:7;11740:9;:28::i;:::-;11783:48;11806:4;11812:2;11816:7;11825:5;11783:22;:48::i;:::-;11778:127;;11854:40;;;;;;;;;;;;;;11778:127;11579:332;;;;:::o;4001:120:15:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4107:7:15::1;4082:22;:32;;;;4001:120:::0;:::o;772:104::-;826:50;772:104;:::o;2981:409::-;3094:13;3144:16;3152:7;3144;:16::i;:::-;3123:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;3262:8;;;;;;;;;;;:121;;3370:13;3262:121;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3313:7;3322:18;:7;:16;:18::i;:::-;3296:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3262:121;3243:140;;2981:409;;;:::o;562:23::-;;;;;;;;;;;;;:::o;215:31::-;;;;:::o;10836:206:6:-;10973:4;11000:18;:25;11019:5;11000:25;;;;;;;;;;;;;;;:35;11026:8;11000:35;;;;;;;;;;;;;;;;;;;;;;;;;10993:42;;10836:206;;;;:::o;1987:240:13:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2095:1:::1;2075:22;;:8;:22;;;;2067:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2184:8;2155:38;;2176:6;;;;;;;;;;;2155:38;;;;;;;;;;;;2212:8;2203:6;;:17;;;;;;;;;;;;;;;;;;1987:240:::0;:::o;520:35:15:-;;;;:::o;294:28::-;;;;:::o;3579:98::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3667:3:15::1;3651:13;:19;;;;;;;;;;;;:::i;:::-;;3579:98:::0;:::o;1160:320:0:-;1220:4;1472:1;1450:7;:19;;;:23;1443:30;;1160:320;;;:::o;829:155:4:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;12157:142:6:-;12214:4;12247:13;;12237:7;:23;:55;;;;;12265:11;:20;12277:7;12265:20;;;;;;;;;;;:27;;;;;;;;;;;;12264:28;12237:55;12230:62;;12157:142;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;19283:189:6:-;19420:2;19393:15;:24;19409:7;19393:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19457:7;19453:2;19437:28;;19446:5;19437:28;;;;;;;;;;;;19283:189;;;:::o;14839:2092::-;14949:35;14987:20;14999:7;14987:11;:20::i;:::-;14949:58;;15018:22;15060:13;:18;;;15044:34;;:12;:10;:12::i;:::-;:34;;;:100;;;;15094:50;15111:13;:18;;;15131:12;:10;:12::i;:::-;15094:16;:50::i;:::-;15044:100;:152;;;;15184:12;:10;:12::i;:::-;15160:36;;:20;15172:7;15160:11;:20::i;:::-;:36;;;15044:152;15018:179;;15213:17;15208:66;;15239:35;;;;;;;;;;;;;;15208:66;15310:4;15288:26;;:13;:18;;;:26;;;15284:67;;15323:28;;;;;;;;;;;;;;15284:67;15379:1;15365:16;;:2;:16;;;15361:52;;;15390:23;;;;;;;;;;;;;;15361:52;15424:43;15446:4;15452:2;15456:7;15465:1;15424:21;:43::i;:::-;15529:49;15546:1;15550:7;15559:13;:18;;;15529:8;:49::i;:::-;15898:1;15868:12;:18;15881:4;15868:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15941:1;15913:12;:16;15926:2;15913:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15985:2;15957:11;:20;15969:7;15957:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;16046:15;16001:11;:20;16013:7;16001:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;16310:19;16342:1;16332:7;:11;16310:33;;16402:1;16361:43;;:11;:24;16373:11;16361:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;16357:463;;;16583:13;;16569:11;:27;16565:241;;;16652:13;:18;;;16620:11;:24;16632:11;16620:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;16734:13;:53;;;16692:11;:24;16704:11;16692:24;;;;;;;;;;;:39;;;:95;;;;;;;;;;;;;;;;;;16565:241;16357:463;15844:986;16864:7;16860:2;16845:27;;16854:4;16845:27;;;;;;;;;;;;16882:42;16903:4;16909:2;16913:7;16922:1;16882:20;:42::i;:::-;14939:1992;;14839:2092;;;:::o;7304:1084::-;7389:21;;:::i;:::-;7426:12;7441:7;7426:22;;7494:13;;7487:4;:20;7483:841;;;7527:31;7561:11;:17;7573:4;7561:17;;;;;;;;;;;7527:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7601:9;:16;;;7596:714;;7671:1;7645:28;;:9;:14;;;:28;;;7641:99;;7708:9;7701:16;;;;;;7641:99;8037:255;8044:4;8037:255;;;8076:6;;;;;;;;8120:11;:17;8132:4;8120:17;;;;;;;;;;;8108:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8193:1;8167:28;;:9;:14;;;:28;;;8163:107;;8234:9;8227:16;;;;;;8163:107;8037:255;;;7596:714;7509:815;7483:841;8350:31;;;;;;;;;;;;;;7304:1084;;;;:::o;1892:369:3:-;1945:7;1985:16;1968:13;:33;1964:291;;;2024:24;2017:31;;;;1964:291;2102:142;2145:10;2177:12;2211:15;2102:21;:142::i;:::-;2079:165;;1892:369;;:::o;4478:264:2:-;4595:7;4693:15;4710:10;4664:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4637:98;;;;;;4618:117;;4478:264;;;;:::o;12305:102:6:-;12373:27;12383:2;12387:8;12373:27;;;;;;;;;;;;:9;:27::i;:::-;12305:102;;:::o;6694:204::-;6755:7;6795:1;6778:19;;:5;:19;;;6774:59;;;6806:27;;;;;;;;;;;;;;6774:59;6858:12;:19;6871:5;6858:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;6850:41;;6843:48;;6694:204;;;:::o;20025:895::-;20175:4;20195:15;:2;:13;;;:15::i;:::-;20191:723;;;20262:2;20246:36;;;20304:12;:10;:12::i;:::-;20338:4;20364:7;20393:5;20246:170;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;20226:636;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20616:1;20599:6;:13;:18;20595:253;;;20648:40;;;;;;;;;;;;;;20595:253;20800:6;20794:13;20785:6;20781:2;20777:15;20770:38;20226:636;20488:45;;;20478:55;;;:6;:55;;;;20471:62;;;;;20191:723;20899:4;20892:11;;20025:895;;;;;;;:::o;328:703:14:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;21551:154:6:-;;;;;:::o;22346:153::-;;;;;:::o;2267:417:3:-;2407:7;2504:8;2534;2564:11;2597:13;2640:4;2472:191;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2445:232;;;;;;2426:251;;2267:417;;;;;:::o;12758:157:6:-;12876:32;12882:2;12886:8;12896:5;12903:4;12876:5;:32::i;:::-;12758:157;;;:::o;13162:1435::-;13295:20;13318:13;;13295:36;;13359:1;13345:16;;:2;:16;;;13341:48;;;13370:19;;;;;;;;;;;;;;13341:48;13415:1;13403:8;:13;13399:44;;;13425:18;;;;;;;;;;;;;;13399:44;13454:61;13484:1;13488:2;13492:12;13506:8;13454:21;:61::i;:::-;13821:8;13786:12;:16;13799:2;13786:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13884:8;13844:12;:16;13857:2;13844:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13941:2;13908:11;:25;13920:12;13908:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;14007:15;13957:11;:25;13969:12;13957:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;14038:20;14061:12;14038:35;;14093:9;14088:380;14108:8;14104:1;:12;14088:380;;;14171:12;14167:2;14146:38;;14163:1;14146:38;;;;;;;;;;;;14227:4;:88;;;;;14256:59;14287:1;14291:2;14295:12;14309:5;14256:22;:59::i;:::-;14255:60;14227:88;14202:220;;;14363:40;;;;;;;;;;;;;;14202:220;14439:14;;;;;;;14118:3;;;;;;;14088:380;;;;14498:12;14482:13;:28;;;;13762:759;14530:60;14559:1;14563:2;14567:12;14581:8;14530:20;:60::i;:::-;13285:1312;13162:1435;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:16:-;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;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:122;;2044:79;;:::i;:::-;2003:122;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;1931:340;;;;:::o;2277:139::-;2323:5;2361:6;2348:20;2339:29;;2377:33;2404:5;2377:33;:::i;:::-;2277:139;;;;:::o;2422:329::-;2481:6;2530:2;2518:9;2509:7;2505:23;2501:32;2498:119;;;2536:79;;:::i;:::-;2498:119;2656:1;2681:53;2726:7;2717:6;2706:9;2702:22;2681:53;:::i;:::-;2671:63;;2627:117;2422:329;;;;:::o;2757:474::-;2825:6;2833;2882:2;2870:9;2861:7;2857:23;2853:32;2850:119;;;2888:79;;:::i;:::-;2850:119;3008:1;3033:53;3078:7;3069:6;3058:9;3054:22;3033:53;:::i;:::-;3023:63;;2979:117;3135:2;3161:53;3206:7;3197:6;3186:9;3182:22;3161:53;:::i;:::-;3151:63;;3106:118;2757:474;;;;;:::o;3237:619::-;3314:6;3322;3330;3379:2;3367:9;3358:7;3354:23;3350:32;3347:119;;;3385:79;;:::i;:::-;3347:119;3505:1;3530:53;3575:7;3566:6;3555:9;3551:22;3530:53;:::i;:::-;3520:63;;3476:117;3632:2;3658:53;3703:7;3694:6;3683:9;3679:22;3658:53;:::i;:::-;3648:63;;3603:118;3760:2;3786:53;3831:7;3822:6;3811:9;3807:22;3786:53;:::i;:::-;3776:63;;3731:118;3237:619;;;;;:::o;3862:943::-;3957:6;3965;3973;3981;4030:3;4018:9;4009:7;4005:23;4001:33;3998:120;;;4037:79;;:::i;:::-;3998:120;4157:1;4182:53;4227:7;4218:6;4207:9;4203:22;4182:53;:::i;:::-;4172:63;;4128:117;4284:2;4310:53;4355:7;4346:6;4335:9;4331:22;4310:53;:::i;:::-;4300:63;;4255:118;4412:2;4438:53;4483:7;4474:6;4463:9;4459:22;4438:53;:::i;:::-;4428:63;;4383:118;4568:2;4557:9;4553:18;4540:32;4599:18;4591:6;4588:30;4585:117;;;4621:79;;:::i;:::-;4585:117;4726:62;4780:7;4771:6;4760:9;4756:22;4726:62;:::i;:::-;4716:72;;4511:287;3862:943;;;;;;;:::o;4811:468::-;4876:6;4884;4933:2;4921:9;4912:7;4908:23;4904:32;4901:119;;;4939:79;;:::i;:::-;4901:119;5059:1;5084:53;5129:7;5120:6;5109:9;5105:22;5084:53;:::i;:::-;5074:63;;5030:117;5186:2;5212:50;5254:7;5245:6;5234:9;5230:22;5212:50;:::i;:::-;5202:60;;5157:115;4811:468;;;;;:::o;5285:474::-;5353:6;5361;5410:2;5398:9;5389:7;5385:23;5381:32;5378:119;;;5416:79;;:::i;:::-;5378:119;5536:1;5561:53;5606:7;5597:6;5586:9;5582:22;5561:53;:::i;:::-;5551:63;;5507:117;5663:2;5689:53;5734:7;5725:6;5714:9;5710:22;5689:53;:::i;:::-;5679:63;;5634:118;5285:474;;;;;:::o;5765:327::-;5823:6;5872:2;5860:9;5851:7;5847:23;5843:32;5840:119;;;5878:79;;:::i;:::-;5840:119;5998:1;6023:52;6067:7;6058:6;6047:9;6043:22;6023:52;:::i;:::-;6013:62;;5969:116;5765:327;;;;:::o;6098:349::-;6167:6;6216:2;6204:9;6195:7;6191:23;6187:32;6184:119;;;6222:79;;:::i;:::-;6184:119;6342:1;6367:63;6422:7;6413:6;6402:9;6398:22;6367:63;:::i;:::-;6357:73;;6313:127;6098:349;;;;:::o;6453:509::-;6522:6;6571:2;6559:9;6550:7;6546:23;6542:32;6539:119;;;6577:79;;:::i;:::-;6539:119;6725:1;6714:9;6710:17;6697:31;6755:18;6747:6;6744:30;6741:117;;;6777:79;;:::i;:::-;6741:117;6882:63;6937:7;6928:6;6917:9;6913:22;6882:63;:::i;:::-;6872:73;;6668:287;6453:509;;;;:::o;6968:329::-;7027:6;7076:2;7064:9;7055:7;7051:23;7047:32;7044:119;;;7082:79;;:::i;:::-;7044:119;7202:1;7227:53;7272:7;7263:6;7252:9;7248:22;7227:53;:::i;:::-;7217:63;;7173:117;6968:329;;;;:::o;7303:619::-;7380:6;7388;7396;7445:2;7433:9;7424:7;7420:23;7416:32;7413:119;;;7451:79;;:::i;:::-;7413:119;7571:1;7596:53;7641:7;7632:6;7621:9;7617:22;7596:53;:::i;:::-;7586:63;;7542:117;7698:2;7724:53;7769:7;7760:6;7749:9;7745:22;7724:53;:::i;:::-;7714:63;;7669:118;7826:2;7852:53;7897:7;7888:6;7877:9;7873:22;7852:53;:::i;:::-;7842:63;;7797:118;7303:619;;;;;:::o;7928:118::-;8015:24;8033:5;8015:24;:::i;:::-;8010:3;8003:37;7928:118;;:::o;8052:109::-;8133:21;8148:5;8133:21;:::i;:::-;8128:3;8121:34;8052:109;;:::o;8167:118::-;8254:24;8272:5;8254:24;:::i;:::-;8249:3;8242:37;8167:118;;:::o;8291:157::-;8396:45;8416:24;8434:5;8416:24;:::i;:::-;8396:45;:::i;:::-;8391:3;8384:58;8291:157;;:::o;8454:360::-;8540:3;8568:38;8600:5;8568:38;:::i;:::-;8622:70;8685:6;8680:3;8622:70;:::i;:::-;8615:77;;8701:52;8746:6;8741:3;8734:4;8727:5;8723:16;8701:52;:::i;:::-;8778:29;8800:6;8778:29;:::i;:::-;8773:3;8769:39;8762:46;;8544:270;8454:360;;;;:::o;8820:364::-;8908:3;8936:39;8969:5;8936:39;:::i;:::-;8991:71;9055:6;9050:3;8991:71;:::i;:::-;8984:78;;9071:52;9116:6;9111:3;9104:4;9097:5;9093:16;9071:52;:::i;:::-;9148:29;9170:6;9148:29;:::i;:::-;9143:3;9139:39;9132:46;;8912:272;8820:364;;;;:::o;9190:377::-;9296:3;9324:39;9357:5;9324:39;:::i;:::-;9379:89;9461:6;9456:3;9379:89;:::i;:::-;9372:96;;9477:52;9522:6;9517:3;9510:4;9503:5;9499:16;9477:52;:::i;:::-;9554:6;9549:3;9545:16;9538:23;;9300:267;9190:377;;;;:::o;9597:845::-;9700:3;9737:5;9731:12;9766:36;9792:9;9766:36;:::i;:::-;9818:89;9900:6;9895:3;9818:89;:::i;:::-;9811:96;;9938:1;9927:9;9923:17;9954:1;9949:137;;;;10100:1;10095:341;;;;9916:520;;9949:137;10033:4;10029:9;10018;10014:25;10009:3;10002:38;10069:6;10064:3;10060:16;10053:23;;9949:137;;10095:341;10162:38;10194:5;10162:38;:::i;:::-;10222:1;10236:154;10250:6;10247:1;10244:13;10236:154;;;10324:7;10318:14;10314:1;10309:3;10305:11;10298:35;10374:1;10365:7;10361:15;10350:26;;10272:4;10269:1;10265:12;10260:17;;10236:154;;;10419:6;10414:3;10410:16;10403:23;;10102:334;;9916:520;;9704:738;;9597:845;;;;:::o;10448:402::-;10608:3;10629:85;10711:2;10706:3;10629:85;:::i;:::-;10622:92;;10723:93;10812:3;10723:93;:::i;:::-;10841:2;10836:3;10832:12;10825:19;;10448:402;;;:::o;10856:366::-;10998:3;11019:67;11083:2;11078:3;11019:67;:::i;:::-;11012:74;;11095:93;11184:3;11095:93;:::i;:::-;11213:2;11208:3;11204:12;11197:19;;10856:366;;;:::o;11228:400::-;11388:3;11409:84;11491:1;11486:3;11409:84;:::i;:::-;11402:91;;11502:93;11591:3;11502:93;:::i;:::-;11620:1;11615:3;11611:11;11604:18;;11228:400;;;:::o;11634:366::-;11776:3;11797:67;11861:2;11856:3;11797:67;:::i;:::-;11790:74;;11873:93;11962:3;11873:93;:::i;:::-;11991:2;11986:3;11982:12;11975:19;;11634:366;;;:::o;12006:::-;12148:3;12169:67;12233:2;12228:3;12169:67;:::i;:::-;12162:74;;12245:93;12334:3;12245:93;:::i;:::-;12363:2;12358:3;12354:12;12347:19;;12006:366;;;:::o;12378:::-;12520:3;12541:67;12605:2;12600:3;12541:67;:::i;:::-;12534:74;;12617:93;12706:3;12617:93;:::i;:::-;12735:2;12730:3;12726:12;12719:19;;12378:366;;;:::o;12750:400::-;12910:3;12931:84;13013:1;13008:3;12931:84;:::i;:::-;12924:91;;13024:93;13113:3;13024:93;:::i;:::-;13142:1;13137:3;13133:11;13126:18;;12750:400;;;:::o;13156:366::-;13298:3;13319:67;13383:2;13378:3;13319:67;:::i;:::-;13312:74;;13395:93;13484:3;13395:93;:::i;:::-;13513:2;13508:3;13504:12;13497:19;;13156:366;;;:::o;13528:::-;13670:3;13691:67;13755:2;13750:3;13691:67;:::i;:::-;13684:74;;13767:93;13856:3;13767:93;:::i;:::-;13885:2;13880:3;13876:12;13869:19;;13528:366;;;:::o;13900:::-;14042:3;14063:67;14127:2;14122:3;14063:67;:::i;:::-;14056:74;;14139:93;14228:3;14139:93;:::i;:::-;14257:2;14252:3;14248:12;14241:19;;13900:366;;;:::o;14272:::-;14414:3;14435:67;14499:2;14494:3;14435:67;:::i;:::-;14428:74;;14511:93;14600:3;14511:93;:::i;:::-;14629:2;14624:3;14620:12;14613:19;;14272:366;;;:::o;14644:398::-;14803:3;14824:83;14905:1;14900:3;14824:83;:::i;:::-;14817:90;;14916:93;15005:3;14916:93;:::i;:::-;15034:1;15029:3;15025:11;15018:18;;14644:398;;;:::o;15048:366::-;15190:3;15211:67;15275:2;15270:3;15211:67;:::i;:::-;15204:74;;15287:93;15376:3;15287:93;:::i;:::-;15405:2;15400:3;15396:12;15389:19;;15048:366;;;:::o;15420:::-;15562:3;15583:67;15647:2;15642:3;15583:67;:::i;:::-;15576:74;;15659:93;15748:3;15659:93;:::i;:::-;15777:2;15772:3;15768:12;15761:19;;15420:366;;;:::o;15792:::-;15934:3;15955:67;16019:2;16014:3;15955:67;:::i;:::-;15948:74;;16031:93;16120:3;16031:93;:::i;:::-;16149:2;16144:3;16140:12;16133:19;;15792:366;;;:::o;16164:118::-;16251:24;16269:5;16251:24;:::i;:::-;16246:3;16239:37;16164:118;;:::o;16288:112::-;16371:22;16387:5;16371:22;:::i;:::-;16366:3;16359:35;16288:112;;:::o;16406:695::-;16684:3;16706:92;16794:3;16785:6;16706:92;:::i;:::-;16699:99;;16815:95;16906:3;16897:6;16815:95;:::i;:::-;16808:102;;16927:148;17071:3;16927:148;:::i;:::-;16920:155;;17092:3;17085:10;;16406:695;;;;;:::o;17107:522::-;17320:3;17342:148;17486:3;17342:148;:::i;:::-;17335:155;;17500:75;17571:3;17562:6;17500:75;:::i;:::-;17600:2;17595:3;17591:12;17584:19;;17620:3;17613:10;;17107:522;;;;:::o;17635:663::-;17876:3;17898:148;18042:3;17898:148;:::i;:::-;17891:155;;18056:75;18127:3;18118:6;18056:75;:::i;:::-;18156:2;18151:3;18147:12;18140:19;;18169:75;18240:3;18231:6;18169:75;:::i;:::-;18269:2;18264:3;18260:12;18253:19;;18289:3;18282:10;;17635:663;;;;;:::o;18304:379::-;18488:3;18510:147;18653:3;18510:147;:::i;:::-;18503:154;;18674:3;18667:10;;18304:379;;;:::o;18689:222::-;18782:4;18820:2;18809:9;18805:18;18797:26;;18833:71;18901:1;18890:9;18886:17;18877:6;18833:71;:::i;:::-;18689:222;;;;:::o;18917:640::-;19112:4;19150:3;19139:9;19135:19;19127:27;;19164:71;19232:1;19221:9;19217:17;19208:6;19164:71;:::i;:::-;19245:72;19313:2;19302:9;19298:18;19289:6;19245:72;:::i;:::-;19327;19395:2;19384:9;19380:18;19371:6;19327:72;:::i;:::-;19446:9;19440:4;19436:20;19431:2;19420:9;19416:18;19409:48;19474:76;19545:4;19536:6;19474:76;:::i;:::-;19466:84;;18917:640;;;;;;;:::o;19563:210::-;19650:4;19688:2;19677:9;19673:18;19665:26;;19701:65;19763:1;19752:9;19748:17;19739:6;19701:65;:::i;:::-;19563:210;;;;:::o;19779:222::-;19872:4;19910:2;19899:9;19895:18;19887:26;;19923:71;19991:1;19980:9;19976:17;19967:6;19923:71;:::i;:::-;19779:222;;;;:::o;20007:442::-;20156:4;20194:2;20183:9;20179:18;20171:26;;20207:71;20275:1;20264:9;20260:17;20251:6;20207:71;:::i;:::-;20288:72;20356:2;20345:9;20341:18;20332:6;20288:72;:::i;:::-;20370;20438:2;20427:9;20423:18;20414:6;20370:72;:::i;:::-;20007:442;;;;;;:::o;20455:664::-;20660:4;20698:3;20687:9;20683:19;20675:27;;20712:71;20780:1;20769:9;20765:17;20756:6;20712:71;:::i;:::-;20793:72;20861:2;20850:9;20846:18;20837:6;20793:72;:::i;:::-;20875;20943:2;20932:9;20928:18;20919:6;20875:72;:::i;:::-;20957;21025:2;21014:9;21010:18;21001:6;20957:72;:::i;:::-;21039:73;21107:3;21096:9;21092:19;21083:6;21039:73;:::i;:::-;20455:664;;;;;;;;:::o;21125:545::-;21298:4;21336:3;21325:9;21321:19;21313:27;;21350:71;21418:1;21407:9;21403:17;21394:6;21350:71;:::i;:::-;21431:68;21495:2;21484:9;21480:18;21471:6;21431:68;:::i;:::-;21509:72;21577:2;21566:9;21562:18;21553:6;21509:72;:::i;:::-;21591;21659:2;21648:9;21644:18;21635:6;21591:72;:::i;:::-;21125:545;;;;;;;:::o;21676:313::-;21789:4;21827:2;21816:9;21812:18;21804:26;;21876:9;21870:4;21866:20;21862:1;21851:9;21847:17;21840:47;21904:78;21977:4;21968:6;21904:78;:::i;:::-;21896:86;;21676:313;;;;:::o;21995:419::-;22161:4;22199:2;22188:9;22184:18;22176:26;;22248:9;22242:4;22238:20;22234:1;22223:9;22219:17;22212:47;22276:131;22402:4;22276:131;:::i;:::-;22268:139;;21995:419;;;:::o;22420:::-;22586:4;22624:2;22613:9;22609:18;22601:26;;22673:9;22667:4;22663:20;22659:1;22648:9;22644:17;22637:47;22701:131;22827:4;22701:131;:::i;:::-;22693:139;;22420:419;;;:::o;22845:::-;23011:4;23049:2;23038:9;23034:18;23026:26;;23098:9;23092:4;23088:20;23084:1;23073:9;23069:17;23062:47;23126:131;23252:4;23126:131;:::i;:::-;23118:139;;22845:419;;;:::o;23270:::-;23436:4;23474:2;23463:9;23459:18;23451:26;;23523:9;23517:4;23513:20;23509:1;23498:9;23494:17;23487:47;23551:131;23677:4;23551:131;:::i;:::-;23543:139;;23270:419;;;:::o;23695:::-;23861:4;23899:2;23888:9;23884:18;23876:26;;23948:9;23942:4;23938:20;23934:1;23923:9;23919:17;23912:47;23976:131;24102:4;23976:131;:::i;:::-;23968:139;;23695:419;;;:::o;24120:::-;24286:4;24324:2;24313:9;24309:18;24301:26;;24373:9;24367:4;24363:20;24359:1;24348:9;24344:17;24337:47;24401:131;24527:4;24401:131;:::i;:::-;24393:139;;24120:419;;;:::o;24545:::-;24711:4;24749:2;24738:9;24734:18;24726:26;;24798:9;24792:4;24788:20;24784:1;24773:9;24769:17;24762:47;24826:131;24952:4;24826:131;:::i;:::-;24818:139;;24545:419;;;:::o;24970:::-;25136:4;25174:2;25163:9;25159:18;25151:26;;25223:9;25217:4;25213:20;25209:1;25198:9;25194:17;25187:47;25251:131;25377:4;25251:131;:::i;:::-;25243:139;;24970:419;;;:::o;25395:::-;25561:4;25599:2;25588:9;25584:18;25576:26;;25648:9;25642:4;25638:20;25634:1;25623:9;25619:17;25612:47;25676:131;25802:4;25676:131;:::i;:::-;25668:139;;25395:419;;;:::o;25820:::-;25986:4;26024:2;26013:9;26009:18;26001:26;;26073:9;26067:4;26063:20;26059:1;26048:9;26044:17;26037:47;26101:131;26227:4;26101:131;:::i;:::-;26093:139;;25820:419;;;:::o;26245:::-;26411:4;26449:2;26438:9;26434:18;26426:26;;26498:9;26492:4;26488:20;26484:1;26473:9;26469:17;26462:47;26526:131;26652:4;26526:131;:::i;:::-;26518:139;;26245:419;;;:::o;26670:222::-;26763:4;26801:2;26790:9;26786:18;26778:26;;26814:71;26882:1;26871:9;26867:17;26858:6;26814:71;:::i;:::-;26670:222;;;;:::o;26898:129::-;26932:6;26959:20;;:::i;:::-;26949:30;;26988:33;27016:4;27008:6;26988:33;:::i;:::-;26898:129;;;:::o;27033:75::-;27066:6;27099:2;27093:9;27083:19;;27033:75;:::o;27114:307::-;27175:4;27265:18;27257:6;27254:30;27251:56;;;27287:18;;:::i;:::-;27251:56;27325:29;27347:6;27325:29;:::i;:::-;27317:37;;27409:4;27403;27399:15;27391:23;;27114:307;;;:::o;27427:308::-;27489:4;27579:18;27571:6;27568:30;27565:56;;;27601:18;;:::i;:::-;27565:56;27639:29;27661:6;27639:29;:::i;:::-;27631:37;;27723:4;27717;27713:15;27705:23;;27427:308;;;:::o;27741:141::-;27790:4;27813:3;27805:11;;27836:3;27833:1;27826:14;27870:4;27867:1;27857:18;27849:26;;27741:141;;;:::o;27888:98::-;27939:6;27973:5;27967:12;27957:22;;27888:98;;;:::o;27992:99::-;28044:6;28078:5;28072:12;28062:22;;27992:99;;;:::o;28097:168::-;28180:11;28214:6;28209:3;28202:19;28254:4;28249:3;28245:14;28230:29;;28097:168;;;;:::o;28271:147::-;28372:11;28409:3;28394:18;;28271:147;;;;:::o;28424:169::-;28508:11;28542:6;28537:3;28530:19;28582:4;28577:3;28573:14;28558:29;;28424:169;;;;:::o;28599:148::-;28701:11;28738:3;28723:18;;28599:148;;;;:::o;28753:305::-;28793:3;28812:20;28830:1;28812:20;:::i;:::-;28807:25;;28846:20;28864:1;28846:20;:::i;:::-;28841:25;;29000:1;28932:66;28928:74;28925:1;28922:81;28919:107;;;29006:18;;:::i;:::-;28919:107;29050:1;29047;29043:9;29036:16;;28753:305;;;;:::o;29064:185::-;29104:1;29121:20;29139:1;29121:20;:::i;:::-;29116:25;;29155:20;29173:1;29155:20;:::i;:::-;29150:25;;29194:1;29184:35;;29199:18;;:::i;:::-;29184:35;29241:1;29238;29234:9;29229:14;;29064:185;;;;:::o;29255:348::-;29295:7;29318:20;29336:1;29318:20;:::i;:::-;29313:25;;29352:20;29370:1;29352:20;:::i;:::-;29347:25;;29540:1;29472:66;29468:74;29465:1;29462:81;29457:1;29450:9;29443:17;29439:105;29436:131;;;29547:18;;:::i;:::-;29436:131;29595:1;29592;29588:9;29577:20;;29255:348;;;;:::o;29609:191::-;29649:4;29669:20;29687:1;29669:20;:::i;:::-;29664:25;;29703:20;29721:1;29703:20;:::i;:::-;29698:25;;29742:1;29739;29736:8;29733:34;;;29747:18;;:::i;:::-;29733:34;29792:1;29789;29785:9;29777:17;;29609:191;;;;:::o;29806:96::-;29843:7;29872:24;29890:5;29872:24;:::i;:::-;29861:35;;29806:96;;;:::o;29908:90::-;29942:7;29985:5;29978:13;29971:21;29960:32;;29908:90;;;:::o;30004:77::-;30041:7;30070:5;30059:16;;30004:77;;;:::o;30087:149::-;30123:7;30163:66;30156:5;30152:78;30141:89;;30087:149;;;:::o;30242:126::-;30279:7;30319:42;30312:5;30308:54;30297:65;;30242:126;;;:::o;30374:77::-;30411:7;30440:5;30429:16;;30374:77;;;:::o;30457:86::-;30492:7;30532:4;30525:5;30521:16;30510:27;;30457:86;;;:::o;30549:154::-;30633:6;30628:3;30623;30610:30;30695:1;30686:6;30681:3;30677:16;30670:27;30549:154;;;:::o;30709:307::-;30777:1;30787:113;30801:6;30798:1;30795:13;30787:113;;;30886:1;30881:3;30877:11;30871:18;30867:1;30862:3;30858:11;30851:39;30823:2;30820:1;30816:10;30811:15;;30787:113;;;30918:6;30915:1;30912:13;30909:101;;;30998:1;30989:6;30984:3;30980:16;30973:27;30909:101;30758:258;30709:307;;;:::o;31022:320::-;31066:6;31103:1;31097:4;31093:12;31083:22;;31150:1;31144:4;31140:12;31171:18;31161:81;;31227:4;31219:6;31215:17;31205:27;;31161:81;31289:2;31281:6;31278:14;31258:18;31255:38;31252:84;;;31308:18;;:::i;:::-;31252:84;31073:269;31022:320;;;:::o;31348:281::-;31431:27;31453:4;31431:27;:::i;:::-;31423:6;31419:40;31561:6;31549:10;31546:22;31525:18;31513:10;31510:34;31507:62;31504:88;;;31572:18;;:::i;:::-;31504:88;31612:10;31608:2;31601:22;31391:238;31348:281;;:::o;31635:233::-;31674:3;31697:24;31715:5;31697:24;:::i;:::-;31688:33;;31743:66;31736:5;31733:77;31730:103;;;31813:18;;:::i;:::-;31730:103;31860:1;31853:5;31849:13;31842:20;;31635:233;;;:::o;31874:79::-;31913:7;31942:5;31931:16;;31874:79;;;:::o;31959:176::-;31991:1;32008:20;32026:1;32008:20;:::i;:::-;32003:25;;32042:20;32060:1;32042:20;:::i;:::-;32037:25;;32081:1;32071:35;;32086:18;;:::i;:::-;32071:35;32127:1;32124;32120:9;32115:14;;31959:176;;;;:::o;32141:180::-;32189:77;32186:1;32179:88;32286:4;32283:1;32276:15;32310:4;32307:1;32300:15;32327:180;32375:77;32372:1;32365:88;32472:4;32469:1;32462:15;32496:4;32493:1;32486:15;32513:180;32561:77;32558:1;32551:88;32658:4;32655:1;32648:15;32682:4;32679:1;32672:15;32699:180;32747:77;32744:1;32737:88;32844:4;32841:1;32834:15;32868:4;32865:1;32858:15;32885:180;32933:77;32930:1;32923:88;33030:4;33027:1;33020:15;33054:4;33051:1;33044:15;33071:117;33180:1;33177;33170:12;33194:117;33303:1;33300;33293:12;33317:117;33426:1;33423;33416:12;33440:117;33549:1;33546;33539:12;33563:102;33604:6;33655:2;33651:7;33646:2;33639:5;33635:14;33631:28;33621:38;;33563:102;;;:::o;33671:214::-;33811:66;33807:1;33799:6;33795:14;33788:90;33671:214;:::o;33891:225::-;34031:34;34027:1;34019:6;34015:14;34008:58;34100:8;34095:2;34087:6;34083:15;34076:33;33891:225;:::o;34122:214::-;34262:66;34258:1;34250:6;34246:14;34239:90;34122:214;:::o;34342:170::-;34482:22;34478:1;34470:6;34466:14;34459:46;34342:170;:::o;34518:169::-;34658:21;34654:1;34646:6;34642:14;34635:45;34518:169;:::o;34693:164::-;34833:16;34829:1;34821:6;34817:14;34810:40;34693:164;:::o;34863:155::-;35003:7;34999:1;34991:6;34987:14;34980:31;34863:155;:::o;35024:182::-;35164:34;35160:1;35152:6;35148:14;35141:58;35024:182;:::o;35212:174::-;35352:26;35348:1;35340:6;35336:14;35329:50;35212:174;:::o;35392:234::-;35532:34;35528:1;35520:6;35516:14;35509:58;35601:17;35596:2;35588:6;35584:15;35577:42;35392:234;:::o;35632:179::-;35772:31;35768:1;35760:6;35756:14;35749:55;35632:179;:::o;35817:114::-;;:::o;35937:166::-;36077:18;36073:1;36065:6;36061:14;36054:42;35937:166;:::o;36109:223::-;36249:34;36245:1;36237:6;36233:14;36226:58;36318:6;36313:2;36305:6;36301:15;36294:31;36109:223;:::o;36338:169::-;36478:21;36474:1;36466:6;36462:14;36455:45;36338:169;:::o;36513:122::-;36586:24;36604:5;36586:24;:::i;:::-;36579:5;36576:35;36566:63;;36625:1;36622;36615:12;36566:63;36513:122;:::o;36641:116::-;36711:21;36726:5;36711:21;:::i;:::-;36704:5;36701:32;36691:60;;36747:1;36744;36737:12;36691:60;36641:116;:::o;36763:122::-;36836:24;36854:5;36836:24;:::i;:::-;36829:5;36826:35;36816:63;;36875:1;36872;36865:12;36816:63;36763:122;:::o;36891:120::-;36963:23;36980:5;36963:23;:::i;:::-;36956:5;36953:34;36943:62;;37001:1;36998;36991:12;36943:62;36891:120;:::o;37017:122::-;37090:24;37108:5;37090:24;:::i;:::-;37083:5;37080:35;37070:63;;37129:1;37126;37119:12;37070:63;37017:122;:::o

Swarm Source

ipfs://2fe6a5cb6ad4cc99f50d3e9c743df3522b1d0c555056e1fa4881a4c90010bf66
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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