ETH Price: $2,338.46 (-0.80%)

Unusual Guests (UG)
 

Overview

TokenID

0

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

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

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 14 of 14: UnusualGuests.sol
// SPDX-License-Identifier: MIT
//
// Made by: NFT Stack
//          https://nftstack.info
//

pragma solidity ^0.8.1;

import "./ERC721Enumerable.sol";
import "./Ownable.sol";

contract UnusualGuests is ERC721Enumerable, Ownable {
  uint256 public mintPrice = 0.0678 ether;
  uint256 public preSaleMintPrice = 0.0678 ether;

  string _baseTokenURI;
  string public PROVENANCE = "";

  bool public isMintActive = false;
  bool public isPreSaleMintActive = false;
  bool public isClosedMintForever = false;

  uint256 public maximumMintSupply = 4567;
  uint256 public maximumAllowedTokensPerPurchase = 5;

  address private OtherAddress = 0x669fbb9A6c3186E00198B8756fDA4B64500208c1;

  mapping(address => uint8) private _allowList;

  event AssetMinted(uint256 tokenId, address sender);
  event SaleActivation(bool isMintActive);

  constructor(string memory baseURI) ERC721("Unusual Guests", "UG") {
    setBaseURI(baseURI);
  }

  modifier saleIsOpen {
    require(totalSupply() <= maximumMintSupply, "Sale has ended.");
    _;
  }

  modifier onlyAuthorized() {
    require(owner() == msg.sender);
    _;
  }

  function setMintActive(bool val) public onlyAuthorized {
    isMintActive = val;
    emit SaleActivation(val);
  }

  function setIsPreSaleMintActive(bool _isPreSaleMintActive) external onlyAuthorized {
    isPreSaleMintActive = _isPreSaleMintActive;
  }

  function addToAllowList(address[] calldata addresses, uint8 numAllowedToMint) external onlyAuthorized {
    for (uint256 i = 0; i < addresses.length; i++) {
      require(addresses[i] != address(0), "Can't add a null address");
      _allowList[addresses[i]] = numAllowedToMint;
    }
  }

  function numAvailableToMint(address addr) external view returns (uint8) {
    return _allowList[addr];
  }

  function setProvenanceHash(string memory provenanceHash) public onlyAuthorized {
    PROVENANCE = provenanceHash;
  }

  function setBaseURI(string memory baseURI) public onlyAuthorized {
    _baseTokenURI = baseURI;
  }

  function setMintPrice(uint256 _mintPrice) public onlyAuthorized() {
    mintPrice = _mintPrice;
  }

  function setPreSaleMintPrice(uint256 _preSaleMintPrice) public onlyAuthorized() {
    preSaleMintPrice = _preSaleMintPrice;
  }

  function setIsClosedMintForever() external onlyAuthorized {
    isClosedMintForever = true;
  }

  function getTotalSupply() external view returns (uint256) {
    return totalSupply();
  }

  function getContractOwner() public view returns (address) {
    return owner();
  }

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

  function reserveToCustomWallet(address _walletAddress, uint256 _count) public onlyAuthorized {
    for (uint256 i = 0; i < _count; i++) {
      require(_walletAddress!= address(0), "Not Mint for the zero address");
      emit AssetMinted(totalSupply(), _walletAddress);
      _safeMint(_walletAddress, totalSupply());
    }
  }

  function mint(address _to, uint256 _count) public payable saleIsOpen {
    if (msg.sender != owner()) {
      require(isMintActive, "Sale is not active currently.");
    }

    require(totalSupply() + _count <= maximumMintSupply, "Purchase would exceed max tokens");
    require(
      _count <= maximumAllowedTokensPerPurchase,
      "Exceeds maximum allowed tokens"
    );
    require(!isClosedMintForever, "Mint Closed Forever");

    require(msg.value >= mintPrice * _count, "Insuffient ETH amount sent.");

    for (uint256 i = 0; i < _count; i++) {
      emit AssetMinted(totalSupply(), _to);
      _safeMint(_to, totalSupply());
    }
  }

  function preSaleMint(uint8 _count) public payable saleIsOpen {
    require(!isClosedMintForever, 'Mint Closed Forever');
    require(isPreSaleMintActive, 'Pre Sale Mint is not active');
    require(_count <= _allowList[msg.sender], 'Exceeded max available to purchase');
    require(_count + totalSupply() <= maximumMintSupply, 'Purchase would exceed max tokens');
    require(msg.value >= preSaleMintPrice * _count, 'Insuffient ETH amount sent.');

    _allowList[msg.sender] -= _count;
    for (uint256 i = 0; i < _count; i++) {
      emit AssetMinted(totalSupply(), msg.sender);
      _safeMint(msg.sender, totalSupply());
    }
  }

  function walletOfOwner(address _owner) external view returns(uint256[] memory) {
    uint tokenCount = balanceOf(_owner);
    uint256[] memory tokensId = new uint256[](tokenCount);

    for(uint i = 0; i < tokenCount; i++){
      tokensId[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokensId;
  }

  function withdraw() external onlyAuthorized {
    uint balance = address(this).balance;
    payable(OtherAddress).transfer(balance * 10000 / 10000);
    payable(owner()).transfer(balance * 0 / 10000);
  }
}

File 1 of 14: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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 2 of 14: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 14: ECDSA.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
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");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            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;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    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);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        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));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

File 4 of 14: 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 5 of 14: 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 overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _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 6 of 14: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

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 7 of 14: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 8 of 14: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

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 9 of 14: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

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

    /**
     * @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 10 of 14: 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 11 of 14: 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 12 of 14: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

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

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

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

File 13 of 14: 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":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"AssetMinted","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":false,"internalType":"bool","name":"isMintActive","type":"bool"}],"name":"SaleActivation","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":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint8","name":"numAllowedToMint","type":"uint8"}],"name":"addToAllowList","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"isClosedMintForever","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPreSaleMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumAllowedTokensPerPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumMintSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"numAvailableToMint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_count","type":"uint8"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preSaleMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_walletAddress","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"reserveToCustomWallet","outputs":[],"stateMutability":"nonpayable","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setIsClosedMintForever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPreSaleMintActive","type":"bool"}],"name":"setIsPreSaleMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preSaleMintPrice","type":"uint256"}],"name":"setPreSaleMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266f0dfbda3c58000600b5566f0dfbda3c58000600c5560405180602001604052806000815250600e9080519060200190620000419291906200035a565b506000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055506000600f60026101000a81548160ff0219169083151502179055506111d7601055600560115573669fbb9a6c3186e00198b8756fda4b64500208c1601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200010057600080fd5b50604051620057063803806200570683398181016040528101906200012691906200047c565b6040518060400160405280600e81526020017f556e757375616c204775657374730000000000000000000000000000000000008152506040518060400160405280600281526020017f55470000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001aa9291906200035a565b508060019080519060200190620001c39291906200035a565b505050620001e6620001da620001fe60201b60201c565b6200020660201b60201c565b620001f781620002cc60201b60201c565b5062000631565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff16620002f36200033060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200031457600080fd5b80600d90805190602001906200032c9291906200035a565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003689062000556565b90600052602060002090601f0160209004810192826200038c5760008555620003d8565b82601f10620003a757805160ff1916838001178555620003d8565b82800160010185558215620003d8579182015b82811115620003d7578251825591602001919060010190620003ba565b5b509050620003e79190620003eb565b5090565b5b8082111562000406576000816000905550600101620003ec565b5090565b6000620004216200041b84620004ea565b620004c1565b9050828152602081018484840111156200043a57600080fd5b6200044784828562000520565b509392505050565b600082601f8301126200046157600080fd5b8151620004738482602086016200040a565b91505092915050565b6000602082840312156200048f57600080fd5b600082015167ffffffffffffffff811115620004aa57600080fd5b620004b8848285016200044f565b91505092915050565b6000620004cd620004e0565b9050620004db82826200058c565b919050565b6000604051905090565b600067ffffffffffffffff821115620005085762000507620005f1565b5b620005138262000620565b9050602081019050919050565b60005b838110156200054057808201518184015260208101905062000523565b8381111562000550576000848401525b50505050565b600060028204905060018216806200056f57607f821691505b60208210811415620005865762000585620005c2565b5b50919050565b620005978262000620565b810181811067ffffffffffffffff82111715620005b957620005b8620005f1565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6150c580620006416000396000f3fe60806040526004361061025c5760003560e01c80636373a6b111610144578063a22cb465116100b6578063e985e9c51161007a578063e985e9c5146108d9578063ec7d099114610916578063ee1cc94414610941578063f2fde38b1461096a578063f4a0a52814610993578063f9f67d6c146109bc5761025c565b8063a22cb465146107e2578063b88d4fde1461080b578063c04a283614610834578063c4e41b2214610871578063c87b56dd1461089c5761025c565b80637d26f470116101085780637d26f470146106f45780638da5cb5b1461071f578063932ecebc1461074a57806395d89b41146107615780639a3bf7281461078c5780639ccb0fea146107b75761025c565b80636373a6b1146106215780636817c76c1461064c57806370a0823114610677578063715018a6146106b457806377b501b9146106cb5761025c565b80633ccfd60b116101dd578063442890d5116101a1578063442890d5146104fd5780634d0550de146105285780634f6ccce71461055357806355f804b3146105905780635b92ac0d146105b95780636352211e146105e45761025c565b80633ccfd60b1461043b5780633cfac5701461045257806340c10f191461047b57806342842e0e14610497578063438b6300146104c05761025c565b80631096952311610224578063109695231461035857806318160ddd1461038157806323b872dd146103ac5780632f745c59146103d55780633b9ee7e4146104125761025c565b8063015963091461026157806301ffc9a71461028a57806306fdde03146102c7578063081812fc146102f2578063095ea7b31461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613946565b6109d8565b005b34801561029657600080fd5b506102b160048036038101906102ac91906139c7565b610ba0565b6040516102be9190614091565b60405180910390f35b3480156102d357600080fd5b506102dc610c1a565b6040516102e991906140ac565b60405180910390f35b3480156102fe57600080fd5b5061031960048036038101906103149190613a5a565b610cac565b6040516103269190614008565b60405180910390f35b34801561033b57600080fd5b506103566004803603810190610351919061390a565b610d31565b005b34801561036457600080fd5b5061037f600480360381019061037a9190613a19565b610e49565b005b34801561038d57600080fd5b50610396610ea2565b6040516103a3919061444e565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190613804565b610eaf565b005b3480156103e157600080fd5b506103fc60048036038101906103f7919061390a565b610f0f565b604051610409919061444e565b60405180910390f35b34801561041e57600080fd5b5061043960048036038101906104349190613a5a565b610fb4565b005b34801561044757600080fd5b50610450610ffd565b005b34801561045e57600080fd5b506104796004803603810190610474919061399e565b61112c565b005b6104956004803603810190610490919061390a565b611188565b005b3480156104a357600080fd5b506104be60048036038101906104b99190613804565b61140e565b005b3480156104cc57600080fd5b506104e760048036038101906104e2919061379f565b61142e565b6040516104f4919061406f565b60405180910390f35b34801561050957600080fd5b50610512611528565b60405161051f9190614008565b60405180910390f35b34801561053457600080fd5b5061053d611537565b60405161054a919061444e565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190613a5a565b61153d565b604051610587919061444e565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190613a19565b6115d4565b005b3480156105c557600080fd5b506105ce61162d565b6040516105db9190614091565b60405180910390f35b3480156105f057600080fd5b5061060b60048036038101906106069190613a5a565b611640565b6040516106189190614008565b60405180910390f35b34801561062d57600080fd5b506106366116f2565b60405161064391906140ac565b60405180910390f35b34801561065857600080fd5b50610661611780565b60405161066e919061444e565b60405180910390f35b34801561068357600080fd5b5061069e6004803603810190610699919061379f565b611786565b6040516106ab919061444e565b60405180910390f35b3480156106c057600080fd5b506106c961183e565b005b3480156106d757600080fd5b506106f260048036038101906106ed919061390a565b6118c6565b005b34801561070057600080fd5b506107096119e9565b6040516107169190614091565b60405180910390f35b34801561072b57600080fd5b506107346119fc565b6040516107419190614008565b60405180910390f35b34801561075657600080fd5b5061075f611a26565b005b34801561076d57600080fd5b50610776611a82565b60405161078391906140ac565b60405180910390f35b34801561079857600080fd5b506107a1611b14565b6040516107ae919061444e565b60405180910390f35b3480156107c357600080fd5b506107cc611b1a565b6040516107d99190614091565b60405180910390f35b3480156107ee57600080fd5b50610809600480360381019061080491906138ce565b611b2d565b005b34801561081757600080fd5b50610832600480360381019061082d9190613853565b611b43565b005b34801561084057600080fd5b5061085b6004803603810190610856919061379f565b611ba5565b6040516108689190614492565b60405180910390f35b34801561087d57600080fd5b50610886611bfb565b604051610893919061444e565b60405180910390f35b3480156108a857600080fd5b506108c360048036038101906108be9190613a5a565b611c0a565b6040516108d091906140ac565b60405180910390f35b3480156108e557600080fd5b5061090060048036038101906108fb91906137c8565b611cb1565b60405161090d9190614091565b60405180910390f35b34801561092257600080fd5b5061092b611d45565b604051610938919061444e565b60405180910390f35b34801561094d57600080fd5b506109686004803603810190610963919061399e565b611d4b565b005b34801561097657600080fd5b50610991600480360381019061098c919061379f565b611dde565b005b34801561099f57600080fd5b506109ba60048036038101906109b59190613a5a565b611ed6565b005b6109d660048036038101906109d19190613a83565b611f1f565b005b3373ffffffffffffffffffffffffffffffffffffffff166109f76119fc565b73ffffffffffffffffffffffffffffffffffffffff1614610a1757600080fd5b60005b83839050811015610b9a57600073ffffffffffffffffffffffffffffffffffffffff16848483818110610a76577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610a8b919061379f565b73ffffffffffffffffffffffffffffffffffffffff161415610ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad99061430e565b60405180910390fd5b8160136000868685818110610b20577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610b35919061379f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610b929061481f565b915050610a1a565b50505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c135750610c1282612235565b5b9050919050565b606060008054610c29906147bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610c55906147bc565b8015610ca25780601f10610c7757610100808354040283529160200191610ca2565b820191906000526020600020905b815481529060010190602001808311610c8557829003601f168201915b5050505050905090565b6000610cb782612317565b610cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ced906142ee565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d3c82611640565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da49061438e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dcc612383565b73ffffffffffffffffffffffffffffffffffffffff161480610dfb5750610dfa81610df5612383565b611cb1565b5b610e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e319061424e565b60405180910390fd5b610e44838361238b565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16610e686119fc565b73ffffffffffffffffffffffffffffffffffffffff1614610e8857600080fd5b80600e9080519060200190610e9e929190613564565b5050565b6000600880549050905090565b610ec0610eba612383565b82612444565b610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef6906143ce565b60405180910390fd5b610f0a838383612522565b505050565b6000610f1a83611786565b8210610f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f52906140ee565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16610fd36119fc565b73ffffffffffffffffffffffffffffffffffffffff1614610ff357600080fd5b80600c8190555050565b3373ffffffffffffffffffffffffffffffffffffffff1661101c6119fc565b73ffffffffffffffffffffffffffffffffffffffff161461103c57600080fd5b6000479050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc612710808461108c9190614637565b6110969190614606565b9081150290604051600060405180830381858888f193505050501580156110c1573d6000803e3d6000fd5b506110ca6119fc565b73ffffffffffffffffffffffffffffffffffffffff166108fc6127106000846110f39190614637565b6110fd9190614606565b9081150290604051600060405180830381858888f19350505050158015611128573d6000803e3d6000fd5b5050565b3373ffffffffffffffffffffffffffffffffffffffff1661114b6119fc565b73ffffffffffffffffffffffffffffffffffffffff161461116b57600080fd5b80600f60016101000a81548160ff02191690831515021790555050565b601054611193610ea2565b11156111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb906141ce565b60405180910390fd5b6111dc6119fc565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461125e57600f60009054906101000a900460ff1661125d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611254906140ce565b60405180910390fd5b5b6010548161126a610ea2565b61127491906145b0565b11156112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac9061414e565b60405180910390fd5b6011548111156112fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f19061436e565b60405180910390fd5b600f60029054906101000a900460ff161561134a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611341906141ae565b60405180910390fd5b80600b546113589190614637565b34101561139a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113919061442e565b60405180910390fd5b60005b81811015611409577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd3556113ce610ea2565b846040516113dd929190614469565b60405180910390a16113f6836113f1610ea2565b612789565b80806114019061481f565b91505061139d565b505050565b61142983838360405180602001604052806000815250611b43565b505050565b6060600061143b83611786565b905060008167ffffffffffffffff81111561147f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156114ad5781602001602082028036833780820191505090505b50905060005b8281101561151d576114c58582610f0f565b8282815181106114fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806115159061481f565b9150506114b3565b508092505050919050565b60006115326119fc565b905090565b60105481565b6000611547610ea2565b8210611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f906143ee565b60405180910390fd5b600882815481106115c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b3373ffffffffffffffffffffffffffffffffffffffff166115f36119fc565b73ffffffffffffffffffffffffffffffffffffffff161461161357600080fd5b80600d9080519060200190611629929190613564565b5050565b600f60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e09061428e565b60405180910390fd5b80915050919050565b600e80546116ff906147bc565b80601f016020809104026020016040519081016040528092919081815260200182805461172b906147bc565b80156117785780601f1061174d57610100808354040283529160200191611778565b820191906000526020600020905b81548152906001019060200180831161175b57829003601f168201915b505050505081565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee9061426e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611846612383565b73ffffffffffffffffffffffffffffffffffffffff166118646119fc565b73ffffffffffffffffffffffffffffffffffffffff16146118ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b19061432e565b60405180910390fd5b6118c460006127a7565b565b3373ffffffffffffffffffffffffffffffffffffffff166118e56119fc565b73ffffffffffffffffffffffffffffffffffffffff161461190557600080fd5b60005b818110156119e457600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611977906142ae565b60405180910390fd5b7f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd3556119a9610ea2565b846040516119b8929190614469565b60405180910390a16119d1836119cc610ea2565b612789565b80806119dc9061481f565b915050611908565b505050565b600f60029054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff16611a456119fc565b73ffffffffffffffffffffffffffffffffffffffff1614611a6557600080fd5b6001600f60026101000a81548160ff021916908315150217905550565b606060018054611a91906147bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611abd906147bc565b8015611b0a5780601f10611adf57610100808354040283529160200191611b0a565b820191906000526020600020905b815481529060010190602001808311611aed57829003601f168201915b5050505050905090565b60115481565b600f60019054906101000a900460ff1681565b611b3f611b38612383565b838361286d565b5050565b611b54611b4e612383565b83612444565b611b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8a906143ce565b60405180910390fd5b611b9f848484846129da565b50505050565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000611c05610ea2565b905090565b6060611c1582612317565b611c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4b9061434e565b60405180910390fd5b6000611c5e612a36565b90506000815111611c7e5760405180602001604052806000815250611ca9565b80611c8884612ac8565b604051602001611c99929190613fe4565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c5481565b3373ffffffffffffffffffffffffffffffffffffffff16611d6a6119fc565b73ffffffffffffffffffffffffffffffffffffffff1614611d8a57600080fd5b80600f60006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f81604051611dd39190614091565b60405180910390a150565b611de6612383565b73ffffffffffffffffffffffffffffffffffffffff16611e046119fc565b73ffffffffffffffffffffffffffffffffffffffff1614611e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e519061432e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec19061412e565b60405180910390fd5b611ed3816127a7565b50565b3373ffffffffffffffffffffffffffffffffffffffff16611ef56119fc565b73ffffffffffffffffffffffffffffffffffffffff1614611f1557600080fd5b80600b8190555050565b601054611f2a610ea2565b1115611f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f62906141ce565b60405180910390fd5b600f60029054906101000a900460ff1615611fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb2906141ae565b60405180910390fd5b600f60019054906101000a900460ff1661200a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120019061440e565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff168160ff16111561209f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612096906143ae565b60405180910390fd5b6010546120aa610ea2565b8260ff166120b891906145b0565b11156120f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f09061414e565b60405180910390fd5b8060ff16600c5461210a9190614637565b34101561214c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121439061442e565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166121a791906146c5565b92506101000a81548160ff021916908360ff16021790555060005b8160ff16811015612231577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd3556121f6610ea2565b33604051612205929190614469565b60405180910390a161221e33612219610ea2565b612789565b80806122299061481f565b9150506121c2565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061230057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612310575061230f82612c75565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123fe83611640565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061244f82612317565b61248e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124859061422e565b60405180910390fd5b600061249983611640565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061250857508373ffffffffffffffffffffffffffffffffffffffff166124f084610cac565b73ffffffffffffffffffffffffffffffffffffffff16145b8061251957506125188185611cb1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661254282611640565b73ffffffffffffffffffffffffffffffffffffffff1614612598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258f9061416e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ff906141ee565b60405180910390fd5b612613838383612cdf565b61261e60008261238b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461266e9190614691565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126c591906145b0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612784838383612df3565b505050565b6127a3828260405180602001604052806000815250612df8565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d39061420e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129cd9190614091565b60405180910390a3505050565b6129e5848484612522565b6129f184848484612e53565b612a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a279061410e565b60405180910390fd5b50505050565b6060600d8054612a45906147bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612a71906147bc565b8015612abe5780601f10612a9357610100808354040283529160200191612abe565b820191906000526020600020905b815481529060010190602001808311612aa157829003601f168201915b5050505050905090565b60606000821415612b10576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c70565b600082905060005b60008214612b42578080612b2b9061481f565b915050600a82612b3b9190614606565b9150612b18565b60008167ffffffffffffffff811115612b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612bb65781602001600182028036833780820191505090505b5090505b60008514612c6957600182612bcf9190614691565b9150600a85612bde9190614868565b6030612bea91906145b0565b60f81b818381518110612c26577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c629190614606565b9450612bba565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612cea838383612fea565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d2d57612d2881612fef565b612d6c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d6b57612d6a8382613038565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612daf57612daa816131a5565b612dee565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ded57612dec82826132e8565b5b5b505050565b505050565b612e028383613367565b612e0f6000848484612e53565b612e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e459061410e565b60405180910390fd5b505050565b6000612e748473ffffffffffffffffffffffffffffffffffffffff16613541565b15612fdd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e9d612383565b8786866040518563ffffffff1660e01b8152600401612ebf9493929190614023565b602060405180830381600087803b158015612ed957600080fd5b505af1925050508015612f0a57506040513d601f19601f82011682018060405250810190612f0791906139f0565b60015b612f8d573d8060008114612f3a576040519150601f19603f3d011682016040523d82523d6000602084013e612f3f565b606091505b50600081511415612f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7c9061410e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fe2565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161304584611786565b61304f9190614691565b9050600060076000848152602001908152602001600020549050818114613134576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131b99190614691565b905060006009600084815260200190815260200160002054905060006008838154811061320f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613257577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806132cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006132f383611786565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ce906142ce565b60405180910390fd5b6133e081612317565b15613420576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134179061418e565b60405180910390fd5b61342c60008383612cdf565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461347c91906145b0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461353d60008383612df3565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613570906147bc565b90600052602060002090601f01602090048101928261359257600085556135d9565b82601f106135ab57805160ff19168380011785556135d9565b828001600101855582156135d9579182015b828111156135d85782518255916020019190600101906135bd565b5b5090506135e691906135ea565b5090565b5b808211156136035760008160009055506001016135eb565b5090565b600061361a613615846144d2565b6144ad565b90508281526020810184848401111561363257600080fd5b61363d84828561477a565b509392505050565b600061365861365384614503565b6144ad565b90508281526020810184848401111561367057600080fd5b61367b84828561477a565b509392505050565b6000813590506136928161501c565b92915050565b60008083601f8401126136aa57600080fd5b8235905067ffffffffffffffff8111156136c357600080fd5b6020830191508360208202830111156136db57600080fd5b9250929050565b6000813590506136f181615033565b92915050565b6000813590506137068161504a565b92915050565b60008151905061371b8161504a565b92915050565b600082601f83011261373257600080fd5b8135613742848260208601613607565b91505092915050565b600082601f83011261375c57600080fd5b813561376c848260208601613645565b91505092915050565b60008135905061378481615061565b92915050565b60008135905061379981615078565b92915050565b6000602082840312156137b157600080fd5b60006137bf84828501613683565b91505092915050565b600080604083850312156137db57600080fd5b60006137e985828601613683565b92505060206137fa85828601613683565b9150509250929050565b60008060006060848603121561381957600080fd5b600061382786828701613683565b935050602061383886828701613683565b925050604061384986828701613775565b9150509250925092565b6000806000806080858703121561386957600080fd5b600061387787828801613683565b945050602061388887828801613683565b935050604061389987828801613775565b925050606085013567ffffffffffffffff8111156138b657600080fd5b6138c287828801613721565b91505092959194509250565b600080604083850312156138e157600080fd5b60006138ef85828601613683565b9250506020613900858286016136e2565b9150509250929050565b6000806040838503121561391d57600080fd5b600061392b85828601613683565b925050602061393c85828601613775565b9150509250929050565b60008060006040848603121561395b57600080fd5b600084013567ffffffffffffffff81111561397557600080fd5b61398186828701613698565b935093505060206139948682870161378a565b9150509250925092565b6000602082840312156139b057600080fd5b60006139be848285016136e2565b91505092915050565b6000602082840312156139d957600080fd5b60006139e7848285016136f7565b91505092915050565b600060208284031215613a0257600080fd5b6000613a108482850161370c565b91505092915050565b600060208284031215613a2b57600080fd5b600082013567ffffffffffffffff811115613a4557600080fd5b613a518482850161374b565b91505092915050565b600060208284031215613a6c57600080fd5b6000613a7a84828501613775565b91505092915050565b600060208284031215613a9557600080fd5b6000613aa38482850161378a565b91505092915050565b6000613ab88383613fb7565b60208301905092915050565b613acd816146f9565b82525050565b6000613ade82614544565b613ae88185614572565b9350613af383614534565b8060005b83811015613b24578151613b0b8882613aac565b9750613b1683614565565b925050600181019050613af7565b5085935050505092915050565b613b3a8161470b565b82525050565b6000613b4b8261454f565b613b558185614583565b9350613b65818560208601614789565b613b6e81614955565b840191505092915050565b6000613b848261455a565b613b8e8185614594565b9350613b9e818560208601614789565b613ba781614955565b840191505092915050565b6000613bbd8261455a565b613bc781856145a5565b9350613bd7818560208601614789565b80840191505092915050565b6000613bf0601d83614594565b9150613bfb82614966565b602082019050919050565b6000613c13602b83614594565b9150613c1e8261498f565b604082019050919050565b6000613c36603283614594565b9150613c41826149de565b604082019050919050565b6000613c59602683614594565b9150613c6482614a2d565b604082019050919050565b6000613c7c602083614594565b9150613c8782614a7c565b602082019050919050565b6000613c9f602583614594565b9150613caa82614aa5565b604082019050919050565b6000613cc2601c83614594565b9150613ccd82614af4565b602082019050919050565b6000613ce5601383614594565b9150613cf082614b1d565b602082019050919050565b6000613d08600f83614594565b9150613d1382614b46565b602082019050919050565b6000613d2b602483614594565b9150613d3682614b6f565b604082019050919050565b6000613d4e601983614594565b9150613d5982614bbe565b602082019050919050565b6000613d71602c83614594565b9150613d7c82614be7565b604082019050919050565b6000613d94603883614594565b9150613d9f82614c36565b604082019050919050565b6000613db7602a83614594565b9150613dc282614c85565b604082019050919050565b6000613dda602983614594565b9150613de582614cd4565b604082019050919050565b6000613dfd601d83614594565b9150613e0882614d23565b602082019050919050565b6000613e20602083614594565b9150613e2b82614d4c565b602082019050919050565b6000613e43602c83614594565b9150613e4e82614d75565b604082019050919050565b6000613e66601883614594565b9150613e7182614dc4565b602082019050919050565b6000613e89602083614594565b9150613e9482614ded565b602082019050919050565b6000613eac602f83614594565b9150613eb782614e16565b604082019050919050565b6000613ecf601e83614594565b9150613eda82614e65565b602082019050919050565b6000613ef2602183614594565b9150613efd82614e8e565b604082019050919050565b6000613f15602283614594565b9150613f2082614edd565b604082019050919050565b6000613f38603183614594565b9150613f4382614f2c565b604082019050919050565b6000613f5b602c83614594565b9150613f6682614f7b565b604082019050919050565b6000613f7e601b83614594565b9150613f8982614fca565b602082019050919050565b6000613fa1601b83614594565b9150613fac82614ff3565b602082019050919050565b613fc081614763565b82525050565b613fcf81614763565b82525050565b613fde8161476d565b82525050565b6000613ff08285613bb2565b9150613ffc8284613bb2565b91508190509392505050565b600060208201905061401d6000830184613ac4565b92915050565b60006080820190506140386000830187613ac4565b6140456020830186613ac4565b6140526040830185613fc6565b81810360608301526140648184613b40565b905095945050505050565b600060208201905081810360008301526140898184613ad3565b905092915050565b60006020820190506140a66000830184613b31565b92915050565b600060208201905081810360008301526140c68184613b79565b905092915050565b600060208201905081810360008301526140e781613be3565b9050919050565b6000602082019050818103600083015261410781613c06565b9050919050565b6000602082019050818103600083015261412781613c29565b9050919050565b6000602082019050818103600083015261414781613c4c565b9050919050565b6000602082019050818103600083015261416781613c6f565b9050919050565b6000602082019050818103600083015261418781613c92565b9050919050565b600060208201905081810360008301526141a781613cb5565b9050919050565b600060208201905081810360008301526141c781613cd8565b9050919050565b600060208201905081810360008301526141e781613cfb565b9050919050565b6000602082019050818103600083015261420781613d1e565b9050919050565b6000602082019050818103600083015261422781613d41565b9050919050565b6000602082019050818103600083015261424781613d64565b9050919050565b6000602082019050818103600083015261426781613d87565b9050919050565b6000602082019050818103600083015261428781613daa565b9050919050565b600060208201905081810360008301526142a781613dcd565b9050919050565b600060208201905081810360008301526142c781613df0565b9050919050565b600060208201905081810360008301526142e781613e13565b9050919050565b6000602082019050818103600083015261430781613e36565b9050919050565b6000602082019050818103600083015261432781613e59565b9050919050565b6000602082019050818103600083015261434781613e7c565b9050919050565b6000602082019050818103600083015261436781613e9f565b9050919050565b6000602082019050818103600083015261438781613ec2565b9050919050565b600060208201905081810360008301526143a781613ee5565b9050919050565b600060208201905081810360008301526143c781613f08565b9050919050565b600060208201905081810360008301526143e781613f2b565b9050919050565b6000602082019050818103600083015261440781613f4e565b9050919050565b6000602082019050818103600083015261442781613f71565b9050919050565b6000602082019050818103600083015261444781613f94565b9050919050565b60006020820190506144636000830184613fc6565b92915050565b600060408201905061447e6000830185613fc6565b61448b6020830184613ac4565b9392505050565b60006020820190506144a76000830184613fd5565b92915050565b60006144b76144c8565b90506144c382826147ee565b919050565b6000604051905090565b600067ffffffffffffffff8211156144ed576144ec614926565b5b6144f682614955565b9050602081019050919050565b600067ffffffffffffffff82111561451e5761451d614926565b5b61452782614955565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145bb82614763565b91506145c683614763565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145fb576145fa614899565b5b828201905092915050565b600061461182614763565b915061461c83614763565b92508261462c5761462b6148c8565b5b828204905092915050565b600061464282614763565b915061464d83614763565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561468657614685614899565b5b828202905092915050565b600061469c82614763565b91506146a783614763565b9250828210156146ba576146b9614899565b5b828203905092915050565b60006146d08261476d565b91506146db8361476d565b9250828210156146ee576146ed614899565b5b828203905092915050565b600061470482614743565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156147a757808201518184015260208101905061478c565b838111156147b6576000848401525b50505050565b600060028204905060018216806147d457607f821691505b602082108114156147e8576147e76148f7565b5b50919050565b6147f782614955565b810181811067ffffffffffffffff8211171561481657614815614926565b5b80604052505050565b600061482a82614763565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561485d5761485c614899565b5b600182019050919050565b600061487382614763565b915061487e83614763565b92508261488e5761488d6148c8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d696e7420436c6f73656420466f726576657200000000000000000000000000600082015250565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f74204d696e7420666f7220746865207a65726f2061646472657373000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f43616e2774206164642061206e756c6c20616464726573730000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820617661696c61626c6520746f2070757263686160008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5072652053616c65204d696e74206973206e6f74206163746976650000000000600082015250565b7f496e7375666669656e742045544820616d6f756e742073656e742e0000000000600082015250565b615025816146f9565b811461503057600080fd5b50565b61503c8161470b565b811461504757600080fd5b50565b61505381614717565b811461505e57600080fd5b50565b61506a81614763565b811461507557600080fd5b50565b6150818161476d565b811461508c57600080fd5b5056fea264697066735822122079d6c2cbb85ba04cecd160b9b82141e1841600928cff9f6057aff68036148baf64736f6c634300080100330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d6655463550704d594b61733857696a37735273414c46317a444b614c33765831413238665261716e44444a642f000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061025c5760003560e01c80636373a6b111610144578063a22cb465116100b6578063e985e9c51161007a578063e985e9c5146108d9578063ec7d099114610916578063ee1cc94414610941578063f2fde38b1461096a578063f4a0a52814610993578063f9f67d6c146109bc5761025c565b8063a22cb465146107e2578063b88d4fde1461080b578063c04a283614610834578063c4e41b2214610871578063c87b56dd1461089c5761025c565b80637d26f470116101085780637d26f470146106f45780638da5cb5b1461071f578063932ecebc1461074a57806395d89b41146107615780639a3bf7281461078c5780639ccb0fea146107b75761025c565b80636373a6b1146106215780636817c76c1461064c57806370a0823114610677578063715018a6146106b457806377b501b9146106cb5761025c565b80633ccfd60b116101dd578063442890d5116101a1578063442890d5146104fd5780634d0550de146105285780634f6ccce71461055357806355f804b3146105905780635b92ac0d146105b95780636352211e146105e45761025c565b80633ccfd60b1461043b5780633cfac5701461045257806340c10f191461047b57806342842e0e14610497578063438b6300146104c05761025c565b80631096952311610224578063109695231461035857806318160ddd1461038157806323b872dd146103ac5780632f745c59146103d55780633b9ee7e4146104125761025c565b8063015963091461026157806301ffc9a71461028a57806306fdde03146102c7578063081812fc146102f2578063095ea7b31461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613946565b6109d8565b005b34801561029657600080fd5b506102b160048036038101906102ac91906139c7565b610ba0565b6040516102be9190614091565b60405180910390f35b3480156102d357600080fd5b506102dc610c1a565b6040516102e991906140ac565b60405180910390f35b3480156102fe57600080fd5b5061031960048036038101906103149190613a5a565b610cac565b6040516103269190614008565b60405180910390f35b34801561033b57600080fd5b506103566004803603810190610351919061390a565b610d31565b005b34801561036457600080fd5b5061037f600480360381019061037a9190613a19565b610e49565b005b34801561038d57600080fd5b50610396610ea2565b6040516103a3919061444e565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190613804565b610eaf565b005b3480156103e157600080fd5b506103fc60048036038101906103f7919061390a565b610f0f565b604051610409919061444e565b60405180910390f35b34801561041e57600080fd5b5061043960048036038101906104349190613a5a565b610fb4565b005b34801561044757600080fd5b50610450610ffd565b005b34801561045e57600080fd5b506104796004803603810190610474919061399e565b61112c565b005b6104956004803603810190610490919061390a565b611188565b005b3480156104a357600080fd5b506104be60048036038101906104b99190613804565b61140e565b005b3480156104cc57600080fd5b506104e760048036038101906104e2919061379f565b61142e565b6040516104f4919061406f565b60405180910390f35b34801561050957600080fd5b50610512611528565b60405161051f9190614008565b60405180910390f35b34801561053457600080fd5b5061053d611537565b60405161054a919061444e565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190613a5a565b61153d565b604051610587919061444e565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190613a19565b6115d4565b005b3480156105c557600080fd5b506105ce61162d565b6040516105db9190614091565b60405180910390f35b3480156105f057600080fd5b5061060b60048036038101906106069190613a5a565b611640565b6040516106189190614008565b60405180910390f35b34801561062d57600080fd5b506106366116f2565b60405161064391906140ac565b60405180910390f35b34801561065857600080fd5b50610661611780565b60405161066e919061444e565b60405180910390f35b34801561068357600080fd5b5061069e6004803603810190610699919061379f565b611786565b6040516106ab919061444e565b60405180910390f35b3480156106c057600080fd5b506106c961183e565b005b3480156106d757600080fd5b506106f260048036038101906106ed919061390a565b6118c6565b005b34801561070057600080fd5b506107096119e9565b6040516107169190614091565b60405180910390f35b34801561072b57600080fd5b506107346119fc565b6040516107419190614008565b60405180910390f35b34801561075657600080fd5b5061075f611a26565b005b34801561076d57600080fd5b50610776611a82565b60405161078391906140ac565b60405180910390f35b34801561079857600080fd5b506107a1611b14565b6040516107ae919061444e565b60405180910390f35b3480156107c357600080fd5b506107cc611b1a565b6040516107d99190614091565b60405180910390f35b3480156107ee57600080fd5b50610809600480360381019061080491906138ce565b611b2d565b005b34801561081757600080fd5b50610832600480360381019061082d9190613853565b611b43565b005b34801561084057600080fd5b5061085b6004803603810190610856919061379f565b611ba5565b6040516108689190614492565b60405180910390f35b34801561087d57600080fd5b50610886611bfb565b604051610893919061444e565b60405180910390f35b3480156108a857600080fd5b506108c360048036038101906108be9190613a5a565b611c0a565b6040516108d091906140ac565b60405180910390f35b3480156108e557600080fd5b5061090060048036038101906108fb91906137c8565b611cb1565b60405161090d9190614091565b60405180910390f35b34801561092257600080fd5b5061092b611d45565b604051610938919061444e565b60405180910390f35b34801561094d57600080fd5b506109686004803603810190610963919061399e565b611d4b565b005b34801561097657600080fd5b50610991600480360381019061098c919061379f565b611dde565b005b34801561099f57600080fd5b506109ba60048036038101906109b59190613a5a565b611ed6565b005b6109d660048036038101906109d19190613a83565b611f1f565b005b3373ffffffffffffffffffffffffffffffffffffffff166109f76119fc565b73ffffffffffffffffffffffffffffffffffffffff1614610a1757600080fd5b60005b83839050811015610b9a57600073ffffffffffffffffffffffffffffffffffffffff16848483818110610a76577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610a8b919061379f565b73ffffffffffffffffffffffffffffffffffffffff161415610ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad99061430e565b60405180910390fd5b8160136000868685818110610b20577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610b35919061379f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610b929061481f565b915050610a1a565b50505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c135750610c1282612235565b5b9050919050565b606060008054610c29906147bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610c55906147bc565b8015610ca25780601f10610c7757610100808354040283529160200191610ca2565b820191906000526020600020905b815481529060010190602001808311610c8557829003601f168201915b5050505050905090565b6000610cb782612317565b610cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ced906142ee565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d3c82611640565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da49061438e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dcc612383565b73ffffffffffffffffffffffffffffffffffffffff161480610dfb5750610dfa81610df5612383565b611cb1565b5b610e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e319061424e565b60405180910390fd5b610e44838361238b565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16610e686119fc565b73ffffffffffffffffffffffffffffffffffffffff1614610e8857600080fd5b80600e9080519060200190610e9e929190613564565b5050565b6000600880549050905090565b610ec0610eba612383565b82612444565b610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef6906143ce565b60405180910390fd5b610f0a838383612522565b505050565b6000610f1a83611786565b8210610f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f52906140ee565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16610fd36119fc565b73ffffffffffffffffffffffffffffffffffffffff1614610ff357600080fd5b80600c8190555050565b3373ffffffffffffffffffffffffffffffffffffffff1661101c6119fc565b73ffffffffffffffffffffffffffffffffffffffff161461103c57600080fd5b6000479050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc612710808461108c9190614637565b6110969190614606565b9081150290604051600060405180830381858888f193505050501580156110c1573d6000803e3d6000fd5b506110ca6119fc565b73ffffffffffffffffffffffffffffffffffffffff166108fc6127106000846110f39190614637565b6110fd9190614606565b9081150290604051600060405180830381858888f19350505050158015611128573d6000803e3d6000fd5b5050565b3373ffffffffffffffffffffffffffffffffffffffff1661114b6119fc565b73ffffffffffffffffffffffffffffffffffffffff161461116b57600080fd5b80600f60016101000a81548160ff02191690831515021790555050565b601054611193610ea2565b11156111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb906141ce565b60405180910390fd5b6111dc6119fc565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461125e57600f60009054906101000a900460ff1661125d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611254906140ce565b60405180910390fd5b5b6010548161126a610ea2565b61127491906145b0565b11156112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac9061414e565b60405180910390fd5b6011548111156112fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f19061436e565b60405180910390fd5b600f60029054906101000a900460ff161561134a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611341906141ae565b60405180910390fd5b80600b546113589190614637565b34101561139a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113919061442e565b60405180910390fd5b60005b81811015611409577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd3556113ce610ea2565b846040516113dd929190614469565b60405180910390a16113f6836113f1610ea2565b612789565b80806114019061481f565b91505061139d565b505050565b61142983838360405180602001604052806000815250611b43565b505050565b6060600061143b83611786565b905060008167ffffffffffffffff81111561147f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156114ad5781602001602082028036833780820191505090505b50905060005b8281101561151d576114c58582610f0f565b8282815181106114fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806115159061481f565b9150506114b3565b508092505050919050565b60006115326119fc565b905090565b60105481565b6000611547610ea2565b8210611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f906143ee565b60405180910390fd5b600882815481106115c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b3373ffffffffffffffffffffffffffffffffffffffff166115f36119fc565b73ffffffffffffffffffffffffffffffffffffffff161461161357600080fd5b80600d9080519060200190611629929190613564565b5050565b600f60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e09061428e565b60405180910390fd5b80915050919050565b600e80546116ff906147bc565b80601f016020809104026020016040519081016040528092919081815260200182805461172b906147bc565b80156117785780601f1061174d57610100808354040283529160200191611778565b820191906000526020600020905b81548152906001019060200180831161175b57829003601f168201915b505050505081565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee9061426e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611846612383565b73ffffffffffffffffffffffffffffffffffffffff166118646119fc565b73ffffffffffffffffffffffffffffffffffffffff16146118ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b19061432e565b60405180910390fd5b6118c460006127a7565b565b3373ffffffffffffffffffffffffffffffffffffffff166118e56119fc565b73ffffffffffffffffffffffffffffffffffffffff161461190557600080fd5b60005b818110156119e457600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611977906142ae565b60405180910390fd5b7f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd3556119a9610ea2565b846040516119b8929190614469565b60405180910390a16119d1836119cc610ea2565b612789565b80806119dc9061481f565b915050611908565b505050565b600f60029054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff16611a456119fc565b73ffffffffffffffffffffffffffffffffffffffff1614611a6557600080fd5b6001600f60026101000a81548160ff021916908315150217905550565b606060018054611a91906147bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611abd906147bc565b8015611b0a5780601f10611adf57610100808354040283529160200191611b0a565b820191906000526020600020905b815481529060010190602001808311611aed57829003601f168201915b5050505050905090565b60115481565b600f60019054906101000a900460ff1681565b611b3f611b38612383565b838361286d565b5050565b611b54611b4e612383565b83612444565b611b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8a906143ce565b60405180910390fd5b611b9f848484846129da565b50505050565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000611c05610ea2565b905090565b6060611c1582612317565b611c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4b9061434e565b60405180910390fd5b6000611c5e612a36565b90506000815111611c7e5760405180602001604052806000815250611ca9565b80611c8884612ac8565b604051602001611c99929190613fe4565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c5481565b3373ffffffffffffffffffffffffffffffffffffffff16611d6a6119fc565b73ffffffffffffffffffffffffffffffffffffffff1614611d8a57600080fd5b80600f60006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f81604051611dd39190614091565b60405180910390a150565b611de6612383565b73ffffffffffffffffffffffffffffffffffffffff16611e046119fc565b73ffffffffffffffffffffffffffffffffffffffff1614611e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e519061432e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec19061412e565b60405180910390fd5b611ed3816127a7565b50565b3373ffffffffffffffffffffffffffffffffffffffff16611ef56119fc565b73ffffffffffffffffffffffffffffffffffffffff1614611f1557600080fd5b80600b8190555050565b601054611f2a610ea2565b1115611f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f62906141ce565b60405180910390fd5b600f60029054906101000a900460ff1615611fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb2906141ae565b60405180910390fd5b600f60019054906101000a900460ff1661200a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120019061440e565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff168160ff16111561209f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612096906143ae565b60405180910390fd5b6010546120aa610ea2565b8260ff166120b891906145b0565b11156120f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f09061414e565b60405180910390fd5b8060ff16600c5461210a9190614637565b34101561214c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121439061442e565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff166121a791906146c5565b92506101000a81548160ff021916908360ff16021790555060005b8160ff16811015612231577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd3556121f6610ea2565b33604051612205929190614469565b60405180910390a161221e33612219610ea2565b612789565b80806122299061481f565b9150506121c2565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061230057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612310575061230f82612c75565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123fe83611640565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061244f82612317565b61248e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124859061422e565b60405180910390fd5b600061249983611640565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061250857508373ffffffffffffffffffffffffffffffffffffffff166124f084610cac565b73ffffffffffffffffffffffffffffffffffffffff16145b8061251957506125188185611cb1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661254282611640565b73ffffffffffffffffffffffffffffffffffffffff1614612598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258f9061416e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ff906141ee565b60405180910390fd5b612613838383612cdf565b61261e60008261238b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461266e9190614691565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126c591906145b0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612784838383612df3565b505050565b6127a3828260405180602001604052806000815250612df8565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d39061420e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129cd9190614091565b60405180910390a3505050565b6129e5848484612522565b6129f184848484612e53565b612a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a279061410e565b60405180910390fd5b50505050565b6060600d8054612a45906147bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612a71906147bc565b8015612abe5780601f10612a9357610100808354040283529160200191612abe565b820191906000526020600020905b815481529060010190602001808311612aa157829003601f168201915b5050505050905090565b60606000821415612b10576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c70565b600082905060005b60008214612b42578080612b2b9061481f565b915050600a82612b3b9190614606565b9150612b18565b60008167ffffffffffffffff811115612b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612bb65781602001600182028036833780820191505090505b5090505b60008514612c6957600182612bcf9190614691565b9150600a85612bde9190614868565b6030612bea91906145b0565b60f81b818381518110612c26577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c629190614606565b9450612bba565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612cea838383612fea565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d2d57612d2881612fef565b612d6c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d6b57612d6a8382613038565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612daf57612daa816131a5565b612dee565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ded57612dec82826132e8565b5b5b505050565b505050565b612e028383613367565b612e0f6000848484612e53565b612e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e459061410e565b60405180910390fd5b505050565b6000612e748473ffffffffffffffffffffffffffffffffffffffff16613541565b15612fdd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e9d612383565b8786866040518563ffffffff1660e01b8152600401612ebf9493929190614023565b602060405180830381600087803b158015612ed957600080fd5b505af1925050508015612f0a57506040513d601f19601f82011682018060405250810190612f0791906139f0565b60015b612f8d573d8060008114612f3a576040519150601f19603f3d011682016040523d82523d6000602084013e612f3f565b606091505b50600081511415612f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7c9061410e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fe2565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161304584611786565b61304f9190614691565b9050600060076000848152602001908152602001600020549050818114613134576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131b99190614691565b905060006009600084815260200190815260200160002054905060006008838154811061320f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613257577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806132cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006132f383611786565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ce906142ce565b60405180910390fd5b6133e081612317565b15613420576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134179061418e565b60405180910390fd5b61342c60008383612cdf565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461347c91906145b0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461353d60008383612df3565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613570906147bc565b90600052602060002090601f01602090048101928261359257600085556135d9565b82601f106135ab57805160ff19168380011785556135d9565b828001600101855582156135d9579182015b828111156135d85782518255916020019190600101906135bd565b5b5090506135e691906135ea565b5090565b5b808211156136035760008160009055506001016135eb565b5090565b600061361a613615846144d2565b6144ad565b90508281526020810184848401111561363257600080fd5b61363d84828561477a565b509392505050565b600061365861365384614503565b6144ad565b90508281526020810184848401111561367057600080fd5b61367b84828561477a565b509392505050565b6000813590506136928161501c565b92915050565b60008083601f8401126136aa57600080fd5b8235905067ffffffffffffffff8111156136c357600080fd5b6020830191508360208202830111156136db57600080fd5b9250929050565b6000813590506136f181615033565b92915050565b6000813590506137068161504a565b92915050565b60008151905061371b8161504a565b92915050565b600082601f83011261373257600080fd5b8135613742848260208601613607565b91505092915050565b600082601f83011261375c57600080fd5b813561376c848260208601613645565b91505092915050565b60008135905061378481615061565b92915050565b60008135905061379981615078565b92915050565b6000602082840312156137b157600080fd5b60006137bf84828501613683565b91505092915050565b600080604083850312156137db57600080fd5b60006137e985828601613683565b92505060206137fa85828601613683565b9150509250929050565b60008060006060848603121561381957600080fd5b600061382786828701613683565b935050602061383886828701613683565b925050604061384986828701613775565b9150509250925092565b6000806000806080858703121561386957600080fd5b600061387787828801613683565b945050602061388887828801613683565b935050604061389987828801613775565b925050606085013567ffffffffffffffff8111156138b657600080fd5b6138c287828801613721565b91505092959194509250565b600080604083850312156138e157600080fd5b60006138ef85828601613683565b9250506020613900858286016136e2565b9150509250929050565b6000806040838503121561391d57600080fd5b600061392b85828601613683565b925050602061393c85828601613775565b9150509250929050565b60008060006040848603121561395b57600080fd5b600084013567ffffffffffffffff81111561397557600080fd5b61398186828701613698565b935093505060206139948682870161378a565b9150509250925092565b6000602082840312156139b057600080fd5b60006139be848285016136e2565b91505092915050565b6000602082840312156139d957600080fd5b60006139e7848285016136f7565b91505092915050565b600060208284031215613a0257600080fd5b6000613a108482850161370c565b91505092915050565b600060208284031215613a2b57600080fd5b600082013567ffffffffffffffff811115613a4557600080fd5b613a518482850161374b565b91505092915050565b600060208284031215613a6c57600080fd5b6000613a7a84828501613775565b91505092915050565b600060208284031215613a9557600080fd5b6000613aa38482850161378a565b91505092915050565b6000613ab88383613fb7565b60208301905092915050565b613acd816146f9565b82525050565b6000613ade82614544565b613ae88185614572565b9350613af383614534565b8060005b83811015613b24578151613b0b8882613aac565b9750613b1683614565565b925050600181019050613af7565b5085935050505092915050565b613b3a8161470b565b82525050565b6000613b4b8261454f565b613b558185614583565b9350613b65818560208601614789565b613b6e81614955565b840191505092915050565b6000613b848261455a565b613b8e8185614594565b9350613b9e818560208601614789565b613ba781614955565b840191505092915050565b6000613bbd8261455a565b613bc781856145a5565b9350613bd7818560208601614789565b80840191505092915050565b6000613bf0601d83614594565b9150613bfb82614966565b602082019050919050565b6000613c13602b83614594565b9150613c1e8261498f565b604082019050919050565b6000613c36603283614594565b9150613c41826149de565b604082019050919050565b6000613c59602683614594565b9150613c6482614a2d565b604082019050919050565b6000613c7c602083614594565b9150613c8782614a7c565b602082019050919050565b6000613c9f602583614594565b9150613caa82614aa5565b604082019050919050565b6000613cc2601c83614594565b9150613ccd82614af4565b602082019050919050565b6000613ce5601383614594565b9150613cf082614b1d565b602082019050919050565b6000613d08600f83614594565b9150613d1382614b46565b602082019050919050565b6000613d2b602483614594565b9150613d3682614b6f565b604082019050919050565b6000613d4e601983614594565b9150613d5982614bbe565b602082019050919050565b6000613d71602c83614594565b9150613d7c82614be7565b604082019050919050565b6000613d94603883614594565b9150613d9f82614c36565b604082019050919050565b6000613db7602a83614594565b9150613dc282614c85565b604082019050919050565b6000613dda602983614594565b9150613de582614cd4565b604082019050919050565b6000613dfd601d83614594565b9150613e0882614d23565b602082019050919050565b6000613e20602083614594565b9150613e2b82614d4c565b602082019050919050565b6000613e43602c83614594565b9150613e4e82614d75565b604082019050919050565b6000613e66601883614594565b9150613e7182614dc4565b602082019050919050565b6000613e89602083614594565b9150613e9482614ded565b602082019050919050565b6000613eac602f83614594565b9150613eb782614e16565b604082019050919050565b6000613ecf601e83614594565b9150613eda82614e65565b602082019050919050565b6000613ef2602183614594565b9150613efd82614e8e565b604082019050919050565b6000613f15602283614594565b9150613f2082614edd565b604082019050919050565b6000613f38603183614594565b9150613f4382614f2c565b604082019050919050565b6000613f5b602c83614594565b9150613f6682614f7b565b604082019050919050565b6000613f7e601b83614594565b9150613f8982614fca565b602082019050919050565b6000613fa1601b83614594565b9150613fac82614ff3565b602082019050919050565b613fc081614763565b82525050565b613fcf81614763565b82525050565b613fde8161476d565b82525050565b6000613ff08285613bb2565b9150613ffc8284613bb2565b91508190509392505050565b600060208201905061401d6000830184613ac4565b92915050565b60006080820190506140386000830187613ac4565b6140456020830186613ac4565b6140526040830185613fc6565b81810360608301526140648184613b40565b905095945050505050565b600060208201905081810360008301526140898184613ad3565b905092915050565b60006020820190506140a66000830184613b31565b92915050565b600060208201905081810360008301526140c68184613b79565b905092915050565b600060208201905081810360008301526140e781613be3565b9050919050565b6000602082019050818103600083015261410781613c06565b9050919050565b6000602082019050818103600083015261412781613c29565b9050919050565b6000602082019050818103600083015261414781613c4c565b9050919050565b6000602082019050818103600083015261416781613c6f565b9050919050565b6000602082019050818103600083015261418781613c92565b9050919050565b600060208201905081810360008301526141a781613cb5565b9050919050565b600060208201905081810360008301526141c781613cd8565b9050919050565b600060208201905081810360008301526141e781613cfb565b9050919050565b6000602082019050818103600083015261420781613d1e565b9050919050565b6000602082019050818103600083015261422781613d41565b9050919050565b6000602082019050818103600083015261424781613d64565b9050919050565b6000602082019050818103600083015261426781613d87565b9050919050565b6000602082019050818103600083015261428781613daa565b9050919050565b600060208201905081810360008301526142a781613dcd565b9050919050565b600060208201905081810360008301526142c781613df0565b9050919050565b600060208201905081810360008301526142e781613e13565b9050919050565b6000602082019050818103600083015261430781613e36565b9050919050565b6000602082019050818103600083015261432781613e59565b9050919050565b6000602082019050818103600083015261434781613e7c565b9050919050565b6000602082019050818103600083015261436781613e9f565b9050919050565b6000602082019050818103600083015261438781613ec2565b9050919050565b600060208201905081810360008301526143a781613ee5565b9050919050565b600060208201905081810360008301526143c781613f08565b9050919050565b600060208201905081810360008301526143e781613f2b565b9050919050565b6000602082019050818103600083015261440781613f4e565b9050919050565b6000602082019050818103600083015261442781613f71565b9050919050565b6000602082019050818103600083015261444781613f94565b9050919050565b60006020820190506144636000830184613fc6565b92915050565b600060408201905061447e6000830185613fc6565b61448b6020830184613ac4565b9392505050565b60006020820190506144a76000830184613fd5565b92915050565b60006144b76144c8565b90506144c382826147ee565b919050565b6000604051905090565b600067ffffffffffffffff8211156144ed576144ec614926565b5b6144f682614955565b9050602081019050919050565b600067ffffffffffffffff82111561451e5761451d614926565b5b61452782614955565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145bb82614763565b91506145c683614763565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145fb576145fa614899565b5b828201905092915050565b600061461182614763565b915061461c83614763565b92508261462c5761462b6148c8565b5b828204905092915050565b600061464282614763565b915061464d83614763565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561468657614685614899565b5b828202905092915050565b600061469c82614763565b91506146a783614763565b9250828210156146ba576146b9614899565b5b828203905092915050565b60006146d08261476d565b91506146db8361476d565b9250828210156146ee576146ed614899565b5b828203905092915050565b600061470482614743565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156147a757808201518184015260208101905061478c565b838111156147b6576000848401525b50505050565b600060028204905060018216806147d457607f821691505b602082108114156147e8576147e76148f7565b5b50919050565b6147f782614955565b810181811067ffffffffffffffff8211171561481657614815614926565b5b80604052505050565b600061482a82614763565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561485d5761485c614899565b5b600182019050919050565b600061487382614763565b915061487e83614763565b92508261488e5761488d6148c8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d696e7420436c6f73656420466f726576657200000000000000000000000000600082015250565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f74204d696e7420666f7220746865207a65726f2061646472657373000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f43616e2774206164642061206e756c6c20616464726573730000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820617661696c61626c6520746f2070757263686160008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5072652053616c65204d696e74206973206e6f74206163746976650000000000600082015250565b7f496e7375666669656e742045544820616d6f756e742073656e742e0000000000600082015250565b615025816146f9565b811461503057600080fd5b50565b61503c8161470b565b811461504757600080fd5b50565b61505381614717565b811461505e57600080fd5b50565b61506a81614763565b811461507557600080fd5b50565b6150818161476d565b811461508c57600080fd5b5056fea264697066735822122079d6c2cbb85ba04cecd160b9b82141e1841600928cff9f6057aff68036148baf64736f6c63430008010033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d6655463550704d594b61733857696a37735273414c46317a444b614c33765831413238665261716e44444a642f000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): https://gateway.pinata.cloud/ipfs/QmfUF5PpMYKas8Wij7sRsALF1zDKaL3vX1A28fRaqnDDJd/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [2] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [3] : 732f516d6655463550704d594b61733857696a37735273414c46317a444b614c
Arg [4] : 33765831413238665261716e44444a642f000000000000000000000000000000


Deployed Bytecode Sourcemap

178:4578:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1372:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;989:222:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2423:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3934:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3472:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1774:117:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1614:111:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4661:330:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1290:253:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2101:127:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4550:204;;;;;;;;;;;;;:::i;:::-;;1232:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2952:645;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5057:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4240:306:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2424:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;509:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1797:230:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1895:99:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;386:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2126:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;352:29:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;234:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1864:205:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:11;;;;;;;;;;;;;:::i;:::-;;2621:327:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;465:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1029:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2232:95:13;;;;;;;;;;;;;:::i;:::-;;2585:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;552:50:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;422:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4218:153:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5302:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1664:106:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2331:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2753:329:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4437:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;277:46:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1114:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1911:198:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1998:99:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3601:635;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1372:288;1087:10;1076:21;;:7;:5;:7::i;:::-;:21;;;1068:30;;;;;;1485:9:::1;1480:176;1504:9;;:16;;1500:1;:20;1480:176;;;1567:1;1543:26;;:9;;1553:1;1543:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:26;;;;1535:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1633:16;1606:10;:24;1617:9;;1627:1;1617:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1606:24;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;1522:3;;;;;:::i;:::-;;;;1480:176;;;;1372:288:::0;;;:::o;989:222:5:-;1091:4;1129:35;1114:50;;;:11;:50;;;;:90;;;;1168:36;1192:11;1168:23;:36::i;:::-;1114:90;1107:97;;989:222;;;:::o;2423:98:4:-;2477:13;2509:5;2502:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2423:98;:::o;3934:217::-;4010:7;4037:16;4045:7;4037;:16::i;:::-;4029:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4120:15;:24;4136:7;4120:24;;;;;;;;;;;;;;;;;;;;;4113:31;;3934:217;;;:::o;3472:401::-;3552:13;3568:23;3583:7;3568:14;:23::i;:::-;3552:39;;3615:5;3609:11;;:2;:11;;;;3601:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3706:5;3690:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3715:37;3732:5;3739:12;:10;:12::i;:::-;3715:16;:37::i;:::-;3690:62;3669:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3845:21;3854:2;3858:7;3845:8;:21::i;:::-;3472:401;;;:::o;1774:117:13:-;1087:10;1076:21;;:7;:5;:7::i;:::-;:21;;;1068:30;;;;;;1872:14:::1;1859:10;:27;;;;;;;;;;;;:::i;:::-;;1774:117:::0;:::o;1614:111:5:-;1675:7;1701:10;:17;;;;1694:24;;1614:111;:::o;4661:330:4:-;4850:41;4869:12;:10;:12::i;:::-;4883:7;4850:18;:41::i;:::-;4842:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4956:28;4966:4;4972:2;4976:7;4956:9;:28::i;:::-;4661:330;;;:::o;1290:253:5:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1510:12;:19;1523:5;1510:19;;;;;;;;;;;;;;;:26;1530:5;1510:26;;;;;;;;;;;;1503:33;;1290:253;;;;:::o;2101:127:13:-;1087:10;1076:21;;:7;:5;:7::i;:::-;:21;;;1068:30;;;;;;2206:17:::1;2187:16;:36;;;;2101:127:::0;:::o;4550:204::-;1087:10;1076:21;;:7;:5;:7::i;:::-;:21;;;1068:30;;;;;;4600:12:::1;4615:21;4600:36;;4650:12;;;;;;;;;;;4642:30;;:55;4691:5;4683::::0;4673:7:::1;:15;;;;:::i;:::-;:23;;;;:::i;:::-;4642:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;4711:7;:5;:7::i;:::-;4703:25;;:46;4743:5;4739:1;4729:7;:11;;;;:::i;:::-;:19;;;;:::i;:::-;4703:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1104:1;4550:204::o:0;1232:136::-;1087:10;1076:21;;:7;:5;:7::i;:::-;:21;;;1068:30;;;;;;1343:20:::1;1321:19;;:42;;;;;;;;;;;;;;;;;;1232:136:::0;:::o;2952:645::-;983:17;;966:13;:11;:13::i;:::-;:34;;958:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;3045:7:::1;:5;:7::i;:::-;3031:21;;:10;:21;;;3027:96;;3070:12;;;;;;;;;;;3062:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;3027:96;3163:17;;3153:6;3137:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:43;;3129:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;3248:31;;3238:6;:41;;3223:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;3340:19;;;;;;;;;;;3339:20;3331:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3423:6;3411:9;;:18;;;;:::i;:::-;3398:9;:31;;3390:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;3473:9;3468:125;3492:6;3488:1;:10;3468:125;;;3518:31;3530:13;:11;:13::i;:::-;3545:3;3518:31;;;;;;;:::i;:::-;;;;;;;;3557:29;3567:3;3572:13;:11;:13::i;:::-;3557:9;:29::i;:::-;3500:3;;;;;:::i;:::-;;;;3468:125;;;;2952:645:::0;;:::o;5057:179:4:-;5190:39;5207:4;5213:2;5217:7;5190:39;;;;;;;;;;;;:16;:39::i;:::-;5057:179;;;:::o;4240:306:13:-;4301:16;4325:15;4343:17;4353:6;4343:9;:17::i;:::-;4325:35;;4366:25;4408:10;4394:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4366:53;;4430:6;4426:95;4446:10;4442:1;:14;4426:95;;;4484:30;4504:6;4512:1;4484:19;:30::i;:::-;4470:8;4479:1;4470:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;4458:3;;;;;:::i;:::-;;;;4426:95;;;;4533:8;4526:15;;;;4240:306;;;:::o;2424:83::-;2473:7;2495;:5;:7::i;:::-;2488:14;;2424:83;:::o;509:39::-;;;;:::o;1797:230:5:-;1872:7;1907:30;:28;:30::i;:::-;1899:5;:38;1891:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2003:10;2014:5;2003:17;;;;;;;;;;;;;;;;;;;;;;;;1996:24;;1797:230;;;:::o;1895:99:13:-;1087:10;1076:21;;:7;:5;:7::i;:::-;:21;;;1068:30;;;;;;1982:7:::1;1966:13;:23;;;;;;;;;;;;:::i;:::-;;1895:99:::0;:::o;386:32::-;;;;;;;;;;;;;:::o;2126:235:4:-;2198:7;2217:13;2233:7;:16;2241:7;2233:16;;;;;;;;;;;;;;;;;;;;;2217:32;;2284:1;2267:19;;:5;:19;;;;2259:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2349:5;2342:12;;;2126:235;;;:::o;352:29:13:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;234:39::-;;;;:::o;1864:205:4:-;1936:7;1980:1;1963:19;;:5;:19;;;;1955:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2046:9;:16;2056:5;2046:16;;;;;;;;;;;;;;;;2039:23;;1864:205;;;:::o;1661:101:11:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;2621:327:13:-;1087:10;1076:21;;:7;:5;:7::i;:::-;:21;;;1068:30;;;;;;2725:9:::1;2720:224;2744:6;2740:1;:10;2720:224;;;2798:1;2773:27;;:14;:27;;;;2765:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2847:42;2859:13;:11;:13::i;:::-;2874:14;2847:42;;;;;;;:::i;:::-;;;;;;;;2897:40;2907:14;2923:13;:11;:13::i;:::-;2897:9;:40::i;:::-;2752:3;;;;;:::i;:::-;;;;2720:224;;;;2621:327:::0;;:::o;465:39::-;;;;;;;;;;;;;:::o;1029:85:11:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;2232:95:13:-;1087:10;1076:21;;:7;:5;:7::i;:::-;:21;;;1068:30;;;;;;2318:4:::1;2296:19;;:26;;;;;;;;;;;;;;;;;;2232:95::o:0;2585:102:4:-;2641:13;2673:7;2666:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2585:102;:::o;552:50:13:-;;;;:::o;422:39::-;;;;;;;;;;;;;:::o;4218:153:4:-;4312:52;4331:12;:10;:12::i;:::-;4345:8;4355;4312:18;:52::i;:::-;4218:153;;:::o;5302:320::-;5471:41;5490:12;:10;:12::i;:::-;5504:7;5471:18;:41::i;:::-;5463:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5576:39;5590:4;5596:2;5600:7;5609:5;5576:13;:39::i;:::-;5302:320;;;;:::o;1664:106:13:-;1729:5;1749:10;:16;1760:4;1749:16;;;;;;;;;;;;;;;;;;;;;;;;;1742:23;;1664:106;;;:::o;2331:89::-;2380:7;2402:13;:11;:13::i;:::-;2395:20;;2331:89;:::o;2753:329:4:-;2826:13;2859:16;2867:7;2859;:16::i;:::-;2851:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2938:21;2962:10;:8;:10::i;:::-;2938:34;;3013:1;2995:7;2989:21;:25;:86;;;;;;;;;;;;;;;;;3041:7;3050:18;:7;:16;:18::i;:::-;3024:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2989:86;2982:93;;;2753:329;;;:::o;4437:162::-;4534:4;4557:18;:25;4576:5;4557:25;;;;;;;;;;;;;;;:35;4583:8;4557:35;;;;;;;;;;;;;;;;;;;;;;;;;4550:42;;4437:162;;;;:::o;277:46:13:-;;;;:::o;1114:114::-;1087:10;1076:21;;:7;:5;:7::i;:::-;:21;;;1068:30;;;;;;1190:3:::1;1175:12;;:18;;;;;;;;;;;;;;;;;;1204:19;1219:3;1204:19;;;;;;:::i;:::-;;;;;;;;1114:114:::0;:::o;1911:198:11:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;1998:99:13:-;1087:10;1076:21;;:7;:5;:7::i;:::-;:21;;;1068:30;;;;;;2082:10:::1;2070:9;:22;;;;1998:99:::0;:::o;3601:635::-;983:17;;966:13;:11;:13::i;:::-;:34;;958:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;3677:19:::1;;;;;;;;;;;3676:20;3668:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3734:19;;;;;;;;;;;3726:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;3809:10;:22;3820:10;3809:22;;;;;;;;;;;;;;;;;;;;;;;;;3799:32;;:6;:32;;;;3791:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;3910:17;;3893:13;:11;:13::i;:::-;3884:6;:22;;;;;;:::i;:::-;:43;;3876:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;4010:6;3991:25;;:16;;:25;;;;:::i;:::-;3978:9;:38;;3970:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;4081:6;4055:10;:22;4066:10;4055:22;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4098:9;4093:139;4117:6;4113:10;;:1;:10;4093:139;;;4143:38;4155:13;:11;:13::i;:::-;4170:10;4143:38;;;;;;;:::i;:::-;;;;;;;;4189:36;4199:10;4211:13;:11;:13::i;:::-;4189:9;:36::i;:::-;4125:3;;;;;:::i;:::-;;;;4093:139;;;;3601:635:::0;:::o;1505:300:4:-;1607:4;1657:25;1642:40;;;:11;:40;;;;:104;;;;1713:33;1698:48;;;:11;:48;;;;1642:104;:156;;;;1762:36;1786:11;1762:23;:36::i;:::-;1642:156;1623:175;;1505:300;;;:::o;7094:125::-;7159:4;7210:1;7182:30;;:7;:16;7190:7;7182:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7175:37;;7094:125;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;11103:171:4:-;11204:2;11177:15;:24;11193:7;11177:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11259:7;11255:2;11221:46;;11230:23;11245:7;11230:14;:23::i;:::-;11221:46;;;;;;;;;;;;11103:171;;:::o;7377:344::-;7470:4;7494:16;7502:7;7494;:16::i;:::-;7486:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7569:13;7585:23;7600:7;7585:14;:23::i;:::-;7569:39;;7637:5;7626:16;;:7;:16;;;:51;;;;7670:7;7646:31;;:20;7658:7;7646:11;:20::i;:::-;:31;;;7626:51;:87;;;;7681:32;7698:5;7705:7;7681:16;:32::i;:::-;7626:87;7618:96;;;7377:344;;;;:::o;10387:605::-;10541:4;10514:31;;:23;10529:7;10514:14;:23::i;:::-;:31;;;10506:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10619:1;10605:16;;:2;:16;;;;10597:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10673:39;10694:4;10700:2;10704:7;10673:20;:39::i;:::-;10774:29;10791:1;10795:7;10774:8;:29::i;:::-;10833:1;10814:9;:15;10824:4;10814:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10861:1;10844:9;:13;10854:2;10844:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10891:2;10872:7;:16;10880:7;10872:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10928:7;10924:2;10909:27;;10918:4;10909:27;;;;;;;;;;;;10947:38;10967:4;10973:2;10977:7;10947:19;:38::i;:::-;10387:605;;;:::o;8051:108::-;8126:26;8136:2;8140:7;8126:26;;;;;;;;;;;;:9;:26::i;:::-;8051:108;;:::o;2263:187:11:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2263:187;;:::o;11409:307:4:-;11559:8;11550:17;;:5;:17;;;;11542:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11645:8;11607:18;:25;11626:5;11607:25;;;;;;;;;;;;;;;:35;11633:8;11607:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11690:8;11668:41;;11683:5;11668:41;;;11700:8;11668:41;;;;;;:::i;:::-;;;;;;;;11409:307;;;:::o;6484:::-;6635:28;6645:4;6651:2;6655:7;6635:9;:28::i;:::-;6681:48;6704:4;6710:2;6714:7;6723:5;6681:22;:48::i;:::-;6673:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6484:307;;;;:::o;2511:106:13:-;2571:13;2599;2592:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2511:106;:::o;328:703:12:-;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;829:155:3:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;2623:572:5:-;2762:45;2789:4;2795:2;2799:7;2762:26;:45::i;:::-;2838:1;2822:18;;:4;:18;;;2818:183;;;2856:40;2888:7;2856:31;:40::i;:::-;2818:183;;;2925:2;2917:10;;:4;:10;;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2913:88;2818:183;3028:1;3014:16;;:2;:16;;;3010:179;;;3046:45;3083:7;3046:36;:45::i;:::-;3010:179;;;3118:4;3112:10;;:2;:10;;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;:::-;3108:81;3010:179;2623:572;;;:::o;14097:121:4:-;;;;:::o;8380:311::-;8505:18;8511:2;8515:7;8505:5;:18::i;:::-;8554:54;8585:1;8589:2;8593:7;8602:5;8554:22;:54::i;:::-;8533:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8380:311;;;:::o;12269:778::-;12419:4;12439:15;:2;:13;;;:15::i;:::-;12435:606;;;12490:2;12474:36;;;12511:12;:10;:12::i;:::-;12525:4;12531:7;12540:5;12474:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12470:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12730:1;12713:6;:13;:18;12709:266;;;12755:60;;;;;;;;;;:::i;:::-;;;;;;;;12709:266;12927:6;12921:13;12912:6;12908:2;12904:15;12897:38;12470:519;12606:41;;;12596:51;;;:6;:51;;;;12589:58;;;;;12435:606;13026:4;13019:11;;12269:778;;;;;;;:::o;13603:122::-;;;;:::o;3901:161:5:-;4004:10;:17;;;;3977:15;:24;3993:7;3977:24;;;;;;;;;;;:44;;;;4031:10;4047:7;4031:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3901:161;:::o;4679:970::-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;4941:51;;5002:18;5023:17;:26;5041:7;5023:26;;;;;;;;;;;;5002:47;;5167:14;5153:10;:28;5149:323;;5197:19;5219:12;:18;5232:4;5219:18;;;;;;;;;;;;;;;:34;5238:14;5219:34;;;;;;;;;;;;5197:56;;5301:11;5268:12;:18;5281:4;5268:18;;;;;;;;;;;;;;;:30;5287:10;5268:30;;;;;;;;;;;:44;;;;5417:10;5384:17;:30;5402:11;5384:30;;;;;;;;;;;:43;;;;5149:323;;5565:17;:26;5583:7;5565:26;;;;;;;;;;;5558:33;;;5608:12;:18;5621:4;5608:18;;;;;;;;;;;;;;;:34;5627:14;5608:34;;;;;;;;;;;5601:41;;;4679:970;;;;:::o;5937:1061::-;6186:22;6231:1;6211:10;:17;;;;:21;;;;:::i;:::-;6186:46;;6242:18;6263:15;:24;6279:7;6263:24;;;;;;;;;;;;6242:45;;6609:19;6631:10;6642:14;6631:26;;;;;;;;;;;;;;;;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6803:10;6772:15;:28;6788:11;6772:28;;;;;;;;;;;:41;;;;6941:15;:24;6957:7;6941:24;;;;;;;;;;;6934:31;;;6975:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5937:1061;;;;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;3573:37;;3647:7;3620:12;:16;3633:2;3620:16;;;;;;;;;;;;;;;:24;3637:6;3620:24;;;;;;;;;;;:34;;;;3693:6;3664:17;:26;3682:7;3664:26;;;;;;;;;;;:35;;;;3489:217;;;:::o;9013:427:4:-;9106:1;9092:16;;:2;:16;;;;9084:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9164:16;9172:7;9164;:16::i;:::-;9163:17;9155:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9224:45;9253:1;9257:2;9261:7;9224:20;:45::i;:::-;9297:1;9280:9;:13;9290:2;9280:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9327:2;9308:7;:16;9316:7;9308:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9370:7;9366:2;9345:33;;9362:1;9345:33;;;;;;;;;;;;9389:44;9417:1;9421:2;9425:7;9389:19;:44::i;:::-;9013:427;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:14:-;;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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;;;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:137::-;;1464:6;1451:20;1442:29;;1480:32;1506:5;1480:32;:::i;:::-;1432:86;;;;:::o;1524:141::-;;1611:6;1605:13;1596:22;;1627:32;1653:5;1627:32;:::i;:::-;1586:79;;;;:::o;1684:271::-;;1788:3;1781:4;1773:6;1769:17;1765:27;1755:2;;1806:1;1803;1796:12;1755:2;1846:6;1833:20;1871:78;1945:3;1937:6;1930:4;1922:6;1918:17;1871:78;:::i;:::-;1862:87;;1745:210;;;;;:::o;1975:273::-;;2080:3;2073:4;2065:6;2061:17;2057:27;2047:2;;2098:1;2095;2088:12;2047:2;2138:6;2125:20;2163:79;2238:3;2230:6;2223:4;2215:6;2211:17;2163:79;:::i;:::-;2154:88;;2037:211;;;;;:::o;2254:139::-;;2338:6;2325:20;2316:29;;2354:33;2381:5;2354:33;:::i;:::-;2306:87;;;;:::o;2399:135::-;;2481:6;2468:20;2459:29;;2497:31;2522:5;2497:31;:::i;:::-;2449:85;;;;:::o;2540:262::-;;2648:2;2636:9;2627:7;2623:23;2619:32;2616:2;;;2664:1;2661;2654:12;2616:2;2707:1;2732:53;2777:7;2768:6;2757:9;2753:22;2732:53;:::i;:::-;2722:63;;2678:117;2606:196;;;;:::o;2808:407::-;;;2933:2;2921:9;2912:7;2908:23;2904:32;2901:2;;;2949:1;2946;2939:12;2901:2;2992:1;3017:53;3062:7;3053:6;3042:9;3038:22;3017:53;:::i;:::-;3007:63;;2963:117;3119:2;3145:53;3190:7;3181:6;3170:9;3166:22;3145:53;:::i;:::-;3135:63;;3090:118;2891:324;;;;;:::o;3221:552::-;;;;3363:2;3351:9;3342:7;3338:23;3334:32;3331:2;;;3379:1;3376;3369:12;3331:2;3422:1;3447:53;3492:7;3483:6;3472:9;3468:22;3447:53;:::i;:::-;3437:63;;3393:117;3549:2;3575:53;3620:7;3611:6;3600:9;3596:22;3575:53;:::i;:::-;3565:63;;3520:118;3677:2;3703:53;3748:7;3739:6;3728:9;3724:22;3703:53;:::i;:::-;3693:63;;3648:118;3321:452;;;;;:::o;3779:809::-;;;;;3947:3;3935:9;3926:7;3922:23;3918:33;3915:2;;;3964:1;3961;3954:12;3915:2;4007:1;4032:53;4077:7;4068:6;4057:9;4053:22;4032:53;:::i;:::-;4022:63;;3978:117;4134:2;4160:53;4205:7;4196:6;4185:9;4181:22;4160:53;:::i;:::-;4150:63;;4105:118;4262:2;4288:53;4333:7;4324:6;4313:9;4309:22;4288:53;:::i;:::-;4278:63;;4233:118;4418:2;4407:9;4403:18;4390:32;4449:18;4441:6;4438:30;4435:2;;;4481:1;4478;4471:12;4435:2;4509:62;4563:7;4554:6;4543:9;4539:22;4509:62;:::i;:::-;4499:72;;4361:220;3905:683;;;;;;;:::o;4594:401::-;;;4716:2;4704:9;4695:7;4691:23;4687:32;4684:2;;;4732:1;4729;4722:12;4684:2;4775:1;4800:53;4845:7;4836:6;4825:9;4821:22;4800:53;:::i;:::-;4790:63;;4746:117;4902:2;4928:50;4970:7;4961:6;4950:9;4946:22;4928:50;:::i;:::-;4918:60;;4873:115;4674:321;;;;;:::o;5001:407::-;;;5126:2;5114:9;5105:7;5101:23;5097:32;5094:2;;;5142:1;5139;5132:12;5094:2;5185:1;5210:53;5255:7;5246:6;5235:9;5231:22;5210:53;:::i;:::-;5200:63;;5156:117;5312:2;5338:53;5383:7;5374:6;5363:9;5359:22;5338:53;:::i;:::-;5328:63;;5283:118;5084:324;;;;;:::o;5414:566::-;;;;5572:2;5560:9;5551:7;5547:23;5543:32;5540:2;;;5588:1;5585;5578:12;5540:2;5659:1;5648:9;5644:17;5631:31;5689:18;5681:6;5678:30;5675:2;;;5721:1;5718;5711:12;5675:2;5757:80;5829:7;5820:6;5809:9;5805:22;5757:80;:::i;:::-;5739:98;;;;5602:245;5886:2;5912:51;5955:7;5946:6;5935:9;5931:22;5912:51;:::i;:::-;5902:61;;5857:116;5530:450;;;;;:::o;5986:256::-;;6091:2;6079:9;6070:7;6066:23;6062:32;6059:2;;;6107:1;6104;6097:12;6059:2;6150:1;6175:50;6217:7;6208:6;6197:9;6193:22;6175:50;:::i;:::-;6165:60;;6121:114;6049:193;;;;:::o;6248:260::-;;6355:2;6343:9;6334:7;6330:23;6326:32;6323:2;;;6371:1;6368;6361:12;6323:2;6414:1;6439:52;6483:7;6474:6;6463:9;6459:22;6439:52;:::i;:::-;6429:62;;6385:116;6313:195;;;;:::o;6514:282::-;;6632:2;6620:9;6611:7;6607:23;6603:32;6600:2;;;6648:1;6645;6638:12;6600:2;6691:1;6716:63;6771:7;6762:6;6751:9;6747:22;6716:63;:::i;:::-;6706:73;;6662:127;6590:206;;;;:::o;6802:375::-;;6920:2;6908:9;6899:7;6895:23;6891:32;6888:2;;;6936:1;6933;6926:12;6888:2;7007:1;6996:9;6992:17;6979:31;7037:18;7029:6;7026:30;7023:2;;;7069:1;7066;7059:12;7023:2;7097:63;7152:7;7143:6;7132:9;7128:22;7097:63;:::i;:::-;7087:73;;6950:220;6878:299;;;;:::o;7183:262::-;;7291:2;7279:9;7270:7;7266:23;7262:32;7259:2;;;7307:1;7304;7297:12;7259:2;7350:1;7375:53;7420:7;7411:6;7400:9;7396:22;7375:53;:::i;:::-;7365:63;;7321:117;7249:196;;;;:::o;7451:258::-;;7557:2;7545:9;7536:7;7532:23;7528:32;7525:2;;;7573:1;7570;7563:12;7525:2;7616:1;7641:51;7684:7;7675:6;7664:9;7660:22;7641:51;:::i;:::-;7631:61;;7587:115;7515:194;;;;:::o;7715:179::-;;7805:46;7847:3;7839:6;7805:46;:::i;:::-;7883:4;7878:3;7874:14;7860:28;;7795:99;;;;:::o;7900:118::-;7987:24;8005:5;7987:24;:::i;:::-;7982:3;7975:37;7965:53;;:::o;8054:732::-;;8202:54;8250:5;8202:54;:::i;:::-;8272:86;8351:6;8346:3;8272:86;:::i;:::-;8265:93;;8382:56;8432:5;8382:56;:::i;:::-;8461:7;8492:1;8477:284;8502:6;8499:1;8496:13;8477:284;;;8578:6;8572:13;8605:63;8664:3;8649:13;8605:63;:::i;:::-;8598:70;;8691:60;8744:6;8691:60;:::i;:::-;8681:70;;8537:224;8524:1;8521;8517:9;8512:14;;8477:284;;;8481:14;8777:3;8770:10;;8178:608;;;;;;;:::o;8792:109::-;8873:21;8888:5;8873:21;:::i;:::-;8868:3;8861:34;8851:50;;:::o;8907:360::-;;9021:38;9053:5;9021:38;:::i;:::-;9075:70;9138:6;9133:3;9075:70;:::i;:::-;9068:77;;9154:52;9199:6;9194:3;9187:4;9180:5;9176:16;9154:52;:::i;:::-;9231:29;9253:6;9231:29;:::i;:::-;9226:3;9222:39;9215:46;;8997:270;;;;;:::o;9273:364::-;;9389:39;9422:5;9389:39;:::i;:::-;9444:71;9508:6;9503:3;9444:71;:::i;:::-;9437:78;;9524:52;9569:6;9564:3;9557:4;9550:5;9546:16;9524:52;:::i;:::-;9601:29;9623:6;9601:29;:::i;:::-;9596:3;9592:39;9585:46;;9365:272;;;;;:::o;9643:377::-;;9777:39;9810:5;9777:39;:::i;:::-;9832:89;9914:6;9909:3;9832:89;:::i;:::-;9825:96;;9930:52;9975:6;9970:3;9963:4;9956:5;9952:16;9930:52;:::i;:::-;10007:6;10002:3;9998:16;9991:23;;9753:267;;;;;:::o;10026:366::-;;10189:67;10253:2;10248:3;10189:67;:::i;:::-;10182:74;;10265:93;10354:3;10265:93;:::i;:::-;10383:2;10378:3;10374:12;10367:19;;10172:220;;;:::o;10398:366::-;;10561:67;10625:2;10620:3;10561:67;:::i;:::-;10554:74;;10637:93;10726:3;10637:93;:::i;:::-;10755:2;10750:3;10746:12;10739:19;;10544:220;;;:::o;10770:366::-;;10933:67;10997:2;10992:3;10933:67;:::i;:::-;10926:74;;11009:93;11098:3;11009:93;:::i;:::-;11127:2;11122:3;11118:12;11111:19;;10916:220;;;:::o;11142:366::-;;11305:67;11369:2;11364:3;11305:67;:::i;:::-;11298:74;;11381:93;11470:3;11381:93;:::i;:::-;11499:2;11494:3;11490:12;11483:19;;11288:220;;;:::o;11514:366::-;;11677:67;11741:2;11736:3;11677:67;:::i;:::-;11670:74;;11753:93;11842:3;11753:93;:::i;:::-;11871:2;11866:3;11862:12;11855:19;;11660:220;;;:::o;11886:366::-;;12049:67;12113:2;12108:3;12049:67;:::i;:::-;12042:74;;12125:93;12214:3;12125:93;:::i;:::-;12243:2;12238:3;12234:12;12227:19;;12032:220;;;:::o;12258:366::-;;12421:67;12485:2;12480:3;12421:67;:::i;:::-;12414:74;;12497:93;12586:3;12497:93;:::i;:::-;12615:2;12610:3;12606:12;12599:19;;12404:220;;;:::o;12630:366::-;;12793:67;12857:2;12852:3;12793:67;:::i;:::-;12786:74;;12869:93;12958:3;12869:93;:::i;:::-;12987:2;12982:3;12978:12;12971:19;;12776:220;;;:::o;13002:366::-;;13165:67;13229:2;13224:3;13165:67;:::i;:::-;13158:74;;13241:93;13330:3;13241:93;:::i;:::-;13359:2;13354:3;13350:12;13343:19;;13148:220;;;:::o;13374:366::-;;13537:67;13601:2;13596:3;13537:67;:::i;:::-;13530:74;;13613:93;13702:3;13613:93;:::i;:::-;13731:2;13726:3;13722:12;13715:19;;13520:220;;;:::o;13746:366::-;;13909:67;13973:2;13968:3;13909:67;:::i;:::-;13902:74;;13985:93;14074:3;13985:93;:::i;:::-;14103:2;14098:3;14094:12;14087:19;;13892:220;;;:::o;14118:366::-;;14281:67;14345:2;14340:3;14281:67;:::i;:::-;14274:74;;14357:93;14446:3;14357:93;:::i;:::-;14475:2;14470:3;14466:12;14459:19;;14264:220;;;:::o;14490:366::-;;14653:67;14717:2;14712:3;14653:67;:::i;:::-;14646:74;;14729:93;14818:3;14729:93;:::i;:::-;14847:2;14842:3;14838:12;14831:19;;14636:220;;;:::o;14862:366::-;;15025:67;15089:2;15084:3;15025:67;:::i;:::-;15018:74;;15101:93;15190:3;15101:93;:::i;:::-;15219:2;15214:3;15210:12;15203:19;;15008:220;;;:::o;15234:366::-;;15397:67;15461:2;15456:3;15397:67;:::i;:::-;15390:74;;15473:93;15562:3;15473:93;:::i;:::-;15591:2;15586:3;15582:12;15575:19;;15380:220;;;:::o;15606:366::-;;15769:67;15833:2;15828:3;15769:67;:::i;:::-;15762:74;;15845:93;15934:3;15845:93;:::i;:::-;15963:2;15958:3;15954:12;15947:19;;15752:220;;;:::o;15978:366::-;;16141:67;16205:2;16200:3;16141:67;:::i;:::-;16134:74;;16217:93;16306:3;16217:93;:::i;:::-;16335:2;16330:3;16326:12;16319:19;;16124:220;;;:::o;16350:366::-;;16513:67;16577:2;16572:3;16513:67;:::i;:::-;16506:74;;16589:93;16678:3;16589:93;:::i;:::-;16707:2;16702:3;16698:12;16691:19;;16496:220;;;:::o;16722:366::-;;16885:67;16949:2;16944:3;16885:67;:::i;:::-;16878:74;;16961:93;17050:3;16961:93;:::i;:::-;17079:2;17074:3;17070:12;17063:19;;16868:220;;;:::o;17094:366::-;;17257:67;17321:2;17316:3;17257:67;:::i;:::-;17250:74;;17333:93;17422:3;17333:93;:::i;:::-;17451:2;17446:3;17442:12;17435:19;;17240:220;;;:::o;17466:366::-;;17629:67;17693:2;17688:3;17629:67;:::i;:::-;17622:74;;17705:93;17794:3;17705:93;:::i;:::-;17823:2;17818:3;17814:12;17807:19;;17612:220;;;:::o;17838:366::-;;18001:67;18065:2;18060:3;18001:67;:::i;:::-;17994:74;;18077:93;18166:3;18077:93;:::i;:::-;18195:2;18190:3;18186:12;18179:19;;17984:220;;;:::o;18210:366::-;;18373:67;18437:2;18432:3;18373:67;:::i;:::-;18366:74;;18449:93;18538:3;18449:93;:::i;:::-;18567:2;18562:3;18558:12;18551:19;;18356:220;;;:::o;18582:366::-;;18745:67;18809:2;18804:3;18745:67;:::i;:::-;18738:74;;18821:93;18910:3;18821:93;:::i;:::-;18939:2;18934:3;18930:12;18923:19;;18728:220;;;:::o;18954:366::-;;19117:67;19181:2;19176:3;19117:67;:::i;:::-;19110:74;;19193:93;19282:3;19193:93;:::i;:::-;19311:2;19306:3;19302:12;19295:19;;19100:220;;;:::o;19326:366::-;;19489:67;19553:2;19548:3;19489:67;:::i;:::-;19482:74;;19565:93;19654:3;19565:93;:::i;:::-;19683:2;19678:3;19674:12;19667:19;;19472:220;;;:::o;19698:366::-;;19861:67;19925:2;19920:3;19861:67;:::i;:::-;19854:74;;19937:93;20026:3;19937:93;:::i;:::-;20055:2;20050:3;20046:12;20039:19;;19844:220;;;:::o;20070:366::-;;20233:67;20297:2;20292:3;20233:67;:::i;:::-;20226:74;;20309:93;20398:3;20309:93;:::i;:::-;20427:2;20422:3;20418:12;20411:19;;20216:220;;;:::o;20442:108::-;20519:24;20537:5;20519:24;:::i;:::-;20514:3;20507:37;20497:53;;:::o;20556:118::-;20643:24;20661:5;20643:24;:::i;:::-;20638:3;20631:37;20621:53;;:::o;20680:112::-;20763:22;20779:5;20763:22;:::i;:::-;20758:3;20751:35;20741:51;;:::o;20798:435::-;;21000:95;21091:3;21082:6;21000:95;:::i;:::-;20993:102;;21112:95;21203:3;21194:6;21112:95;:::i;:::-;21105:102;;21224:3;21217:10;;20982:251;;;;;:::o;21239:222::-;;21370:2;21359:9;21355:18;21347:26;;21383:71;21451:1;21440:9;21436:17;21427:6;21383:71;:::i;:::-;21337:124;;;;:::o;21467:640::-;;21700:3;21689:9;21685:19;21677:27;;21714:71;21782:1;21771:9;21767:17;21758:6;21714:71;:::i;:::-;21795:72;21863:2;21852:9;21848:18;21839:6;21795:72;:::i;:::-;21877;21945:2;21934:9;21930:18;21921:6;21877:72;:::i;:::-;21996:9;21990:4;21986:20;21981:2;21970:9;21966:18;21959:48;22024:76;22095:4;22086:6;22024:76;:::i;:::-;22016:84;;21667:440;;;;;;;:::o;22113:373::-;;22294:2;22283:9;22279:18;22271:26;;22343:9;22337:4;22333:20;22329:1;22318:9;22314:17;22307:47;22371:108;22474:4;22465:6;22371:108;:::i;:::-;22363:116;;22261:225;;;;:::o;22492:210::-;;22617:2;22606:9;22602:18;22594:26;;22630:65;22692:1;22681:9;22677:17;22668:6;22630:65;:::i;:::-;22584:118;;;;:::o;22708:313::-;;22859:2;22848:9;22844:18;22836:26;;22908:9;22902:4;22898:20;22894:1;22883:9;22879:17;22872:47;22936:78;23009:4;23000:6;22936:78;:::i;:::-;22928:86;;22826:195;;;;:::o;23027:419::-;;23231:2;23220:9;23216:18;23208:26;;23280:9;23274:4;23270:20;23266:1;23255:9;23251:17;23244:47;23308:131;23434:4;23308:131;:::i;:::-;23300:139;;23198:248;;;:::o;23452:419::-;;23656:2;23645:9;23641:18;23633:26;;23705:9;23699:4;23695:20;23691:1;23680:9;23676:17;23669:47;23733:131;23859:4;23733:131;:::i;:::-;23725:139;;23623:248;;;:::o;23877:419::-;;24081:2;24070:9;24066:18;24058:26;;24130:9;24124:4;24120:20;24116:1;24105:9;24101:17;24094:47;24158:131;24284:4;24158:131;:::i;:::-;24150:139;;24048:248;;;:::o;24302:419::-;;24506:2;24495:9;24491:18;24483:26;;24555:9;24549:4;24545:20;24541:1;24530:9;24526:17;24519:47;24583:131;24709:4;24583:131;:::i;:::-;24575:139;;24473:248;;;:::o;24727:419::-;;24931:2;24920:9;24916:18;24908:26;;24980:9;24974:4;24970:20;24966:1;24955:9;24951:17;24944:47;25008:131;25134:4;25008:131;:::i;:::-;25000:139;;24898:248;;;:::o;25152:419::-;;25356:2;25345:9;25341:18;25333:26;;25405:9;25399:4;25395:20;25391:1;25380:9;25376:17;25369:47;25433:131;25559:4;25433:131;:::i;:::-;25425:139;;25323:248;;;:::o;25577:419::-;;25781:2;25770:9;25766:18;25758:26;;25830:9;25824:4;25820:20;25816:1;25805:9;25801:17;25794:47;25858:131;25984:4;25858:131;:::i;:::-;25850:139;;25748:248;;;:::o;26002:419::-;;26206:2;26195:9;26191:18;26183:26;;26255:9;26249:4;26245:20;26241:1;26230:9;26226:17;26219:47;26283:131;26409:4;26283:131;:::i;:::-;26275:139;;26173:248;;;:::o;26427:419::-;;26631:2;26620:9;26616:18;26608:26;;26680:9;26674:4;26670:20;26666:1;26655:9;26651:17;26644:47;26708:131;26834:4;26708:131;:::i;:::-;26700:139;;26598:248;;;:::o;26852:419::-;;27056:2;27045:9;27041:18;27033:26;;27105:9;27099:4;27095:20;27091:1;27080:9;27076:17;27069:47;27133:131;27259:4;27133:131;:::i;:::-;27125:139;;27023:248;;;:::o;27277:419::-;;27481:2;27470:9;27466:18;27458:26;;27530:9;27524:4;27520:20;27516:1;27505:9;27501:17;27494:47;27558:131;27684:4;27558:131;:::i;:::-;27550:139;;27448:248;;;:::o;27702:419::-;;27906:2;27895:9;27891:18;27883:26;;27955:9;27949:4;27945:20;27941:1;27930:9;27926:17;27919:47;27983:131;28109:4;27983:131;:::i;:::-;27975:139;;27873:248;;;:::o;28127:419::-;;28331:2;28320:9;28316:18;28308:26;;28380:9;28374:4;28370:20;28366:1;28355:9;28351:17;28344:47;28408:131;28534:4;28408:131;:::i;:::-;28400:139;;28298:248;;;:::o;28552:419::-;;28756:2;28745:9;28741:18;28733:26;;28805:9;28799:4;28795:20;28791:1;28780:9;28776:17;28769:47;28833:131;28959:4;28833:131;:::i;:::-;28825:139;;28723:248;;;:::o;28977:419::-;;29181:2;29170:9;29166:18;29158:26;;29230:9;29224:4;29220:20;29216:1;29205:9;29201:17;29194:47;29258:131;29384:4;29258:131;:::i;:::-;29250:139;;29148:248;;;:::o;29402:419::-;;29606:2;29595:9;29591:18;29583:26;;29655:9;29649:4;29645:20;29641:1;29630:9;29626:17;29619:47;29683:131;29809:4;29683:131;:::i;:::-;29675:139;;29573:248;;;:::o;29827:419::-;;30031:2;30020:9;30016:18;30008:26;;30080:9;30074:4;30070:20;30066:1;30055:9;30051:17;30044:47;30108:131;30234:4;30108:131;:::i;:::-;30100:139;;29998:248;;;:::o;30252:419::-;;30456:2;30445:9;30441:18;30433:26;;30505:9;30499:4;30495:20;30491:1;30480:9;30476:17;30469:47;30533:131;30659:4;30533:131;:::i;:::-;30525:139;;30423:248;;;:::o;30677:419::-;;30881:2;30870:9;30866:18;30858:26;;30930:9;30924:4;30920:20;30916:1;30905:9;30901:17;30894:47;30958:131;31084:4;30958:131;:::i;:::-;30950:139;;30848:248;;;:::o;31102:419::-;;31306:2;31295:9;31291:18;31283:26;;31355:9;31349:4;31345:20;31341:1;31330:9;31326:17;31319:47;31383:131;31509:4;31383:131;:::i;:::-;31375:139;;31273:248;;;:::o;31527:419::-;;31731:2;31720:9;31716:18;31708:26;;31780:9;31774:4;31770:20;31766:1;31755:9;31751:17;31744:47;31808:131;31934:4;31808:131;:::i;:::-;31800:139;;31698:248;;;:::o;31952:419::-;;32156:2;32145:9;32141:18;32133:26;;32205:9;32199:4;32195:20;32191:1;32180:9;32176:17;32169:47;32233:131;32359:4;32233:131;:::i;:::-;32225:139;;32123:248;;;:::o;32377:419::-;;32581:2;32570:9;32566:18;32558:26;;32630:9;32624:4;32620:20;32616:1;32605:9;32601:17;32594:47;32658:131;32784:4;32658:131;:::i;:::-;32650:139;;32548:248;;;:::o;32802:419::-;;33006:2;32995:9;32991:18;32983:26;;33055:9;33049:4;33045:20;33041:1;33030:9;33026:17;33019:47;33083:131;33209:4;33083:131;:::i;:::-;33075:139;;32973:248;;;:::o;33227:419::-;;33431:2;33420:9;33416:18;33408:26;;33480:9;33474:4;33470:20;33466:1;33455:9;33451:17;33444:47;33508:131;33634:4;33508:131;:::i;:::-;33500:139;;33398:248;;;:::o;33652:419::-;;33856:2;33845:9;33841:18;33833:26;;33905:9;33899:4;33895:20;33891:1;33880:9;33876:17;33869:47;33933:131;34059:4;33933:131;:::i;:::-;33925:139;;33823:248;;;:::o;34077:419::-;;34281:2;34270:9;34266:18;34258:26;;34330:9;34324:4;34320:20;34316:1;34305:9;34301:17;34294:47;34358:131;34484:4;34358:131;:::i;:::-;34350:139;;34248:248;;;:::o;34502:419::-;;34706:2;34695:9;34691:18;34683:26;;34755:9;34749:4;34745:20;34741:1;34730:9;34726:17;34719:47;34783:131;34909:4;34783:131;:::i;:::-;34775:139;;34673:248;;;:::o;34927:222::-;;35058:2;35047:9;35043:18;35035:26;;35071:71;35139:1;35128:9;35124:17;35115:6;35071:71;:::i;:::-;35025:124;;;;:::o;35155:332::-;;35314:2;35303:9;35299:18;35291:26;;35327:71;35395:1;35384:9;35380:17;35371:6;35327:71;:::i;:::-;35408:72;35476:2;35465:9;35461:18;35452:6;35408:72;:::i;:::-;35281:206;;;;;:::o;35493:214::-;;35620:2;35609:9;35605:18;35597:26;;35633:67;35697:1;35686:9;35682:17;35673:6;35633:67;:::i;:::-;35587:120;;;;:::o;35713:129::-;;35774:20;;:::i;:::-;35764:30;;35803:33;35831:4;35823:6;35803:33;:::i;:::-;35754:88;;;:::o;35848:75::-;;35914:2;35908:9;35898:19;;35888:35;:::o;35929:307::-;;36080:18;36072:6;36069:30;36066:2;;;36102:18;;:::i;:::-;36066:2;36140:29;36162:6;36140:29;:::i;:::-;36132:37;;36224:4;36218;36214:15;36206:23;;35995:241;;;:::o;36242:308::-;;36394:18;36386:6;36383:30;36380:2;;;36416:18;;:::i;:::-;36380:2;36454:29;36476:6;36454:29;:::i;:::-;36446:37;;36538:4;36532;36528:15;36520:23;;36309:241;;;:::o;36556:132::-;;36646:3;36638:11;;36676:4;36671:3;36667:14;36659:22;;36628:60;;;:::o;36694:114::-;;36795:5;36789:12;36779:22;;36768:40;;;:::o;36814:98::-;;36899:5;36893:12;36883:22;;36872:40;;;:::o;36918:99::-;;37004:5;36998:12;36988:22;;36977:40;;;:::o;37023:113::-;;37125:4;37120:3;37116:14;37108:22;;37098:38;;;:::o;37142:184::-;;37275:6;37270:3;37263:19;37315:4;37310:3;37306:14;37291:29;;37253:73;;;;:::o;37332:168::-;;37449:6;37444:3;37437:19;37489:4;37484:3;37480:14;37465:29;;37427:73;;;;:::o;37506:169::-;;37624:6;37619:3;37612:19;37664:4;37659:3;37655:14;37640:29;;37602:73;;;;:::o;37681:148::-;;37820:3;37805:18;;37795:34;;;;:::o;37835:305::-;;37894:20;37912:1;37894:20;:::i;:::-;37889:25;;37928:20;37946:1;37928:20;:::i;:::-;37923:25;;38082:1;38014:66;38010:74;38007:1;38004:81;38001:2;;;38088:18;;:::i;:::-;38001:2;38132:1;38129;38125:9;38118:16;;37879:261;;;;:::o;38146:185::-;;38203:20;38221:1;38203:20;:::i;:::-;38198:25;;38237:20;38255:1;38237:20;:::i;:::-;38232:25;;38276:1;38266:2;;38281:18;;:::i;:::-;38266:2;38323:1;38320;38316:9;38311:14;;38188:143;;;;:::o;38337:348::-;;38400:20;38418:1;38400:20;:::i;:::-;38395:25;;38434:20;38452:1;38434:20;:::i;:::-;38429:25;;38622:1;38554:66;38550:74;38547:1;38544:81;38539:1;38532:9;38525:17;38521:105;38518:2;;;38629:18;;:::i;:::-;38518:2;38677:1;38674;38670:9;38659:20;;38385:300;;;;:::o;38691:191::-;;38751:20;38769:1;38751:20;:::i;:::-;38746:25;;38785:20;38803:1;38785:20;:::i;:::-;38780:25;;38824:1;38821;38818:8;38815:2;;;38829:18;;:::i;:::-;38815:2;38874:1;38871;38867:9;38859:17;;38736:146;;;;:::o;38888:185::-;;38946:18;38962:1;38946:18;:::i;:::-;38941:23;;38978:18;38994:1;38978:18;:::i;:::-;38973:23;;39015:1;39012;39009:8;39006:2;;;39020:18;;:::i;:::-;39006:2;39065:1;39062;39058:9;39050:17;;38931:142;;;;:::o;39079:96::-;;39145:24;39163:5;39145:24;:::i;:::-;39134:35;;39124:51;;;:::o;39181:90::-;;39258:5;39251:13;39244:21;39233:32;;39223:48;;;:::o;39277:149::-;;39353:66;39346:5;39342:78;39331:89;;39321:105;;;:::o;39432:126::-;;39509:42;39502:5;39498:54;39487:65;;39477:81;;;:::o;39564:77::-;;39630:5;39619:16;;39609:32;;;:::o;39647:86::-;;39722:4;39715:5;39711:16;39700:27;;39690:43;;;:::o;39739:154::-;39823:6;39818:3;39813;39800:30;39885:1;39876:6;39871:3;39867:16;39860:27;39790:103;;;:::o;39899:307::-;39967:1;39977:113;39991:6;39988:1;39985:13;39977:113;;;40076:1;40071:3;40067:11;40061:18;40057:1;40052:3;40048:11;40041:39;40013:2;40010:1;40006:10;40001:15;;39977:113;;;40108:6;40105:1;40102:13;40099:2;;;40188:1;40179:6;40174:3;40170:16;40163:27;40099:2;39948:258;;;;:::o;40212:320::-;;40293:1;40287:4;40283:12;40273:22;;40340:1;40334:4;40330:12;40361:18;40351:2;;40417:4;40409:6;40405:17;40395:27;;40351:2;40479;40471:6;40468:14;40448:18;40445:38;40442:2;;;40498:18;;:::i;:::-;40442:2;40263:269;;;;:::o;40538:281::-;40621:27;40643:4;40621:27;:::i;:::-;40613:6;40609:40;40751:6;40739:10;40736:22;40715:18;40703:10;40700:34;40697:62;40694:2;;;40762:18;;:::i;:::-;40694:2;40802:10;40798:2;40791:22;40581:238;;;:::o;40825:233::-;;40887:24;40905:5;40887:24;:::i;:::-;40878:33;;40933:66;40926:5;40923:77;40920:2;;;41003:18;;:::i;:::-;40920:2;41050:1;41043:5;41039:13;41032:20;;40868:190;;;:::o;41064:176::-;;41113:20;41131:1;41113:20;:::i;:::-;41108:25;;41147:20;41165:1;41147:20;:::i;:::-;41142:25;;41186:1;41176:2;;41191:18;;:::i;:::-;41176:2;41232:1;41229;41225:9;41220:14;;41098:142;;;;:::o;41246:180::-;41294:77;41291:1;41284:88;41391:4;41388:1;41381:15;41415:4;41412:1;41405:15;41432:180;41480:77;41477:1;41470:88;41577:4;41574:1;41567:15;41601:4;41598:1;41591:15;41618:180;41666:77;41663:1;41656:88;41763:4;41760:1;41753:15;41787:4;41784:1;41777:15;41804:180;41852:77;41849:1;41842:88;41949:4;41946:1;41939:15;41973:4;41970:1;41963:15;41990:102;;42082:2;42078:7;42073:2;42066:5;42062:14;42058:28;42048:38;;42038:54;;;:::o;42098:179::-;42238:31;42234:1;42226:6;42222:14;42215:55;42204:73;:::o;42283:230::-;42423:34;42419:1;42411:6;42407:14;42400:58;42492:13;42487:2;42479:6;42475:15;42468:38;42389:124;:::o;42519:237::-;42659:34;42655:1;42647:6;42643:14;42636:58;42728:20;42723:2;42715:6;42711:15;42704:45;42625:131;:::o;42762:225::-;42902:34;42898:1;42890:6;42886:14;42879:58;42971:8;42966:2;42958:6;42954:15;42947:33;42868:119;:::o;42993:182::-;43133:34;43129:1;43121:6;43117:14;43110:58;43099:76;:::o;43181:224::-;43321:34;43317:1;43309:6;43305:14;43298:58;43390:7;43385:2;43377:6;43373:15;43366:32;43287:118;:::o;43411:178::-;43551:30;43547:1;43539:6;43535:14;43528:54;43517:72;:::o;43595:169::-;43735:21;43731:1;43723:6;43719:14;43712:45;43701:63;:::o;43770:165::-;43910:17;43906:1;43898:6;43894:14;43887:41;43876:59;:::o;43941:223::-;44081:34;44077:1;44069:6;44065:14;44058:58;44150:6;44145:2;44137:6;44133:15;44126:31;44047:117;:::o;44170:175::-;44310:27;44306:1;44298:6;44294:14;44287:51;44276:69;:::o;44351:231::-;44491:34;44487:1;44479:6;44475:14;44468:58;44560:14;44555:2;44547:6;44543:15;44536:39;44457:125;:::o;44588:243::-;44728:34;44724:1;44716:6;44712:14;44705:58;44797:26;44792:2;44784:6;44780:15;44773:51;44694:137;:::o;44837:229::-;44977:34;44973:1;44965:6;44961:14;44954:58;45046:12;45041:2;45033:6;45029:15;45022:37;44943:123;:::o;45072:228::-;45212:34;45208:1;45200:6;45196:14;45189:58;45281:11;45276:2;45268:6;45264:15;45257:36;45178:122;:::o;45306:179::-;45446:31;45442:1;45434:6;45430:14;45423:55;45412:73;:::o;45491:182::-;45631:34;45627:1;45619:6;45615:14;45608:58;45597:76;:::o;45679:231::-;45819:34;45815:1;45807:6;45803:14;45796:58;45888:14;45883:2;45875:6;45871:15;45864:39;45785:125;:::o;45916:174::-;46056:26;46052:1;46044:6;46040:14;46033:50;46022:68;:::o;46096:182::-;46236:34;46232:1;46224:6;46220:14;46213:58;46202:76;:::o;46284:234::-;46424:34;46420:1;46412:6;46408:14;46401:58;46493:17;46488:2;46480:6;46476:15;46469:42;46390:128;:::o;46524:180::-;46664:32;46660:1;46652:6;46648:14;46641:56;46630:74;:::o;46710:220::-;46850:34;46846:1;46838:6;46834:14;46827:58;46919:3;46914:2;46906:6;46902:15;46895:28;46816:114;:::o;46936:221::-;47076:34;47072:1;47064:6;47060:14;47053:58;47145:4;47140:2;47132:6;47128:15;47121:29;47042:115;:::o;47163:236::-;47303:34;47299:1;47291:6;47287:14;47280:58;47372:19;47367:2;47359:6;47355:15;47348:44;47269:130;:::o;47405:231::-;47545:34;47541:1;47533:6;47529:14;47522:58;47614:14;47609:2;47601:6;47597:15;47590:39;47511:125;:::o;47642:177::-;47782:29;47778:1;47770:6;47766:14;47759:53;47748:71;:::o;47825:177::-;47965:29;47961:1;47953:6;47949:14;47942:53;47931:71;:::o;48008:122::-;48081:24;48099:5;48081:24;:::i;:::-;48074:5;48071:35;48061:2;;48120:1;48117;48110:12;48061:2;48051:79;:::o;48136:116::-;48206:21;48221:5;48206:21;:::i;:::-;48199:5;48196:32;48186:2;;48242:1;48239;48232:12;48186:2;48176:76;:::o;48258:120::-;48330:23;48347:5;48330:23;:::i;:::-;48323:5;48320:34;48310:2;;48368:1;48365;48358:12;48310:2;48300:78;:::o;48384:122::-;48457:24;48475:5;48457:24;:::i;:::-;48450:5;48447:35;48437:2;;48496:1;48493;48486:12;48437:2;48427:79;:::o;48512:118::-;48583:22;48599:5;48583:22;:::i;:::-;48576:5;48573:33;48563:2;;48620:1;48617;48610:12;48563:2;48553:77;:::o

Swarm Source

ipfs://79d6c2cbb85ba04cecd160b9b82141e1841600928cff9f6057aff68036148baf
Loading...
Loading
Loading...
Loading
[ 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.