ETH Price: $4,054.00 (+4.24%)

Token

Crypto Polar Bears (CPB)
 

Overview

Max Total Supply

0 CPB

Holders

1,630

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
8 CPB
0x5e6db80c7f8d5da245d4249dcbee16e6596521d4
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:
CryptoPolarBears

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 4 of 13: CryptoPolarBears.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

import "./ERC721.sol";
import "./Counters.sol";
import "./Ownable.sol";

contract CryptoPolarBears is ERC721, Ownable {
  
  using Counters for Counters.Counter;
  Counters.Counter private _tokenSupply;
  Counters.Counter private _nextTokenId;
  
  uint256 public mintPrice = 0.2 ether;
  uint256 public presalePrice = 0.16 ether;

  uint256 private reserveAtATime = 50;
  uint256 private reservedCount = 0;
  uint256 private maxReserveCount = 100;

  string _baseTokenURI;

  bool public isActive = false;
  bool public isPresaleActive = false;

  uint256 public MAX_SUPPLY = 8888;
  uint256 public maximumAllowedTokensPerPurchase = 5;
  uint256 public maximumAllowedTokensPerWallet = 10;
  uint256 public allowListMaxMint = 5;


  mapping(address => bool) private _allowList;
  mapping(address => uint256) private _allowListClaimed;

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

  constructor(string memory baseURI) ERC721("Crypto Polar Bears", "CPB") {
    setBaseURI(baseURI);
  }

  modifier saleIsOpen {
    require(_tokenSupply.current() <= MAX_SUPPLY, "Sale has ended.");
    _;
  }

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

  function tokensMinted() public view returns (uint256) {
    return _tokenSupply.current();
  }

  function setMaximumAllowedTokens(uint256 _count) public onlyAuthorized {
    maximumAllowedTokensPerPurchase = _count;
  }

  function setMaximumAllowedTokensPerWallet(uint256 _count) public onlyAuthorized {
    maximumAllowedTokensPerWallet = _count;
  }

  function setActive(bool val) public onlyAuthorized {
    isActive = val;
    emit SaleActivation(val);
  }

  function setMaxMintSupply(uint256 maxMintSupply) external  onlyAuthorized {
    MAX_SUPPLY = maxMintSupply;
  }

  function setIsPresaleActive(bool _isPresaleActive) external onlyAuthorized {
    isPresaleActive = _isPresaleActive;
  }

  function setAllowListMaxMint(uint256 maxMint) external  onlyAuthorized {
    allowListMaxMint = maxMint;
  }

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

  function checkIfOnAllowList(address addr) external view returns (bool) {
    return _allowList[addr];
  }

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

  function allowListClaimedBy(address owner) external view returns (uint256){
    require(owner != address(0), 'Zero address not on Allow List');
    return _allowListClaimed[owner];
  }

  function setReserveAtATime(uint256 val) public onlyAuthorized {
    reserveAtATime = val;
  }

  function setMaxReserve(uint256 val) public onlyAuthorized {
    maxReserveCount = val;
  }

  function setPrice(uint256 _price) public onlyAuthorized {
    mintPrice = _price;
  }

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

  function getReserveAtATime() external view returns (uint256) {
    return reserveAtATime;
  }

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

 function reserveNft() public onlyAuthorized {
    require(reservedCount <= maxReserveCount, "Max Reserves taken already!");
    uint256 i;

    for (i = 0; i < reserveAtATime; i++) {
      _tokenSupply.increment();
      _safeMint(msg.sender, _tokenSupply.current());
      reservedCount++;
    }
  }

  function reserveToCustomWallet(address _walletAddress, uint256 _count) public onlyAuthorized {
    for (uint256 i = 0; i < _count; i++) {
      _tokenSupply.increment();
      _safeMint(_walletAddress, _tokenSupply.current());
    }
  }

  function batchReserveToMultipleAddresses(uint256 _count, address[] calldata addresses) external onlyAuthorized {
    uint256 supply = _tokenSupply.current();

    require(supply + _count <= MAX_SUPPLY, "Total supply exceeded.");
    require(supply <= MAX_SUPPLY, "Total supply spent.");

    for (uint256 i = 0; i < addresses.length; i++) {
      require(addresses[i] != address(0), "Can't add a null address");

      for(uint256 j = 0; j < _count; j++) {
        _tokenSupply.increment();
        _safeMint(addresses[i], _tokenSupply.current());
      }
    }
  }

  function mint(uint256 _count) public payable saleIsOpen {
    uint256 mintIndex = _tokenSupply.current();

    if (msg.sender != owner()) {
      require(isActive, "Sale is not active currently.");
      require(balanceOf(msg.sender) + _count <= maximumAllowedTokensPerWallet, "Max holding cap reached.");
    }


    require(mintIndex + _count <= MAX_SUPPLY, "Total supply exceeded.");
    require(
      _count <= maximumAllowedTokensPerPurchase,
      "Exceeds maximum allowed tokens"
    );

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

    for (uint256 i = 0; i < _count; i++) {
      _tokenSupply.increment();
      _safeMint(msg.sender, _tokenSupply.current());
    }
  }

  function preSaleMint(uint256 _count) public payable saleIsOpen {
    uint256 mintIndex = _tokenSupply.current();

    require(isPresaleActive, 'Allow List is not active');
    require(_allowList[msg.sender], 'You are not on the Allow List');
    require(mintIndex < MAX_SUPPLY, 'All tokens have been minted');
    require(_count <= allowListMaxMint, 'Cannot purchase this many tokens');
    require(_allowListClaimed[msg.sender] + _count <= allowListMaxMint, 'Purchase exceeds max allowed');
    require(msg.value >= presalePrice * _count, 'Insuffient ETH amount sent.');

    for (uint256 i = 0; i < _count; i++) {
      _tokenSupply.increment();
      _safeMint(msg.sender, _tokenSupply.current());
    }
  }

  function withdraw() external onlyAuthorized {
    uint balance = address(this).balance;
    payable(owner()).transfer(balance);
  }
}

File 1 of 13: 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 13: 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 13: Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 5 of 13: ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "./Strings.sol";

/**
 * @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 = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 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 Message, created from `s`. 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(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @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 6 of 13: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 7 of 13: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

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

File 8 of 13: 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 9 of 13: 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 10 of 13: 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 13: 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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 12 of 13: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 13: 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":"isActive","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":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"allowListClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"batchReserveToMultipleAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"checkIfOnAllowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"getReserveAtATime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isPresaleActive","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":"maximumAllowedTokensPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[],"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":"uint256","name":"_count","type":"uint256"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveNft","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":"bool","name":"val","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMint","type":"uint256"}],"name":"setAllowListMaxMint","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":[{"internalType":"bool","name":"_isPresaleActive","type":"bool"}],"name":"setIsPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMintSupply","type":"uint256"}],"name":"setMaxMintSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMaxReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaximumAllowedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaximumAllowedTokensPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setReserveAtATime","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526702c68af0bb1400006009556702386f26fc100000600a556032600b556000600c556064600d556000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055506122b86010556005601155600a60125560056013553480156200008357600080fd5b506040516200543a3803806200543a8339818101604052810190620000a991906200052a565b6040518060400160405280601281526020017f43727970746f20506f6c617220426561727300000000000000000000000000008152506040518060400160405280600381526020017f435042000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200012d929190620002dd565b50806001908051906020019062000146929190620002dd565b505050620001696200015d6200018160201b60201c565b6200018960201b60201c565b6200017a816200024f60201b60201c565b50620005e0565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff1662000276620002b360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200029757600080fd5b80600e9080519060200190620002af929190620002dd565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002eb90620005aa565b90600052602060002090601f0160209004810192826200030f57600085556200035b565b82601f106200032a57805160ff19168380011785556200035b565b828001600101855582156200035b579182015b828111156200035a5782518255916020019190600101906200033d565b5b5090506200036a91906200036e565b5090565b5b80821115620003895760008160009055506001016200036f565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003f682620003ab565b810181811067ffffffffffffffff82111715620004185762000417620003bc565b5b80604052505050565b60006200042d6200038d565b90506200043b8282620003eb565b919050565b600067ffffffffffffffff8211156200045e576200045d620003bc565b5b6200046982620003ab565b9050602081019050919050565b60005b838110156200049657808201518184015260208101905062000479565b83811115620004a6576000848401525b50505050565b6000620004c3620004bd8462000440565b62000421565b905082815260208101848484011115620004e257620004e1620003a6565b5b620004ef84828562000476565b509392505050565b600082601f8301126200050f576200050e620003a1565b5b815162000521848260208601620004ac565b91505092915050565b60006020828403121562000543576200054262000397565b5b600082015167ffffffffffffffff8111156200056457620005636200039c565b5b6200057284828501620004f7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005c357607f821691505b60208210811415620005da57620005d96200057b565b5b50919050565b614e4a80620005f06000396000f3fe60806040526004361061027b5760003560e01c80637263cfe21161014f578063a22cb465116100c1578063e7b62d961161007a578063e7b62d961461093c578063e82b2a7114610967578063e985e9c514610990578063ea6eb836146109cd578063f2fde38b146109f6578063f6c9d9e314610a1f5761027b565b8063a22cb46514610830578063a51312c814610859578063acec338a14610882578063b88d4fde146108ab578063c87b56dd146108d4578063cadf8818146109115761027b565b80637f44ab2f116101135780637f44ab2f1461073f5780638da5cb5b1461076a57806391b7f5ed1461079557806395d89b41146107be5780639a3bf728146107e9578063a0712d68146108145761027b565b80637263cfe21461067f5780637389fbb7146106a857806377b501b9146106d15780637835c635146106fa5780637a6685f1146107165761027b565b806342842e0e116101f35780636352211e116101ac5780636352211e146105815780636817c76c146105be5780636de9f32b146105e957806370a0823114610614578063715018a61461065157806371e3500c146106685761027b565b806342842e0e14610489578063443da2a2146104b25780634dfea627146104db57806355f804b31461050457806356a87caa1461052d57806360d938dc146105565761027b565b8063095ea7b311610245578063095ea7b31461038d57806322f3e2d4146103b657806323b872dd146103e15780632c1205f41461040a57806332cb6b0c146104475780633ccfd60b146104725761027b565b806208ffdd146102805780620e7fa8146102bd57806301ffc9a7146102e857806306fdde0314610325578063081812fc14610350575b600080fd5b34801561028c57600080fd5b506102a760048036038101906102a29190613397565b610a48565b6040516102b491906133dd565b60405180910390f35b3480156102c957600080fd5b506102d2610b00565b6040516102df91906133dd565b60405180910390f35b3480156102f457600080fd5b5061030f600480360381019061030a9190613450565b610b06565b60405161031c9190613498565b60405180910390f35b34801561033157600080fd5b5061033a610be8565b604051610347919061354c565b60405180910390f35b34801561035c57600080fd5b506103776004803603810190610372919061359a565b610c7a565b60405161038491906135d6565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af91906135f1565b610cff565b005b3480156103c257600080fd5b506103cb610e17565b6040516103d89190613498565b60405180910390f35b3480156103ed57600080fd5b5061040860048036038101906104039190613631565b610e2a565b005b34801561041657600080fd5b50610431600480360381019061042c9190613397565b610e8a565b60405161043e9190613498565b60405180910390f35b34801561045357600080fd5b5061045c610ee0565b60405161046991906133dd565b60405180910390f35b34801561047e57600080fd5b50610487610ee6565b005b34801561049557600080fd5b506104b060048036038101906104ab9190613631565b610f7b565b005b3480156104be57600080fd5b506104d960048036038101906104d491906136b0565b610f9b565b005b3480156104e757600080fd5b5061050260048036038101906104fd919061359a565b610ff7565b005b34801561051057600080fd5b5061052b60048036038101906105269190613812565b611040565b005b34801561053957600080fd5b50610554600480360381019061054f919061359a565b611099565b005b34801561056257600080fd5b5061056b6110e2565b6040516105789190613498565b60405180910390f35b34801561058d57600080fd5b506105a860048036038101906105a3919061359a565b6110f5565b6040516105b591906135d6565b60405180910390f35b3480156105ca57600080fd5b506105d36111a7565b6040516105e091906133dd565b60405180910390f35b3480156105f557600080fd5b506105fe6111ad565b60405161060b91906133dd565b60405180910390f35b34801561062057600080fd5b5061063b60048036038101906106369190613397565b6111be565b60405161064891906133dd565b60405180910390f35b34801561065d57600080fd5b50610666611276565b005b34801561067457600080fd5b5061067d6112fe565b005b34801561068b57600080fd5b506106a660048036038101906106a191906138bb565b6113dc565b005b3480156106b457600080fd5b506106cf60048036038101906106ca919061359a565b611635565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906135f1565b61167e565b005b610714600480360381019061070f919061359a565b6116fd565b005b34801561072257600080fd5b5061073d6004803603810190610738919061359a565b6119dc565b005b34801561074b57600080fd5b50610754611a25565b60405161076191906133dd565b60405180910390f35b34801561077657600080fd5b5061077f611a2b565b60405161078c91906135d6565b60405180910390f35b3480156107a157600080fd5b506107bc60048036038101906107b7919061359a565b611a55565b005b3480156107ca57600080fd5b506107d3611a9e565b6040516107e0919061354c565b60405180910390f35b3480156107f557600080fd5b506107fe611b30565b60405161080b91906133dd565b60405180910390f35b61082e6004803603810190610829919061359a565b611b36565b005b34801561083c57600080fd5b5061085760048036038101906108529190613908565b611d99565b005b34801561086557600080fd5b50610880600480360381019061087b91906138bb565b611daf565b005b34801561088e57600080fd5b506108a960048036038101906108a491906136b0565b611f2a565b005b3480156108b757600080fd5b506108d260048036038101906108cd91906139e9565b611fbd565b005b3480156108e057600080fd5b506108fb60048036038101906108f6919061359a565b61201f565b604051610908919061354c565b60405180910390f35b34801561091d57600080fd5b506109266120c6565b60405161093391906133dd565b60405180910390f35b34801561094857600080fd5b506109516120cc565b60405161095e91906133dd565b60405180910390f35b34801561097357600080fd5b5061098e60048036038101906109899190613a6c565b6120d6565b005b34801561099c57600080fd5b506109b760048036038101906109b29190613acc565b6122da565b6040516109c49190613498565b60405180910390f35b3480156109d957600080fd5b506109f460048036038101906109ef919061359a565b61236e565b005b348015610a0257600080fd5b50610a1d6004803603810190610a189190613397565b6123b7565b005b348015610a2b57600080fd5b50610a466004803603810190610a41919061359a565b6124af565b005b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab090613b58565b60405180910390fd5b601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bd157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610be15750610be0826124f8565b5b9050919050565b606060008054610bf790613ba7565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2390613ba7565b8015610c705780601f10610c4557610100808354040283529160200191610c70565b820191906000526020600020905b815481529060010190602001808311610c5357829003601f168201915b5050505050905090565b6000610c8582612562565b610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90613c4b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d0a826110f5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7290613cdd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d9a6125ce565b73ffffffffffffffffffffffffffffffffffffffff161480610dc95750610dc881610dc36125ce565b6122da565b5b610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff90613d6f565b60405180910390fd5b610e1283836125d6565b505050565b600f60009054906101000a900460ff1681565b610e3b610e356125ce565b8261268f565b610e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7190613e01565b60405180910390fd5b610e8583838361276d565b505050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60105481565b3373ffffffffffffffffffffffffffffffffffffffff16610f05611a2b565b73ffffffffffffffffffffffffffffffffffffffff1614610f2557600080fd5b6000479050610f32611a2b565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f77573d6000803e3d6000fd5b5050565b610f9683838360405180602001604052806000815250611fbd565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16610fba611a2b565b73ffffffffffffffffffffffffffffffffffffffff1614610fda57600080fd5b80600f60016101000a81548160ff02191690831515021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16611016611a2b565b73ffffffffffffffffffffffffffffffffffffffff161461103657600080fd5b8060118190555050565b3373ffffffffffffffffffffffffffffffffffffffff1661105f611a2b565b73ffffffffffffffffffffffffffffffffffffffff161461107f57600080fd5b80600e9080519060200190611095929190613282565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166110b8611a2b565b73ffffffffffffffffffffffffffffffffffffffff16146110d857600080fd5b80600d8190555050565b600f60019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590613e93565b60405180910390fd5b80915050919050565b60095481565b60006111b960076129d4565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122690613f25565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61127e6125ce565b73ffffffffffffffffffffffffffffffffffffffff1661129c611a2b565b73ffffffffffffffffffffffffffffffffffffffff16146112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e990613f91565b60405180910390fd5b6112fc60006129e2565b565b3373ffffffffffffffffffffffffffffffffffffffff1661131d611a2b565b73ffffffffffffffffffffffffffffffffffffffff161461133d57600080fd5b600d54600c541115611384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137b90613ffd565b60405180910390fd5b60005b600b548110156113d95761139b6007612aa8565b6113ae336113a960076129d4565b612abe565b600c60008154809291906113c19061404c565b919050555080806113d19061404c565b915050611387565b50565b3373ffffffffffffffffffffffffffffffffffffffff166113fb611a2b565b73ffffffffffffffffffffffffffffffffffffffff161461141b57600080fd5b60005b8282905081101561163057600073ffffffffffffffffffffffffffffffffffffffff1683838381811061145457611453614095565b5b90506020020160208101906114699190613397565b73ffffffffffffffffffffffffffffffffffffffff1614156114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b790614110565b60405180910390fd5b6001601460008585858181106114d9576114d8614095565b5b90506020020160208101906114ee9190613397565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060006015600085858581811061155857611557614095565b5b905060200201602081019061156d9190613397565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116115b457600061161c565b601560008484848181106115cb576115ca614095565b5b90506020020160208101906115e09190613397565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b5080806116289061404c565b91505061141e565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16611654611a2b565b73ffffffffffffffffffffffffffffffffffffffff161461167457600080fd5b8060108190555050565b3373ffffffffffffffffffffffffffffffffffffffff1661169d611a2b565b73ffffffffffffffffffffffffffffffffffffffff16146116bd57600080fd5b60005b818110156116f8576116d26007612aa8565b6116e5836116e060076129d4565b612abe565b80806116f09061404c565b9150506116c0565b505050565b60105461170a60076129d4565b111561174b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117429061417c565b60405180910390fd5b600061175760076129d4565b9050600f60019054906101000a900460ff166117a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179f906141e8565b60405180910390fd5b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90614254565b60405180910390fd5b6010548110611878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186f906142c0565b60405180910390fd5b6013548211156118bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b49061432c565b60405180910390fd5b60135482601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461190b919061434c565b111561194c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611943906143ee565b60405180910390fd5b81600a5461195a919061440e565b34101561199c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611993906144b4565b60405180910390fd5b60005b828110156119d7576119b16007612aa8565b6119c4336119bf60076129d4565b612abe565b80806119cf9061404c565b91505061199f565b505050565b3373ffffffffffffffffffffffffffffffffffffffff166119fb611a2b565b73ffffffffffffffffffffffffffffffffffffffff1614611a1b57600080fd5b8060138190555050565b60135481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff16611a74611a2b565b73ffffffffffffffffffffffffffffffffffffffff1614611a9457600080fd5b8060098190555050565b606060018054611aad90613ba7565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad990613ba7565b8015611b265780601f10611afb57610100808354040283529160200191611b26565b820191906000526020600020905b815481529060010190602001808311611b0957829003601f168201915b5050505050905090565b60115481565b601054611b4360076129d4565b1115611b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7b9061417c565b60405180910390fd5b6000611b9060076129d4565b9050611b9a611a2b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c7457600f60009054906101000a900460ff16611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1290614520565b60405180910390fd5b60125482611c28336111be565b611c32919061434c565b1115611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a9061458c565b60405180910390fd5b5b6010548282611c83919061434c565b1115611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb906145f8565b60405180910390fd5b601154821115611d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0090614664565b60405180910390fd5b81600954611d17919061440e565b341015611d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d50906146d0565b60405180910390fd5b60005b82811015611d9457611d6e6007612aa8565b611d8133611d7c60076129d4565b612abe565b8080611d8c9061404c565b915050611d5c565b505050565b611dab611da46125ce565b8383612adc565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16611dce611a2b565b73ffffffffffffffffffffffffffffffffffffffff1614611dee57600080fd5b60005b82829050811015611f2557600073ffffffffffffffffffffffffffffffffffffffff16838383818110611e2757611e26614095565b5b9050602002016020810190611e3c9190613397565b73ffffffffffffffffffffffffffffffffffffffff161415611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a90614110565b60405180910390fd5b600060146000858585818110611eac57611eab614095565b5b9050602002016020810190611ec19190613397565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611f1d9061404c565b915050611df1565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16611f49611a2b565b73ffffffffffffffffffffffffffffffffffffffff1614611f6957600080fd5b80600f60006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f81604051611fb29190613498565b60405180910390a150565b611fce611fc86125ce565b8361268f565b61200d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200490613e01565b60405180910390fd5b61201984848484612c49565b50505050565b606061202a82612562565b612069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206090614762565b60405180910390fd5b6000612073612ca5565b9050600081511161209357604051806020016040528060008152506120be565b8061209d84612d37565b6040516020016120ae9291906147be565b6040516020818303038152906040525b915050919050565b60125481565b6000600b54905090565b3373ffffffffffffffffffffffffffffffffffffffff166120f5611a2b565b73ffffffffffffffffffffffffffffffffffffffff161461211557600080fd5b600061212160076129d4565b90506010548482612132919061434c565b1115612173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216a906145f8565b60405180910390fd5b6010548111156121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af9061482e565b60405180910390fd5b60005b838390508110156122d357600073ffffffffffffffffffffffffffffffffffffffff168484838181106121f1576121f0614095565b5b90506020020160208101906122069190613397565b73ffffffffffffffffffffffffffffffffffffffff16141561225d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225490614110565b60405180910390fd5b60005b858110156122bf576122726007612aa8565b6122ac85858481811061228857612287614095565b5b905060200201602081019061229d9190613397565b6122a760076129d4565b612abe565b80806122b79061404c565b915050612260565b5080806122cb9061404c565b9150506121bb565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff1661238d611a2b565b73ffffffffffffffffffffffffffffffffffffffff16146123ad57600080fd5b8060128190555050565b6123bf6125ce565b73ffffffffffffffffffffffffffffffffffffffff166123dd611a2b565b73ffffffffffffffffffffffffffffffffffffffff1614612433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242a90613f91565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249a906148c0565b60405180910390fd5b6124ac816129e2565b50565b3373ffffffffffffffffffffffffffffffffffffffff166124ce611a2b565b73ffffffffffffffffffffffffffffffffffffffff16146124ee57600080fd5b80600b8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612649836110f5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061269a82612562565b6126d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d090614952565b60405180910390fd5b60006126e4836110f5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061275357508373ffffffffffffffffffffffffffffffffffffffff1661273b84610c7a565b73ffffffffffffffffffffffffffffffffffffffff16145b80612764575061276381856122da565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661278d826110f5565b73ffffffffffffffffffffffffffffffffffffffff16146127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da906149e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284a90614a76565b60405180910390fd5b61285e838383612e98565b6128696000826125d6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128b99190614a96565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612910919061434c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129cf838383612e9d565b505050565b600081600001549050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b612ad8828260405180602001604052806000815250612ea2565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4290614b16565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c3c9190613498565b60405180910390a3505050565b612c5484848461276d565b612c6084848484612efd565b612c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9690614ba8565b60405180910390fd5b50505050565b6060600e8054612cb490613ba7565b80601f0160208091040260200160405190810160405280929190818152602001828054612ce090613ba7565b8015612d2d5780601f10612d0257610100808354040283529160200191612d2d565b820191906000526020600020905b815481529060010190602001808311612d1057829003601f168201915b5050505050905090565b60606000821415612d7f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e93565b600082905060005b60008214612db1578080612d9a9061404c565b915050600a82612daa9190614bf7565b9150612d87565b60008167ffffffffffffffff811115612dcd57612dcc6136e7565b5b6040519080825280601f01601f191660200182016040528015612dff5781602001600182028036833780820191505090505b5090505b60008514612e8c57600182612e189190614a96565b9150600a85612e279190614c28565b6030612e33919061434c565b60f81b818381518110612e4957612e48614095565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e859190614bf7565b9450612e03565b8093505050505b919050565b505050565b505050565b612eac8383613085565b612eb96000848484612efd565b612ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eef90614ba8565b60405180910390fd5b505050565b6000612f1e8473ffffffffffffffffffffffffffffffffffffffff1661325f565b15613078578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f476125ce565b8786866040518563ffffffff1660e01b8152600401612f699493929190614cae565b6020604051808303816000875af1925050508015612fa557506040513d601f19601f82011682018060405250810190612fa29190614d0f565b60015b613028573d8060008114612fd5576040519150601f19603f3d011682016040523d82523d6000602084013e612fda565b606091505b50600081511415613020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301790614ba8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061307d565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ec90614d88565b60405180910390fd5b6130fe81612562565b1561313e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313590614df4565b60405180910390fd5b61314a60008383612e98565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461319a919061434c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461325b60008383612e9d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461328e90613ba7565b90600052602060002090601f0160209004810192826132b057600085556132f7565b82601f106132c957805160ff19168380011785556132f7565b828001600101855582156132f7579182015b828111156132f65782518255916020019190600101906132db565b5b5090506133049190613308565b5090565b5b80821115613321576000816000905550600101613309565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061336482613339565b9050919050565b61337481613359565b811461337f57600080fd5b50565b6000813590506133918161336b565b92915050565b6000602082840312156133ad576133ac61332f565b5b60006133bb84828501613382565b91505092915050565b6000819050919050565b6133d7816133c4565b82525050565b60006020820190506133f260008301846133ce565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61342d816133f8565b811461343857600080fd5b50565b60008135905061344a81613424565b92915050565b6000602082840312156134665761346561332f565b5b60006134748482850161343b565b91505092915050565b60008115159050919050565b6134928161347d565b82525050565b60006020820190506134ad6000830184613489565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134ed5780820151818401526020810190506134d2565b838111156134fc576000848401525b50505050565b6000601f19601f8301169050919050565b600061351e826134b3565b61352881856134be565b93506135388185602086016134cf565b61354181613502565b840191505092915050565b600060208201905081810360008301526135668184613513565b905092915050565b613577816133c4565b811461358257600080fd5b50565b6000813590506135948161356e565b92915050565b6000602082840312156135b0576135af61332f565b5b60006135be84828501613585565b91505092915050565b6135d081613359565b82525050565b60006020820190506135eb60008301846135c7565b92915050565b600080604083850312156136085761360761332f565b5b600061361685828601613382565b925050602061362785828601613585565b9150509250929050565b60008060006060848603121561364a5761364961332f565b5b600061365886828701613382565b935050602061366986828701613382565b925050604061367a86828701613585565b9150509250925092565b61368d8161347d565b811461369857600080fd5b50565b6000813590506136aa81613684565b92915050565b6000602082840312156136c6576136c561332f565b5b60006136d48482850161369b565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61371f82613502565b810181811067ffffffffffffffff8211171561373e5761373d6136e7565b5b80604052505050565b6000613751613325565b905061375d8282613716565b919050565b600067ffffffffffffffff82111561377d5761377c6136e7565b5b61378682613502565b9050602081019050919050565b82818337600083830152505050565b60006137b56137b084613762565b613747565b9050828152602081018484840111156137d1576137d06136e2565b5b6137dc848285613793565b509392505050565b600082601f8301126137f9576137f86136dd565b5b81356138098482602086016137a2565b91505092915050565b6000602082840312156138285761382761332f565b5b600082013567ffffffffffffffff81111561384657613845613334565b5b613852848285016137e4565b91505092915050565b600080fd5b600080fd5b60008083601f84011261387b5761387a6136dd565b5b8235905067ffffffffffffffff8111156138985761389761385b565b5b6020830191508360208202830111156138b4576138b3613860565b5b9250929050565b600080602083850312156138d2576138d161332f565b5b600083013567ffffffffffffffff8111156138f0576138ef613334565b5b6138fc85828601613865565b92509250509250929050565b6000806040838503121561391f5761391e61332f565b5b600061392d85828601613382565b925050602061393e8582860161369b565b9150509250929050565b600067ffffffffffffffff821115613963576139626136e7565b5b61396c82613502565b9050602081019050919050565b600061398c61398784613948565b613747565b9050828152602081018484840111156139a8576139a76136e2565b5b6139b3848285613793565b509392505050565b600082601f8301126139d0576139cf6136dd565b5b81356139e0848260208601613979565b91505092915050565b60008060008060808587031215613a0357613a0261332f565b5b6000613a1187828801613382565b9450506020613a2287828801613382565b9350506040613a3387828801613585565b925050606085013567ffffffffffffffff811115613a5457613a53613334565b5b613a60878288016139bb565b91505092959194509250565b600080600060408486031215613a8557613a8461332f565b5b6000613a9386828701613585565b935050602084013567ffffffffffffffff811115613ab457613ab3613334565b5b613ac086828701613865565b92509250509250925092565b60008060408385031215613ae357613ae261332f565b5b6000613af185828601613382565b9250506020613b0285828601613382565b9150509250929050565b7f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c6973740000600082015250565b6000613b42601e836134be565b9150613b4d82613b0c565b602082019050919050565b60006020820190508181036000830152613b7181613b35565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613bbf57607f821691505b60208210811415613bd357613bd2613b78565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c35602c836134be565b9150613c4082613bd9565b604082019050919050565b60006020820190508181036000830152613c6481613c28565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cc76021836134be565b9150613cd282613c6b565b604082019050919050565b60006020820190508181036000830152613cf681613cba565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613d596038836134be565b9150613d6482613cfd565b604082019050919050565b60006020820190508181036000830152613d8881613d4c565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613deb6031836134be565b9150613df682613d8f565b604082019050919050565b60006020820190508181036000830152613e1a81613dde565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613e7d6029836134be565b9150613e8882613e21565b604082019050919050565b60006020820190508181036000830152613eac81613e70565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613f0f602a836134be565b9150613f1a82613eb3565b604082019050919050565b60006020820190508181036000830152613f3e81613f02565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613f7b6020836134be565b9150613f8682613f45565b602082019050919050565b60006020820190508181036000830152613faa81613f6e565b9050919050565b7f4d61782052657365727665732074616b656e20616c7265616479210000000000600082015250565b6000613fe7601b836134be565b9150613ff282613fb1565b602082019050919050565b6000602082019050818103600083015261401681613fda565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614057826133c4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561408a5761408961401d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e2774206164642061206e756c6c20616464726573730000000000000000600082015250565b60006140fa6018836134be565b9150614105826140c4565b602082019050919050565b60006020820190508181036000830152614129816140ed565b9050919050565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b6000614166600f836134be565b915061417182614130565b602082019050919050565b6000602082019050818103600083015261419581614159565b9050919050565b7f416c6c6f77204c697374206973206e6f74206163746976650000000000000000600082015250565b60006141d26018836134be565b91506141dd8261419c565b602082019050919050565b60006020820190508181036000830152614201816141c5565b9050919050565b7f596f7520617265206e6f74206f6e2074686520416c6c6f77204c697374000000600082015250565b600061423e601d836134be565b915061424982614208565b602082019050919050565b6000602082019050818103600083015261426d81614231565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b60006142aa601b836134be565b91506142b582614274565b602082019050919050565b600060208201905081810360008301526142d98161429d565b9050919050565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b60006143166020836134be565b9150614321826142e0565b602082019050919050565b6000602082019050818103600083015261434581614309565b9050919050565b6000614357826133c4565b9150614362836133c4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143975761439661401d565b5b828201905092915050565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b60006143d8601c836134be565b91506143e3826143a2565b602082019050919050565b60006020820190508181036000830152614407816143cb565b9050919050565b6000614419826133c4565b9150614424836133c4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561445d5761445c61401d565b5b828202905092915050565b7f496e7375666669656e742045544820616d6f756e742073656e742e0000000000600082015250565b600061449e601b836134be565b91506144a982614468565b602082019050919050565b600060208201905081810360008301526144cd81614491565b9050919050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b600061450a601d836134be565b9150614515826144d4565b602082019050919050565b60006020820190508181036000830152614539816144fd565b9050919050565b7f4d617820686f6c64696e672063617020726561636865642e0000000000000000600082015250565b60006145766018836134be565b915061458182614540565b602082019050919050565b600060208201905081810360008301526145a581614569565b9050919050565b7f546f74616c20737570706c792065786365656465642e00000000000000000000600082015250565b60006145e26016836134be565b91506145ed826145ac565b602082019050919050565b60006020820190508181036000830152614611816145d5565b9050919050565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b600061464e601e836134be565b915061465982614618565b602082019050919050565b6000602082019050818103600083015261467d81614641565b9050919050565b7f496e73756666696369656e742045544820616d6f756e742073656e742e000000600082015250565b60006146ba601d836134be565b91506146c582614684565b602082019050919050565b600060208201905081810360008301526146e9816146ad565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061474c602f836134be565b9150614757826146f0565b604082019050919050565b6000602082019050818103600083015261477b8161473f565b9050919050565b600081905092915050565b6000614798826134b3565b6147a28185614782565b93506147b28185602086016134cf565b80840191505092915050565b60006147ca828561478d565b91506147d6828461478d565b91508190509392505050565b7f546f74616c20737570706c79207370656e742e00000000000000000000000000600082015250565b60006148186013836134be565b9150614823826147e2565b602082019050919050565b600060208201905081810360008301526148478161480b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148aa6026836134be565b91506148b58261484e565b604082019050919050565b600060208201905081810360008301526148d98161489d565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061493c602c836134be565b9150614947826148e0565b604082019050919050565b6000602082019050818103600083015261496b8161492f565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006149ce6025836134be565b91506149d982614972565b604082019050919050565b600060208201905081810360008301526149fd816149c1565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a606024836134be565b9150614a6b82614a04565b604082019050919050565b60006020820190508181036000830152614a8f81614a53565b9050919050565b6000614aa1826133c4565b9150614aac836133c4565b925082821015614abf57614abe61401d565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614b006019836134be565b9150614b0b82614aca565b602082019050919050565b60006020820190508181036000830152614b2f81614af3565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614b926032836134be565b9150614b9d82614b36565b604082019050919050565b60006020820190508181036000830152614bc181614b85565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c02826133c4565b9150614c0d836133c4565b925082614c1d57614c1c614bc8565b5b828204905092915050565b6000614c33826133c4565b9150614c3e836133c4565b925082614c4e57614c4d614bc8565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614c8082614c59565b614c8a8185614c64565b9350614c9a8185602086016134cf565b614ca381613502565b840191505092915050565b6000608082019050614cc360008301876135c7565b614cd060208301866135c7565b614cdd60408301856133ce565b8181036060830152614cef8184614c75565b905095945050505050565b600081519050614d0981613424565b92915050565b600060208284031215614d2557614d2461332f565b5b6000614d3384828501614cfa565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614d726020836134be565b9150614d7d82614d3c565b602082019050919050565b60006020820190508181036000830152614da181614d65565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614dde601c836134be565b9150614de982614da8565b602082019050919050565b60006020820190508181036000830152614e0d81614dd1565b905091905056fea26469706673582212201732cf5a71c465cca68c1ffeda5440b2fd8e8e5097f06ec897111f9722f0964464736f6c634300080b00330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d61794d59666e78556a344a676876596d4679337677634e53396e7972416554553569674b6d5777654571777a2f000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061027b5760003560e01c80637263cfe21161014f578063a22cb465116100c1578063e7b62d961161007a578063e7b62d961461093c578063e82b2a7114610967578063e985e9c514610990578063ea6eb836146109cd578063f2fde38b146109f6578063f6c9d9e314610a1f5761027b565b8063a22cb46514610830578063a51312c814610859578063acec338a14610882578063b88d4fde146108ab578063c87b56dd146108d4578063cadf8818146109115761027b565b80637f44ab2f116101135780637f44ab2f1461073f5780638da5cb5b1461076a57806391b7f5ed1461079557806395d89b41146107be5780639a3bf728146107e9578063a0712d68146108145761027b565b80637263cfe21461067f5780637389fbb7146106a857806377b501b9146106d15780637835c635146106fa5780637a6685f1146107165761027b565b806342842e0e116101f35780636352211e116101ac5780636352211e146105815780636817c76c146105be5780636de9f32b146105e957806370a0823114610614578063715018a61461065157806371e3500c146106685761027b565b806342842e0e14610489578063443da2a2146104b25780634dfea627146104db57806355f804b31461050457806356a87caa1461052d57806360d938dc146105565761027b565b8063095ea7b311610245578063095ea7b31461038d57806322f3e2d4146103b657806323b872dd146103e15780632c1205f41461040a57806332cb6b0c146104475780633ccfd60b146104725761027b565b806208ffdd146102805780620e7fa8146102bd57806301ffc9a7146102e857806306fdde0314610325578063081812fc14610350575b600080fd5b34801561028c57600080fd5b506102a760048036038101906102a29190613397565b610a48565b6040516102b491906133dd565b60405180910390f35b3480156102c957600080fd5b506102d2610b00565b6040516102df91906133dd565b60405180910390f35b3480156102f457600080fd5b5061030f600480360381019061030a9190613450565b610b06565b60405161031c9190613498565b60405180910390f35b34801561033157600080fd5b5061033a610be8565b604051610347919061354c565b60405180910390f35b34801561035c57600080fd5b506103776004803603810190610372919061359a565b610c7a565b60405161038491906135d6565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af91906135f1565b610cff565b005b3480156103c257600080fd5b506103cb610e17565b6040516103d89190613498565b60405180910390f35b3480156103ed57600080fd5b5061040860048036038101906104039190613631565b610e2a565b005b34801561041657600080fd5b50610431600480360381019061042c9190613397565b610e8a565b60405161043e9190613498565b60405180910390f35b34801561045357600080fd5b5061045c610ee0565b60405161046991906133dd565b60405180910390f35b34801561047e57600080fd5b50610487610ee6565b005b34801561049557600080fd5b506104b060048036038101906104ab9190613631565b610f7b565b005b3480156104be57600080fd5b506104d960048036038101906104d491906136b0565b610f9b565b005b3480156104e757600080fd5b5061050260048036038101906104fd919061359a565b610ff7565b005b34801561051057600080fd5b5061052b60048036038101906105269190613812565b611040565b005b34801561053957600080fd5b50610554600480360381019061054f919061359a565b611099565b005b34801561056257600080fd5b5061056b6110e2565b6040516105789190613498565b60405180910390f35b34801561058d57600080fd5b506105a860048036038101906105a3919061359a565b6110f5565b6040516105b591906135d6565b60405180910390f35b3480156105ca57600080fd5b506105d36111a7565b6040516105e091906133dd565b60405180910390f35b3480156105f557600080fd5b506105fe6111ad565b60405161060b91906133dd565b60405180910390f35b34801561062057600080fd5b5061063b60048036038101906106369190613397565b6111be565b60405161064891906133dd565b60405180910390f35b34801561065d57600080fd5b50610666611276565b005b34801561067457600080fd5b5061067d6112fe565b005b34801561068b57600080fd5b506106a660048036038101906106a191906138bb565b6113dc565b005b3480156106b457600080fd5b506106cf60048036038101906106ca919061359a565b611635565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906135f1565b61167e565b005b610714600480360381019061070f919061359a565b6116fd565b005b34801561072257600080fd5b5061073d6004803603810190610738919061359a565b6119dc565b005b34801561074b57600080fd5b50610754611a25565b60405161076191906133dd565b60405180910390f35b34801561077657600080fd5b5061077f611a2b565b60405161078c91906135d6565b60405180910390f35b3480156107a157600080fd5b506107bc60048036038101906107b7919061359a565b611a55565b005b3480156107ca57600080fd5b506107d3611a9e565b6040516107e0919061354c565b60405180910390f35b3480156107f557600080fd5b506107fe611b30565b60405161080b91906133dd565b60405180910390f35b61082e6004803603810190610829919061359a565b611b36565b005b34801561083c57600080fd5b5061085760048036038101906108529190613908565b611d99565b005b34801561086557600080fd5b50610880600480360381019061087b91906138bb565b611daf565b005b34801561088e57600080fd5b506108a960048036038101906108a491906136b0565b611f2a565b005b3480156108b757600080fd5b506108d260048036038101906108cd91906139e9565b611fbd565b005b3480156108e057600080fd5b506108fb60048036038101906108f6919061359a565b61201f565b604051610908919061354c565b60405180910390f35b34801561091d57600080fd5b506109266120c6565b60405161093391906133dd565b60405180910390f35b34801561094857600080fd5b506109516120cc565b60405161095e91906133dd565b60405180910390f35b34801561097357600080fd5b5061098e60048036038101906109899190613a6c565b6120d6565b005b34801561099c57600080fd5b506109b760048036038101906109b29190613acc565b6122da565b6040516109c49190613498565b60405180910390f35b3480156109d957600080fd5b506109f460048036038101906109ef919061359a565b61236e565b005b348015610a0257600080fd5b50610a1d6004803603810190610a189190613397565b6123b7565b005b348015610a2b57600080fd5b50610a466004803603810190610a41919061359a565b6124af565b005b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab090613b58565b60405180910390fd5b601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bd157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610be15750610be0826124f8565b5b9050919050565b606060008054610bf790613ba7565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2390613ba7565b8015610c705780601f10610c4557610100808354040283529160200191610c70565b820191906000526020600020905b815481529060010190602001808311610c5357829003601f168201915b5050505050905090565b6000610c8582612562565b610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90613c4b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d0a826110f5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7290613cdd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d9a6125ce565b73ffffffffffffffffffffffffffffffffffffffff161480610dc95750610dc881610dc36125ce565b6122da565b5b610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff90613d6f565b60405180910390fd5b610e1283836125d6565b505050565b600f60009054906101000a900460ff1681565b610e3b610e356125ce565b8261268f565b610e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7190613e01565b60405180910390fd5b610e8583838361276d565b505050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60105481565b3373ffffffffffffffffffffffffffffffffffffffff16610f05611a2b565b73ffffffffffffffffffffffffffffffffffffffff1614610f2557600080fd5b6000479050610f32611a2b565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f77573d6000803e3d6000fd5b5050565b610f9683838360405180602001604052806000815250611fbd565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16610fba611a2b565b73ffffffffffffffffffffffffffffffffffffffff1614610fda57600080fd5b80600f60016101000a81548160ff02191690831515021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16611016611a2b565b73ffffffffffffffffffffffffffffffffffffffff161461103657600080fd5b8060118190555050565b3373ffffffffffffffffffffffffffffffffffffffff1661105f611a2b565b73ffffffffffffffffffffffffffffffffffffffff161461107f57600080fd5b80600e9080519060200190611095929190613282565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166110b8611a2b565b73ffffffffffffffffffffffffffffffffffffffff16146110d857600080fd5b80600d8190555050565b600f60019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590613e93565b60405180910390fd5b80915050919050565b60095481565b60006111b960076129d4565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122690613f25565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61127e6125ce565b73ffffffffffffffffffffffffffffffffffffffff1661129c611a2b565b73ffffffffffffffffffffffffffffffffffffffff16146112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e990613f91565b60405180910390fd5b6112fc60006129e2565b565b3373ffffffffffffffffffffffffffffffffffffffff1661131d611a2b565b73ffffffffffffffffffffffffffffffffffffffff161461133d57600080fd5b600d54600c541115611384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137b90613ffd565b60405180910390fd5b60005b600b548110156113d95761139b6007612aa8565b6113ae336113a960076129d4565b612abe565b600c60008154809291906113c19061404c565b919050555080806113d19061404c565b915050611387565b50565b3373ffffffffffffffffffffffffffffffffffffffff166113fb611a2b565b73ffffffffffffffffffffffffffffffffffffffff161461141b57600080fd5b60005b8282905081101561163057600073ffffffffffffffffffffffffffffffffffffffff1683838381811061145457611453614095565b5b90506020020160208101906114699190613397565b73ffffffffffffffffffffffffffffffffffffffff1614156114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b790614110565b60405180910390fd5b6001601460008585858181106114d9576114d8614095565b5b90506020020160208101906114ee9190613397565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060006015600085858581811061155857611557614095565b5b905060200201602081019061156d9190613397565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116115b457600061161c565b601560008484848181106115cb576115ca614095565b5b90506020020160208101906115e09190613397565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b5080806116289061404c565b91505061141e565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16611654611a2b565b73ffffffffffffffffffffffffffffffffffffffff161461167457600080fd5b8060108190555050565b3373ffffffffffffffffffffffffffffffffffffffff1661169d611a2b565b73ffffffffffffffffffffffffffffffffffffffff16146116bd57600080fd5b60005b818110156116f8576116d26007612aa8565b6116e5836116e060076129d4565b612abe565b80806116f09061404c565b9150506116c0565b505050565b60105461170a60076129d4565b111561174b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117429061417c565b60405180910390fd5b600061175760076129d4565b9050600f60019054906101000a900460ff166117a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179f906141e8565b60405180910390fd5b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90614254565b60405180910390fd5b6010548110611878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186f906142c0565b60405180910390fd5b6013548211156118bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b49061432c565b60405180910390fd5b60135482601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461190b919061434c565b111561194c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611943906143ee565b60405180910390fd5b81600a5461195a919061440e565b34101561199c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611993906144b4565b60405180910390fd5b60005b828110156119d7576119b16007612aa8565b6119c4336119bf60076129d4565b612abe565b80806119cf9061404c565b91505061199f565b505050565b3373ffffffffffffffffffffffffffffffffffffffff166119fb611a2b565b73ffffffffffffffffffffffffffffffffffffffff1614611a1b57600080fd5b8060138190555050565b60135481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff16611a74611a2b565b73ffffffffffffffffffffffffffffffffffffffff1614611a9457600080fd5b8060098190555050565b606060018054611aad90613ba7565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad990613ba7565b8015611b265780601f10611afb57610100808354040283529160200191611b26565b820191906000526020600020905b815481529060010190602001808311611b0957829003601f168201915b5050505050905090565b60115481565b601054611b4360076129d4565b1115611b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7b9061417c565b60405180910390fd5b6000611b9060076129d4565b9050611b9a611a2b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c7457600f60009054906101000a900460ff16611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1290614520565b60405180910390fd5b60125482611c28336111be565b611c32919061434c565b1115611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a9061458c565b60405180910390fd5b5b6010548282611c83919061434c565b1115611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb906145f8565b60405180910390fd5b601154821115611d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0090614664565b60405180910390fd5b81600954611d17919061440e565b341015611d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d50906146d0565b60405180910390fd5b60005b82811015611d9457611d6e6007612aa8565b611d8133611d7c60076129d4565b612abe565b8080611d8c9061404c565b915050611d5c565b505050565b611dab611da46125ce565b8383612adc565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16611dce611a2b565b73ffffffffffffffffffffffffffffffffffffffff1614611dee57600080fd5b60005b82829050811015611f2557600073ffffffffffffffffffffffffffffffffffffffff16838383818110611e2757611e26614095565b5b9050602002016020810190611e3c9190613397565b73ffffffffffffffffffffffffffffffffffffffff161415611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a90614110565b60405180910390fd5b600060146000858585818110611eac57611eab614095565b5b9050602002016020810190611ec19190613397565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611f1d9061404c565b915050611df1565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16611f49611a2b565b73ffffffffffffffffffffffffffffffffffffffff1614611f6957600080fd5b80600f60006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f81604051611fb29190613498565b60405180910390a150565b611fce611fc86125ce565b8361268f565b61200d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200490613e01565b60405180910390fd5b61201984848484612c49565b50505050565b606061202a82612562565b612069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206090614762565b60405180910390fd5b6000612073612ca5565b9050600081511161209357604051806020016040528060008152506120be565b8061209d84612d37565b6040516020016120ae9291906147be565b6040516020818303038152906040525b915050919050565b60125481565b6000600b54905090565b3373ffffffffffffffffffffffffffffffffffffffff166120f5611a2b565b73ffffffffffffffffffffffffffffffffffffffff161461211557600080fd5b600061212160076129d4565b90506010548482612132919061434c565b1115612173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216a906145f8565b60405180910390fd5b6010548111156121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af9061482e565b60405180910390fd5b60005b838390508110156122d357600073ffffffffffffffffffffffffffffffffffffffff168484838181106121f1576121f0614095565b5b90506020020160208101906122069190613397565b73ffffffffffffffffffffffffffffffffffffffff16141561225d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225490614110565b60405180910390fd5b60005b858110156122bf576122726007612aa8565b6122ac85858481811061228857612287614095565b5b905060200201602081019061229d9190613397565b6122a760076129d4565b612abe565b80806122b79061404c565b915050612260565b5080806122cb9061404c565b9150506121bb565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff1661238d611a2b565b73ffffffffffffffffffffffffffffffffffffffff16146123ad57600080fd5b8060128190555050565b6123bf6125ce565b73ffffffffffffffffffffffffffffffffffffffff166123dd611a2b565b73ffffffffffffffffffffffffffffffffffffffff1614612433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242a90613f91565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249a906148c0565b60405180910390fd5b6124ac816129e2565b50565b3373ffffffffffffffffffffffffffffffffffffffff166124ce611a2b565b73ffffffffffffffffffffffffffffffffffffffff16146124ee57600080fd5b80600b8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612649836110f5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061269a82612562565b6126d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d090614952565b60405180910390fd5b60006126e4836110f5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061275357508373ffffffffffffffffffffffffffffffffffffffff1661273b84610c7a565b73ffffffffffffffffffffffffffffffffffffffff16145b80612764575061276381856122da565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661278d826110f5565b73ffffffffffffffffffffffffffffffffffffffff16146127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da906149e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284a90614a76565b60405180910390fd5b61285e838383612e98565b6128696000826125d6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128b99190614a96565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612910919061434c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129cf838383612e9d565b505050565b600081600001549050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b612ad8828260405180602001604052806000815250612ea2565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4290614b16565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c3c9190613498565b60405180910390a3505050565b612c5484848461276d565b612c6084848484612efd565b612c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9690614ba8565b60405180910390fd5b50505050565b6060600e8054612cb490613ba7565b80601f0160208091040260200160405190810160405280929190818152602001828054612ce090613ba7565b8015612d2d5780601f10612d0257610100808354040283529160200191612d2d565b820191906000526020600020905b815481529060010190602001808311612d1057829003601f168201915b5050505050905090565b60606000821415612d7f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e93565b600082905060005b60008214612db1578080612d9a9061404c565b915050600a82612daa9190614bf7565b9150612d87565b60008167ffffffffffffffff811115612dcd57612dcc6136e7565b5b6040519080825280601f01601f191660200182016040528015612dff5781602001600182028036833780820191505090505b5090505b60008514612e8c57600182612e189190614a96565b9150600a85612e279190614c28565b6030612e33919061434c565b60f81b818381518110612e4957612e48614095565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e859190614bf7565b9450612e03565b8093505050505b919050565b505050565b505050565b612eac8383613085565b612eb96000848484612efd565b612ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eef90614ba8565b60405180910390fd5b505050565b6000612f1e8473ffffffffffffffffffffffffffffffffffffffff1661325f565b15613078578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f476125ce565b8786866040518563ffffffff1660e01b8152600401612f699493929190614cae565b6020604051808303816000875af1925050508015612fa557506040513d601f19601f82011682018060405250810190612fa29190614d0f565b60015b613028573d8060008114612fd5576040519150601f19603f3d011682016040523d82523d6000602084013e612fda565b606091505b50600081511415613020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301790614ba8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061307d565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ec90614d88565b60405180910390fd5b6130fe81612562565b1561313e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313590614df4565b60405180910390fd5b61314a60008383612e98565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461319a919061434c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461325b60008383612e9d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461328e90613ba7565b90600052602060002090601f0160209004810192826132b057600085556132f7565b82601f106132c957805160ff19168380011785556132f7565b828001600101855582156132f7579182015b828111156132f65782518255916020019190600101906132db565b5b5090506133049190613308565b5090565b5b80821115613321576000816000905550600101613309565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061336482613339565b9050919050565b61337481613359565b811461337f57600080fd5b50565b6000813590506133918161336b565b92915050565b6000602082840312156133ad576133ac61332f565b5b60006133bb84828501613382565b91505092915050565b6000819050919050565b6133d7816133c4565b82525050565b60006020820190506133f260008301846133ce565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61342d816133f8565b811461343857600080fd5b50565b60008135905061344a81613424565b92915050565b6000602082840312156134665761346561332f565b5b60006134748482850161343b565b91505092915050565b60008115159050919050565b6134928161347d565b82525050565b60006020820190506134ad6000830184613489565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134ed5780820151818401526020810190506134d2565b838111156134fc576000848401525b50505050565b6000601f19601f8301169050919050565b600061351e826134b3565b61352881856134be565b93506135388185602086016134cf565b61354181613502565b840191505092915050565b600060208201905081810360008301526135668184613513565b905092915050565b613577816133c4565b811461358257600080fd5b50565b6000813590506135948161356e565b92915050565b6000602082840312156135b0576135af61332f565b5b60006135be84828501613585565b91505092915050565b6135d081613359565b82525050565b60006020820190506135eb60008301846135c7565b92915050565b600080604083850312156136085761360761332f565b5b600061361685828601613382565b925050602061362785828601613585565b9150509250929050565b60008060006060848603121561364a5761364961332f565b5b600061365886828701613382565b935050602061366986828701613382565b925050604061367a86828701613585565b9150509250925092565b61368d8161347d565b811461369857600080fd5b50565b6000813590506136aa81613684565b92915050565b6000602082840312156136c6576136c561332f565b5b60006136d48482850161369b565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61371f82613502565b810181811067ffffffffffffffff8211171561373e5761373d6136e7565b5b80604052505050565b6000613751613325565b905061375d8282613716565b919050565b600067ffffffffffffffff82111561377d5761377c6136e7565b5b61378682613502565b9050602081019050919050565b82818337600083830152505050565b60006137b56137b084613762565b613747565b9050828152602081018484840111156137d1576137d06136e2565b5b6137dc848285613793565b509392505050565b600082601f8301126137f9576137f86136dd565b5b81356138098482602086016137a2565b91505092915050565b6000602082840312156138285761382761332f565b5b600082013567ffffffffffffffff81111561384657613845613334565b5b613852848285016137e4565b91505092915050565b600080fd5b600080fd5b60008083601f84011261387b5761387a6136dd565b5b8235905067ffffffffffffffff8111156138985761389761385b565b5b6020830191508360208202830111156138b4576138b3613860565b5b9250929050565b600080602083850312156138d2576138d161332f565b5b600083013567ffffffffffffffff8111156138f0576138ef613334565b5b6138fc85828601613865565b92509250509250929050565b6000806040838503121561391f5761391e61332f565b5b600061392d85828601613382565b925050602061393e8582860161369b565b9150509250929050565b600067ffffffffffffffff821115613963576139626136e7565b5b61396c82613502565b9050602081019050919050565b600061398c61398784613948565b613747565b9050828152602081018484840111156139a8576139a76136e2565b5b6139b3848285613793565b509392505050565b600082601f8301126139d0576139cf6136dd565b5b81356139e0848260208601613979565b91505092915050565b60008060008060808587031215613a0357613a0261332f565b5b6000613a1187828801613382565b9450506020613a2287828801613382565b9350506040613a3387828801613585565b925050606085013567ffffffffffffffff811115613a5457613a53613334565b5b613a60878288016139bb565b91505092959194509250565b600080600060408486031215613a8557613a8461332f565b5b6000613a9386828701613585565b935050602084013567ffffffffffffffff811115613ab457613ab3613334565b5b613ac086828701613865565b92509250509250925092565b60008060408385031215613ae357613ae261332f565b5b6000613af185828601613382565b9250506020613b0285828601613382565b9150509250929050565b7f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c6973740000600082015250565b6000613b42601e836134be565b9150613b4d82613b0c565b602082019050919050565b60006020820190508181036000830152613b7181613b35565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613bbf57607f821691505b60208210811415613bd357613bd2613b78565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c35602c836134be565b9150613c4082613bd9565b604082019050919050565b60006020820190508181036000830152613c6481613c28565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cc76021836134be565b9150613cd282613c6b565b604082019050919050565b60006020820190508181036000830152613cf681613cba565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613d596038836134be565b9150613d6482613cfd565b604082019050919050565b60006020820190508181036000830152613d8881613d4c565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613deb6031836134be565b9150613df682613d8f565b604082019050919050565b60006020820190508181036000830152613e1a81613dde565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613e7d6029836134be565b9150613e8882613e21565b604082019050919050565b60006020820190508181036000830152613eac81613e70565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613f0f602a836134be565b9150613f1a82613eb3565b604082019050919050565b60006020820190508181036000830152613f3e81613f02565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613f7b6020836134be565b9150613f8682613f45565b602082019050919050565b60006020820190508181036000830152613faa81613f6e565b9050919050565b7f4d61782052657365727665732074616b656e20616c7265616479210000000000600082015250565b6000613fe7601b836134be565b9150613ff282613fb1565b602082019050919050565b6000602082019050818103600083015261401681613fda565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614057826133c4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561408a5761408961401d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e2774206164642061206e756c6c20616464726573730000000000000000600082015250565b60006140fa6018836134be565b9150614105826140c4565b602082019050919050565b60006020820190508181036000830152614129816140ed565b9050919050565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b6000614166600f836134be565b915061417182614130565b602082019050919050565b6000602082019050818103600083015261419581614159565b9050919050565b7f416c6c6f77204c697374206973206e6f74206163746976650000000000000000600082015250565b60006141d26018836134be565b91506141dd8261419c565b602082019050919050565b60006020820190508181036000830152614201816141c5565b9050919050565b7f596f7520617265206e6f74206f6e2074686520416c6c6f77204c697374000000600082015250565b600061423e601d836134be565b915061424982614208565b602082019050919050565b6000602082019050818103600083015261426d81614231565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b60006142aa601b836134be565b91506142b582614274565b602082019050919050565b600060208201905081810360008301526142d98161429d565b9050919050565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b60006143166020836134be565b9150614321826142e0565b602082019050919050565b6000602082019050818103600083015261434581614309565b9050919050565b6000614357826133c4565b9150614362836133c4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143975761439661401d565b5b828201905092915050565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b60006143d8601c836134be565b91506143e3826143a2565b602082019050919050565b60006020820190508181036000830152614407816143cb565b9050919050565b6000614419826133c4565b9150614424836133c4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561445d5761445c61401d565b5b828202905092915050565b7f496e7375666669656e742045544820616d6f756e742073656e742e0000000000600082015250565b600061449e601b836134be565b91506144a982614468565b602082019050919050565b600060208201905081810360008301526144cd81614491565b9050919050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b600061450a601d836134be565b9150614515826144d4565b602082019050919050565b60006020820190508181036000830152614539816144fd565b9050919050565b7f4d617820686f6c64696e672063617020726561636865642e0000000000000000600082015250565b60006145766018836134be565b915061458182614540565b602082019050919050565b600060208201905081810360008301526145a581614569565b9050919050565b7f546f74616c20737570706c792065786365656465642e00000000000000000000600082015250565b60006145e26016836134be565b91506145ed826145ac565b602082019050919050565b60006020820190508181036000830152614611816145d5565b9050919050565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b600061464e601e836134be565b915061465982614618565b602082019050919050565b6000602082019050818103600083015261467d81614641565b9050919050565b7f496e73756666696369656e742045544820616d6f756e742073656e742e000000600082015250565b60006146ba601d836134be565b91506146c582614684565b602082019050919050565b600060208201905081810360008301526146e9816146ad565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061474c602f836134be565b9150614757826146f0565b604082019050919050565b6000602082019050818103600083015261477b8161473f565b9050919050565b600081905092915050565b6000614798826134b3565b6147a28185614782565b93506147b28185602086016134cf565b80840191505092915050565b60006147ca828561478d565b91506147d6828461478d565b91508190509392505050565b7f546f74616c20737570706c79207370656e742e00000000000000000000000000600082015250565b60006148186013836134be565b9150614823826147e2565b602082019050919050565b600060208201905081810360008301526148478161480b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148aa6026836134be565b91506148b58261484e565b604082019050919050565b600060208201905081810360008301526148d98161489d565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061493c602c836134be565b9150614947826148e0565b604082019050919050565b6000602082019050818103600083015261496b8161492f565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006149ce6025836134be565b91506149d982614972565b604082019050919050565b600060208201905081810360008301526149fd816149c1565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a606024836134be565b9150614a6b82614a04565b604082019050919050565b60006020820190508181036000830152614a8f81614a53565b9050919050565b6000614aa1826133c4565b9150614aac836133c4565b925082821015614abf57614abe61401d565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614b006019836134be565b9150614b0b82614aca565b602082019050919050565b60006020820190508181036000830152614b2f81614af3565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614b926032836134be565b9150614b9d82614b36565b604082019050919050565b60006020820190508181036000830152614bc181614b85565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c02826133c4565b9150614c0d836133c4565b925082614c1d57614c1c614bc8565b5b828204905092915050565b6000614c33826133c4565b9150614c3e836133c4565b925082614c4e57614c4d614bc8565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614c8082614c59565b614c8a8185614c64565b9350614c9a8185602086016134cf565b614ca381613502565b840191505092915050565b6000608082019050614cc360008301876135c7565b614cd060208301866135c7565b614cdd60408301856133ce565b8181036060830152614cef8184614c75565b905095945050505050565b600081519050614d0981613424565b92915050565b600060208284031215614d2557614d2461332f565b5b6000614d3384828501614cfa565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614d726020836134be565b9150614d7d82614d3c565b602082019050919050565b60006020820190508181036000830152614da181614d65565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614dde601c836134be565b9150614de982614da8565b602082019050919050565b60006020820190508181036000830152614e0d81614dd1565b905091905056fea26469706673582212201732cf5a71c465cca68c1ffeda5440b2fd8e8e5097f06ec897111f9722f0964464736f6c634300080b0033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d61794d59666e78556a344a676876596d4679337677634e53396e7972416554553569674b6d5777654571777a2f000000000000000000000000000000

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

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [2] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [3] : 732f516d61794d59666e78556a344a676876596d4679337677634e53396e7972
Arg [4] : 416554553569674b6d5777654571777a2f000000000000000000000000000000


Deployed Bytecode Sourcemap

138:6326:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2904:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;361:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1505:300:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2423:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3935:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3473:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;557:28:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4662:330:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2522:107:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;632:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6327:134;;;;;;;;;;;;;:::i;:::-;;5058:179:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1933:122:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1432:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3389:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3198:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;590:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2126:235:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;320:36:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1330:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1864:205:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:11;;;;;;;;;;;;;:::i;:::-;;3710:309:3;;;;;;;;;;;;;:::i;:::-;;2177:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1814:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4025:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5597:724;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2061:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;778:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1029:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3296:87:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2585:102:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;669:50:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4857:734;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4219:153:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2635:263:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1699:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5303:320:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2753:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;724:49:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3496:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4272:579;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4438:162:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1562:131:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1911:198:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3097:95:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2904:187;2970:7;3010:1;2993:19;;:5;:19;;;;2985:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;3061:17;:24;3079:5;3061:24;;;;;;;;;;;;;;;;3054:31;;2904:187;;;:::o;361:40::-;;;;:::o;1505:300:6:-;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;2423:98::-;2477:13;2509:5;2502:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2423:98;:::o;3935:217::-;4011:7;4038:16;4046:7;4038;:16::i;:::-;4030:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4121:15;:24;4137:7;4121:24;;;;;;;;;;;;;;;;;;;;;4114:31;;3935:217;;;:::o;3473:401::-;3553:13;3569:23;3584:7;3569:14;:23::i;:::-;3553:39;;3616:5;3610:11;;:2;:11;;;;3602:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3707:5;3691:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3716:37;3733:5;3740:12;:10;:12::i;:::-;3716:16;:37::i;:::-;3691:62;3670:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3846:21;3855:2;3859:7;3846:8;:21::i;:::-;3543:331;3473:401;;:::o;557:28:3:-;;;;;;;;;;;;;:::o;4662:330:6:-;4851:41;4870:12;:10;:12::i;:::-;4884:7;4851:18;:41::i;:::-;4843:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4957:28;4967:4;4973:2;4977:7;4957:9;:28::i;:::-;4662:330;;;:::o;2522:107:3:-;2587:4;2607:10;:16;2618:4;2607:16;;;;;;;;;;;;;;;;;;;;;;;;;2600:23;;2522:107;;;:::o;632:32::-;;;;:::o;6327:134::-;1299:10;1288:21;;:7;:5;:7::i;:::-;:21;;;1280:30;;;;;;6378:12:::1;6393:21;6378:36;;6429:7;:5;:7::i;:::-;6421:25;;:34;6447:7;6421:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;6371:90;6327:134::o:0;5058:179:6:-;5191:39;5208:4;5214:2;5218:7;5191:39;;;;;;;;;;;;:16;:39::i;:::-;5058:179;;;:::o;1933:122:3:-;1299:10;1288:21;;:7;:5;:7::i;:::-;:21;;;1280:30;;;;;;2033:16:::1;2015:15;;:34;;;;;;;;;;;;;;;;;;1933:122:::0;:::o;1432:124::-;1299:10;1288:21;;:7;:5;:7::i;:::-;:21;;;1280:30;;;;;;1544:6:::1;1510:31;:40;;;;1432:124:::0;:::o;3389:101::-;1299:10;1288:21;;:7;:5;:7::i;:::-;:21;;;1280:30;;;;;;3477:7:::1;3461:13;:23;;;;;;;;;;;;:::i;:::-;;3389:101:::0;:::o;3198:92::-;1299:10;1288:21;;:7;:5;:7::i;:::-;:21;;;1280:30;;;;;;3281:3:::1;3263:15;:21;;;;3198:92:::0;:::o;590:35::-;;;;;;;;;;;;;:::o;2126:235:6:-;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;320:36:3:-;;;;:::o;1330:96::-;1375:7;1398:22;:12;:20;:22::i;:::-;1391:29;;1330:96;:::o;1864:205:6:-;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;3710:309:3:-;1299:10;1288:21;;:7;:5;:7::i;:::-;:21;;;1280:30;;;;;;3786:15:::1;;3769:13;;:32;;3761:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;3840:9;3858:156;3874:14;;3870:1;:18;3858:156;;;3904:24;:12;:22;:24::i;:::-;3937:45;3947:10;3959:22;:12;:20;:22::i;:::-;3937:9;:45::i;:::-;3991:13;;:15;;;;;;;;;:::i;:::-;;;;;;3890:3;;;;;:::i;:::-;;;;3858:156;;;3754:265;3710:309::o:0;2177:339::-;1299:10;1288:21;;:7;:5;:7::i;:::-;:21;;;1280:30;;;;;;2267:9:::1;2262:249;2286:9;;:16;;2282:1;:20;2262:249;;;2350:1;2326:26;;:9;;2336:1;2326:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;2318:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2417:4;2390:10;:24;2401:9;;2411:1;2401:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2390:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;2464:1;2430:17;:31;2448:9;;2458:1;2448:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2430:31;;;;;;;;;;;;;;;;:35;:73;;2502:1;2430:73;;;2468:17;:31;2486:9;;2496:1;2486:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2468:31;;;;;;;;;;;;;;;;2430:73;;2304:3;;;;;:::i;:::-;;;;2262:249;;;;2177:339:::0;;:::o;1814:113::-;1299:10;1288:21;;:7;:5;:7::i;:::-;:21;;;1280:30;;;;;;1908:13:::1;1895:10;:26;;;;1814:113:::0;:::o;4025:241::-;1299:10;1288:21;;:7;:5;:7::i;:::-;:21;;;1280:30;;;;;;4130:9:::1;4125:136;4149:6;4145:1;:10;4125:136;;;4171:24;:12;:22;:24::i;:::-;4204:49;4214:14;4230:22;:12;:20;:22::i;:::-;4204:9;:49::i;:::-;4157:3;;;;;:::i;:::-;;;;4125:136;;;;4025:241:::0;;:::o;5597:724::-;1197:10;;1171:22;:12;:20;:22::i;:::-;:36;;1163:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;5667:17:::1;5687:22;:12;:20;:22::i;:::-;5667:42;;5726:15;;;;;;;;;;;5718:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;5785:10;:22;5796:10;5785:22;;;;;;;;;;;;;;;;;;;;;;;;;5777:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;5868:10;;5856:9;:22;5848:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;5935:16;;5925:6;:26;;5917:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;6045:16;;6035:6;6003:17;:29;6021:10;6003:29;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;:58;;5995:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;6137:6;6122:12;;:21;;;;:::i;:::-;6109:9;:34;;6101:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;6189:9;6184:132;6208:6;6204:1;:10;6184:132;;;6230:24;:12;:22;:24::i;:::-;6263:45;6273:10;6285:22;:12;:20;:22::i;:::-;6263:9;:45::i;:::-;6216:3;;;;;:::i;:::-;;;;6184:132;;;;5660:661;5597:724:::0;:::o;2061:110::-;1299:10;1288:21;;:7;:5;:7::i;:::-;:21;;;1280:30;;;;;;2158:7:::1;2139:16;:26;;;;2061:110:::0;:::o;778:35::-;;;;:::o;1029:85:11:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;3296:87:3:-;1299:10;1288:21;;:7;:5;:7::i;:::-;:21;;;1280:30;;;;;;3371:6:::1;3359:9;:18;;;;3296:87:::0;:::o;2585:102:6:-;2641:13;2673:7;2666:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2585:102;:::o;669:50:3:-;;;;:::o;4857:734::-;1197:10;;1171:22;:12;:20;:22::i;:::-;:36;;1163:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;4920:17:::1;4940:22;:12;:20;:22::i;:::-;4920:42;;4989:7;:5;:7::i;:::-;4975:21;;:10;:21;;;4971:203;;5015:8;;;;;;;;;;;5007:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;5108:29;;5098:6;5074:21;5084:10;5074:9;:21::i;:::-;:30;;;;:::i;:::-;:63;;5066:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;4971:203;5214:10;;5204:6;5192:9;:18;;;;:::i;:::-;:32;;5184:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;5284:31;;5274:6;:41;;5258:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;5405:6;5393:9;;:18;;;;:::i;:::-;5380:9;:31;;5372:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5459:9;5454:132;5478:6;5474:1;:10;5454:132;;;5500:24;:12;:22;:24::i;:::-;5533:45;5543:10;5555:22;:12;:20;:22::i;:::-;5533:9;:45::i;:::-;5486:3;;;;;:::i;:::-;;;;5454:132;;;;4913:678;4857:734:::0;:::o;4219:153:6:-;4313:52;4332:12;:10;:12::i;:::-;4346:8;4356;4313:18;:52::i;:::-;4219:153;;:::o;2635:263:3:-;1299:10;1288:21;;:7;:5;:7::i;:::-;:21;;;1280:30;;;;;;2730:9:::1;2725:168;2749:9;;:16;;2745:1;:20;2725:168;;;2813:1;2789:26;;:9;;2799:1;2789:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;2781:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2880:5;2853:10;:24;2864:9;;2874:1;2864:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2853:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;2767:3;;;;;:::i;:::-;;;;2725:168;;;;2635:263:::0;;:::o;1699:109::-;1299:10;1288:21;;:7;:5;:7::i;:::-;:21;;;1280:30;;;;;;1768:3:::1;1757:8;;:14;;;;;;;;;;;;;;;;;;1783:19;1798:3;1783:19;;;;;;:::i;:::-;;;;;;;;1699:109:::0;:::o;5303:320:6:-;5472:41;5491:12;:10;:12::i;:::-;5505:7;5472:18;:41::i;:::-;5464:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5577:39;5591:4;5597:2;5601:7;5610:5;5577:13;:39::i;:::-;5303:320;;;;:::o;2753:329::-;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;724:49:3:-;;;;:::o;3496:95::-;3548:7;3571:14;;3564:21;;3496:95;:::o;4272:579::-;1299:10;1288:21;;:7;:5;:7::i;:::-;:21;;;1280:30;;;;;;4390:14:::1;4407:22;:12;:20;:22::i;:::-;4390:39;;4465:10;;4455:6;4446;:15;;;;:::i;:::-;:29;;4438:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;4527:10;;4517:6;:20;;4509:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;4575:9;4570:276;4594:9;;:16;;4590:1;:20;4570:276;;;4658:1;4634:26;;:9;;4644:1;4634:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;4626:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4704:9;4700:139;4723:6;4719:1;:10;4700:139;;;4747:24;:12;:22;:24::i;:::-;4782:47;4792:9;;4802:1;4792:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;4806:22;:12;:20;:22::i;:::-;4782:9;:47::i;:::-;4731:3;;;;;:::i;:::-;;;;4700:139;;;;4612:3;;;;;:::i;:::-;;;;4570:276;;;;4383:468;4272:579:::0;;;:::o;4438:162:6:-;4535:4;4558:18;:25;4577:5;4558:25;;;;;;;;;;;;;;;:35;4584:8;4558:35;;;;;;;;;;;;;;;;;;;;;;;;;4551:42;;4438:162;;;;:::o;1562:131:3:-;1299:10;1288:21;;:7;:5;:7::i;:::-;:21;;;1280:30;;;;;;1681:6:::1;1649:29;:38;;;;1562:131:::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;3097:95:3:-;1299:10;1288:21;;:7;:5;:7::i;:::-;:21;;;1280:30;;;;;;3183:3:::1;3166:14;:20;;;;3097:95:::0;:::o;829:155:5:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;7095:125:6:-;7160:4;7211:1;7183:30;;:7;:16;7191:7;7183:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7176:37;;7095:125;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;11104:171:6:-;11205:2;11178:15;:24;11194:7;11178:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11260:7;11256:2;11222:46;;11231:23;11246:7;11231:14;:23::i;:::-;11222:46;;;;;;;;;;;;11104:171;;:::o;7378:344::-;7471:4;7495:16;7503:7;7495;:16::i;:::-;7487:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7570:13;7586:23;7601:7;7586:14;:23::i;:::-;7570:39;;7638:5;7627:16;;:7;:16;;;:51;;;;7671:7;7647:31;;:20;7659:7;7647:11;:20::i;:::-;:31;;;7627:51;:87;;;;7682:32;7699:5;7706:7;7682:16;:32::i;:::-;7627:87;7619:96;;;7378:344;;;;:::o;10388:605::-;10542:4;10515:31;;:23;10530:7;10515:14;:23::i;:::-;:31;;;10507:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10620:1;10606:16;;:2;:16;;;;10598:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10674:39;10695:4;10701:2;10705:7;10674:20;:39::i;:::-;10775:29;10792:1;10796:7;10775:8;:29::i;:::-;10834:1;10815:9;:15;10825:4;10815:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10862:1;10845:9;:13;10855:2;10845:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10892:2;10873:7;:16;10881:7;10873:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10929:7;10925:2;10910:27;;10919:4;10910:27;;;;;;;;;;;;10948:38;10968:4;10974:2;10978:7;10948:19;:38::i;:::-;10388:605;;;:::o;827:112:2:-;892:7;918;:14;;;911:21;;827:112;;;:::o;2263:187:11:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;945:123:2:-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;8052:108:6:-;8127:26;8137:2;8141:7;8127:26;;;;;;;;;;;;:9;:26::i;:::-;8052:108;;:::o;11410:307::-;11560:8;11551:17;;:5;:17;;;;11543:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11646:8;11608:18;:25;11627:5;11608:25;;;;;;;;;;;;;;;:35;11634:8;11608:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11691:8;11669:41;;11684:5;11669:41;;;11701:8;11669:41;;;;;;:::i;:::-;;;;;;;;11410:307;;;:::o;6485:::-;6636:28;6646:4;6652:2;6656:7;6636:9;:28::i;:::-;6682:48;6705:4;6711:2;6715:7;6724:5;6682:22;:48::i;:::-;6674:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6485:307;;;;:::o;3597:108:3:-;3657:13;3686;3679:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3597:108;:::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;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;13604:122:6:-;;;;:::o;14098:121::-;;;;:::o;8381:311::-;8506:18;8512:2;8516:7;8506:5;:18::i;:::-;8555:54;8586:1;8590:2;8594:7;8603:5;8555:22;:54::i;:::-;8534:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8381:311;;;:::o;12270:778::-;12420:4;12440:15;:2;:13;;;:15::i;:::-;12436:606;;;12491:2;12475:36;;;12512:12;:10;:12::i;:::-;12526:4;12532:7;12541:5;12475:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12471:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12731:1;12714:6;:13;:18;12710:266;;;12756:60;;;;;;;;;;:::i;:::-;;;;;;;;12710:266;12928:6;12922:13;12913:6;12909:2;12905:15;12898:38;12471:519;12607:41;;;12597:51;;;:6;:51;;;;12590:58;;;;;12436:606;13027:4;13020:11;;12270:778;;;;;;;:::o;9014:427::-;9107:1;9093:16;;:2;:16;;;;9085:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9165:16;9173:7;9165;:16::i;:::-;9164:17;9156:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9225:45;9254:1;9258:2;9262:7;9225:20;:45::i;:::-;9298:1;9281:9;:13;9291:2;9281:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9328:2;9309:7;:16;9317:7;9309:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9371:7;9367:2;9346:33;;9363:1;9346:33;;;;;;;;;;;;9390:44;9418:1;9422:2;9426:7;9390:19;:44::i;:::-;9014: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:75:13:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:149::-;1647:7;1687:66;1680:5;1676:78;1665:89;;1611:149;;;:::o;1766:120::-;1838:23;1855:5;1838:23;:::i;:::-;1831:5;1828:34;1818:62;;1876:1;1873;1866:12;1818:62;1766:120;:::o;1892:137::-;1937:5;1975:6;1962:20;1953:29;;1991:32;2017:5;1991:32;:::i;:::-;1892:137;;;;:::o;2035:327::-;2093:6;2142:2;2130:9;2121:7;2117:23;2113:32;2110:119;;;2148:79;;:::i;:::-;2110:119;2268:1;2293:52;2337:7;2328:6;2317:9;2313:22;2293:52;:::i;:::-;2283:62;;2239:116;2035:327;;;;:::o;2368:90::-;2402:7;2445:5;2438:13;2431:21;2420:32;;2368:90;;;:::o;2464:109::-;2545:21;2560:5;2545:21;:::i;:::-;2540:3;2533:34;2464:109;;:::o;2579:210::-;2666:4;2704:2;2693:9;2689:18;2681:26;;2717:65;2779:1;2768:9;2764:17;2755:6;2717:65;:::i;:::-;2579:210;;;;:::o;2795:99::-;2847:6;2881:5;2875:12;2865:22;;2795:99;;;:::o;2900:169::-;2984:11;3018:6;3013:3;3006:19;3058:4;3053:3;3049:14;3034:29;;2900:169;;;;:::o;3075:307::-;3143:1;3153:113;3167:6;3164:1;3161:13;3153:113;;;3252:1;3247:3;3243:11;3237:18;3233:1;3228:3;3224:11;3217:39;3189:2;3186:1;3182:10;3177:15;;3153:113;;;3284:6;3281:1;3278:13;3275:101;;;3364:1;3355:6;3350:3;3346:16;3339:27;3275:101;3124:258;3075:307;;;:::o;3388:102::-;3429:6;3480:2;3476:7;3471:2;3464:5;3460:14;3456:28;3446:38;;3388:102;;;:::o;3496:364::-;3584:3;3612:39;3645:5;3612:39;:::i;:::-;3667:71;3731:6;3726:3;3667:71;:::i;:::-;3660:78;;3747:52;3792:6;3787:3;3780:4;3773:5;3769:16;3747:52;:::i;:::-;3824:29;3846:6;3824:29;:::i;:::-;3819:3;3815:39;3808:46;;3588:272;3496:364;;;;:::o;3866:313::-;3979:4;4017:2;4006:9;4002:18;3994:26;;4066:9;4060:4;4056:20;4052:1;4041:9;4037:17;4030:47;4094:78;4167:4;4158:6;4094:78;:::i;:::-;4086:86;;3866:313;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:329::-;4517:6;4566:2;4554:9;4545:7;4541:23;4537:32;4534:119;;;4572:79;;:::i;:::-;4534:119;4692:1;4717:53;4762:7;4753:6;4742:9;4738:22;4717:53;:::i;:::-;4707:63;;4663:117;4458:329;;;;:::o;4793:118::-;4880:24;4898:5;4880:24;:::i;:::-;4875:3;4868:37;4793:118;;:::o;4917:222::-;5010:4;5048:2;5037:9;5033:18;5025:26;;5061:71;5129:1;5118:9;5114:17;5105:6;5061:71;:::i;:::-;4917:222;;;;:::o;5145:474::-;5213:6;5221;5270:2;5258:9;5249:7;5245:23;5241:32;5238:119;;;5276:79;;:::i;:::-;5238:119;5396:1;5421:53;5466:7;5457:6;5446:9;5442:22;5421:53;:::i;:::-;5411:63;;5367:117;5523:2;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5494:118;5145:474;;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:116::-;6320:21;6335:5;6320:21;:::i;:::-;6313:5;6310:32;6300:60;;6356:1;6353;6346:12;6300:60;6250:116;:::o;6372:133::-;6415:5;6453:6;6440:20;6431:29;;6469:30;6493:5;6469:30;:::i;:::-;6372:133;;;;:::o;6511:323::-;6567:6;6616:2;6604:9;6595:7;6591:23;6587:32;6584:119;;;6622:79;;:::i;:::-;6584:119;6742:1;6767:50;6809:7;6800:6;6789:9;6785:22;6767:50;:::i;:::-;6757:60;;6713:114;6511:323;;;;:::o;6840:117::-;6949:1;6946;6939:12;6963:117;7072:1;7069;7062:12;7086:180;7134:77;7131:1;7124:88;7231:4;7228:1;7221:15;7255:4;7252:1;7245:15;7272:281;7355:27;7377:4;7355:27;:::i;:::-;7347:6;7343:40;7485:6;7473:10;7470:22;7449:18;7437:10;7434:34;7431:62;7428:88;;;7496:18;;:::i;:::-;7428:88;7536:10;7532:2;7525:22;7315:238;7272:281;;:::o;7559:129::-;7593:6;7620:20;;:::i;:::-;7610:30;;7649:33;7677:4;7669:6;7649:33;:::i;:::-;7559:129;;;:::o;7694:308::-;7756:4;7846:18;7838:6;7835:30;7832:56;;;7868:18;;:::i;:::-;7832:56;7906:29;7928:6;7906:29;:::i;:::-;7898:37;;7990:4;7984;7980:15;7972:23;;7694:308;;;:::o;8008:154::-;8092:6;8087:3;8082;8069:30;8154:1;8145:6;8140:3;8136:16;8129:27;8008:154;;;:::o;8168:412::-;8246:5;8271:66;8287:49;8329:6;8287:49;:::i;:::-;8271:66;:::i;:::-;8262:75;;8360:6;8353:5;8346:21;8398:4;8391:5;8387:16;8436:3;8427:6;8422:3;8418:16;8415:25;8412:112;;;8443:79;;:::i;:::-;8412:112;8533:41;8567:6;8562:3;8557;8533:41;:::i;:::-;8252:328;8168:412;;;;;:::o;8600:340::-;8656:5;8705:3;8698:4;8690:6;8686:17;8682:27;8672:122;;8713:79;;:::i;:::-;8672:122;8830:6;8817:20;8855:79;8930:3;8922:6;8915:4;8907:6;8903:17;8855:79;:::i;:::-;8846:88;;8662:278;8600:340;;;;:::o;8946:509::-;9015:6;9064:2;9052:9;9043:7;9039:23;9035:32;9032:119;;;9070:79;;:::i;:::-;9032:119;9218:1;9207:9;9203:17;9190:31;9248:18;9240:6;9237:30;9234:117;;;9270:79;;:::i;:::-;9234:117;9375:63;9430:7;9421:6;9410:9;9406:22;9375:63;:::i;:::-;9365:73;;9161:287;8946:509;;;;:::o;9461:117::-;9570:1;9567;9560:12;9584:117;9693:1;9690;9683:12;9724:568;9797:8;9807:6;9857:3;9850:4;9842:6;9838:17;9834:27;9824:122;;9865:79;;:::i;:::-;9824:122;9978:6;9965:20;9955:30;;10008:18;10000:6;9997:30;9994:117;;;10030:79;;:::i;:::-;9994:117;10144:4;10136:6;10132:17;10120:29;;10198:3;10190:4;10182:6;10178:17;10168:8;10164:32;10161:41;10158:128;;;10205:79;;:::i;:::-;10158:128;9724:568;;;;;:::o;10298:559::-;10384:6;10392;10441:2;10429:9;10420:7;10416:23;10412:32;10409:119;;;10447:79;;:::i;:::-;10409:119;10595:1;10584:9;10580:17;10567:31;10625:18;10617:6;10614:30;10611:117;;;10647:79;;:::i;:::-;10611:117;10760:80;10832:7;10823:6;10812:9;10808:22;10760:80;:::i;:::-;10742:98;;;;10538:312;10298:559;;;;;:::o;10863:468::-;10928:6;10936;10985:2;10973:9;10964:7;10960:23;10956:32;10953:119;;;10991:79;;:::i;:::-;10953:119;11111:1;11136:53;11181:7;11172:6;11161:9;11157:22;11136:53;:::i;:::-;11126:63;;11082:117;11238:2;11264:50;11306:7;11297:6;11286:9;11282:22;11264:50;:::i;:::-;11254:60;;11209:115;10863:468;;;;;:::o;11337:307::-;11398:4;11488:18;11480:6;11477:30;11474:56;;;11510:18;;:::i;:::-;11474:56;11548:29;11570:6;11548:29;:::i;:::-;11540:37;;11632:4;11626;11622:15;11614:23;;11337:307;;;:::o;11650:410::-;11727:5;11752:65;11768:48;11809:6;11768:48;:::i;:::-;11752:65;:::i;:::-;11743:74;;11840:6;11833:5;11826:21;11878:4;11871:5;11867:16;11916:3;11907:6;11902:3;11898:16;11895:25;11892:112;;;11923:79;;:::i;:::-;11892:112;12013:41;12047:6;12042:3;12037;12013:41;:::i;:::-;11733:327;11650:410;;;;;:::o;12079:338::-;12134:5;12183:3;12176:4;12168:6;12164:17;12160:27;12150:122;;12191:79;;:::i;:::-;12150:122;12308:6;12295:20;12333:78;12407:3;12399:6;12392:4;12384:6;12380:17;12333:78;:::i;:::-;12324:87;;12140:277;12079:338;;;;:::o;12423:943::-;12518:6;12526;12534;12542;12591:3;12579:9;12570:7;12566:23;12562:33;12559:120;;;12598:79;;:::i;:::-;12559:120;12718:1;12743:53;12788:7;12779:6;12768:9;12764:22;12743:53;:::i;:::-;12733:63;;12689:117;12845:2;12871:53;12916:7;12907:6;12896:9;12892:22;12871:53;:::i;:::-;12861:63;;12816:118;12973:2;12999:53;13044:7;13035:6;13024:9;13020:22;12999:53;:::i;:::-;12989:63;;12944:118;13129:2;13118:9;13114:18;13101:32;13160:18;13152:6;13149:30;13146:117;;;13182:79;;:::i;:::-;13146:117;13287:62;13341:7;13332:6;13321:9;13317:22;13287:62;:::i;:::-;13277:72;;13072:287;12423:943;;;;;;;:::o;13372:704::-;13467:6;13475;13483;13532:2;13520:9;13511:7;13507:23;13503:32;13500:119;;;13538:79;;:::i;:::-;13500:119;13658:1;13683:53;13728:7;13719:6;13708:9;13704:22;13683:53;:::i;:::-;13673:63;;13629:117;13813:2;13802:9;13798:18;13785:32;13844:18;13836:6;13833:30;13830:117;;;13866:79;;:::i;:::-;13830:117;13979:80;14051:7;14042:6;14031:9;14027:22;13979:80;:::i;:::-;13961:98;;;;13756:313;13372:704;;;;;:::o;14082:474::-;14150:6;14158;14207:2;14195:9;14186:7;14182:23;14178:32;14175:119;;;14213:79;;:::i;:::-;14175:119;14333:1;14358:53;14403:7;14394:6;14383:9;14379:22;14358:53;:::i;:::-;14348:63;;14304:117;14460:2;14486:53;14531:7;14522:6;14511:9;14507:22;14486:53;:::i;:::-;14476:63;;14431:118;14082:474;;;;;:::o;14562:180::-;14702:32;14698:1;14690:6;14686:14;14679:56;14562:180;:::o;14748:366::-;14890:3;14911:67;14975:2;14970:3;14911:67;:::i;:::-;14904:74;;14987:93;15076:3;14987:93;:::i;:::-;15105:2;15100:3;15096:12;15089:19;;14748:366;;;:::o;15120:419::-;15286:4;15324:2;15313:9;15309:18;15301:26;;15373:9;15367:4;15363:20;15359:1;15348:9;15344:17;15337:47;15401:131;15527:4;15401:131;:::i;:::-;15393:139;;15120:419;;;:::o;15545:180::-;15593:77;15590:1;15583:88;15690:4;15687:1;15680:15;15714:4;15711:1;15704:15;15731:320;15775:6;15812:1;15806:4;15802:12;15792:22;;15859:1;15853:4;15849:12;15880:18;15870:81;;15936:4;15928:6;15924:17;15914:27;;15870:81;15998:2;15990:6;15987:14;15967:18;15964:38;15961:84;;;16017:18;;:::i;:::-;15961:84;15782:269;15731:320;;;:::o;16057:231::-;16197:34;16193:1;16185:6;16181:14;16174:58;16266:14;16261:2;16253:6;16249:15;16242:39;16057:231;:::o;16294:366::-;16436:3;16457:67;16521:2;16516:3;16457:67;:::i;:::-;16450:74;;16533:93;16622:3;16533:93;:::i;:::-;16651:2;16646:3;16642:12;16635:19;;16294:366;;;:::o;16666:419::-;16832:4;16870:2;16859:9;16855:18;16847:26;;16919:9;16913:4;16909:20;16905:1;16894:9;16890:17;16883:47;16947:131;17073:4;16947:131;:::i;:::-;16939:139;;16666:419;;;:::o;17091:220::-;17231:34;17227:1;17219:6;17215:14;17208:58;17300:3;17295:2;17287:6;17283:15;17276:28;17091:220;:::o;17317:366::-;17459:3;17480:67;17544:2;17539:3;17480:67;:::i;:::-;17473:74;;17556:93;17645:3;17556:93;:::i;:::-;17674:2;17669:3;17665:12;17658:19;;17317:366;;;:::o;17689:419::-;17855:4;17893:2;17882:9;17878:18;17870:26;;17942:9;17936:4;17932:20;17928:1;17917:9;17913:17;17906:47;17970:131;18096:4;17970:131;:::i;:::-;17962:139;;17689:419;;;:::o;18114:243::-;18254:34;18250:1;18242:6;18238:14;18231:58;18323:26;18318:2;18310:6;18306:15;18299:51;18114:243;:::o;18363:366::-;18505:3;18526:67;18590:2;18585:3;18526:67;:::i;:::-;18519:74;;18602:93;18691:3;18602:93;:::i;:::-;18720:2;18715:3;18711:12;18704:19;;18363:366;;;:::o;18735:419::-;18901:4;18939:2;18928:9;18924:18;18916:26;;18988:9;18982:4;18978:20;18974:1;18963:9;18959:17;18952:47;19016:131;19142:4;19016:131;:::i;:::-;19008:139;;18735:419;;;:::o;19160:236::-;19300:34;19296:1;19288:6;19284:14;19277:58;19369:19;19364:2;19356:6;19352:15;19345:44;19160:236;:::o;19402:366::-;19544:3;19565:67;19629:2;19624:3;19565:67;:::i;:::-;19558:74;;19641:93;19730:3;19641:93;:::i;:::-;19759:2;19754:3;19750:12;19743:19;;19402:366;;;:::o;19774:419::-;19940:4;19978:2;19967:9;19963:18;19955:26;;20027:9;20021:4;20017:20;20013:1;20002:9;19998:17;19991:47;20055:131;20181:4;20055:131;:::i;:::-;20047:139;;19774:419;;;:::o;20199:228::-;20339:34;20335:1;20327:6;20323:14;20316:58;20408:11;20403:2;20395:6;20391:15;20384:36;20199:228;:::o;20433:366::-;20575:3;20596:67;20660:2;20655:3;20596:67;:::i;:::-;20589:74;;20672:93;20761:3;20672:93;:::i;:::-;20790:2;20785:3;20781:12;20774:19;;20433:366;;;:::o;20805:419::-;20971:4;21009:2;20998:9;20994:18;20986:26;;21058:9;21052:4;21048:20;21044:1;21033:9;21029:17;21022:47;21086:131;21212:4;21086:131;:::i;:::-;21078:139;;20805:419;;;:::o;21230:229::-;21370:34;21366:1;21358:6;21354:14;21347:58;21439:12;21434:2;21426:6;21422:15;21415:37;21230:229;:::o;21465:366::-;21607:3;21628:67;21692:2;21687:3;21628:67;:::i;:::-;21621:74;;21704:93;21793:3;21704:93;:::i;:::-;21822:2;21817:3;21813:12;21806:19;;21465:366;;;:::o;21837:419::-;22003:4;22041:2;22030:9;22026:18;22018:26;;22090:9;22084:4;22080:20;22076:1;22065:9;22061:17;22054:47;22118:131;22244:4;22118:131;:::i;:::-;22110:139;;21837:419;;;:::o;22262:182::-;22402:34;22398:1;22390:6;22386:14;22379:58;22262:182;:::o;22450:366::-;22592:3;22613:67;22677:2;22672:3;22613:67;:::i;:::-;22606:74;;22689:93;22778:3;22689:93;:::i;:::-;22807:2;22802:3;22798:12;22791:19;;22450:366;;;:::o;22822:419::-;22988:4;23026:2;23015:9;23011:18;23003:26;;23075:9;23069:4;23065:20;23061:1;23050:9;23046:17;23039:47;23103:131;23229:4;23103:131;:::i;:::-;23095:139;;22822:419;;;:::o;23247:177::-;23387:29;23383:1;23375:6;23371:14;23364:53;23247:177;:::o;23430:366::-;23572:3;23593:67;23657:2;23652:3;23593:67;:::i;:::-;23586:74;;23669:93;23758:3;23669:93;:::i;:::-;23787:2;23782:3;23778:12;23771:19;;23430:366;;;:::o;23802:419::-;23968:4;24006:2;23995:9;23991:18;23983:26;;24055:9;24049:4;24045:20;24041:1;24030:9;24026:17;24019:47;24083:131;24209:4;24083:131;:::i;:::-;24075:139;;23802:419;;;:::o;24227:180::-;24275:77;24272:1;24265:88;24372:4;24369:1;24362:15;24396:4;24393:1;24386:15;24413:233;24452:3;24475:24;24493:5;24475:24;:::i;:::-;24466:33;;24521:66;24514:5;24511:77;24508:103;;;24591:18;;:::i;:::-;24508:103;24638:1;24631:5;24627:13;24620:20;;24413:233;;;:::o;24652:180::-;24700:77;24697:1;24690:88;24797:4;24794:1;24787:15;24821:4;24818:1;24811:15;24838:174;24978:26;24974:1;24966:6;24962:14;24955:50;24838:174;:::o;25018:366::-;25160:3;25181:67;25245:2;25240:3;25181:67;:::i;:::-;25174:74;;25257:93;25346:3;25257:93;:::i;:::-;25375:2;25370:3;25366:12;25359:19;;25018:366;;;:::o;25390:419::-;25556:4;25594:2;25583:9;25579:18;25571:26;;25643:9;25637:4;25633:20;25629:1;25618:9;25614:17;25607:47;25671:131;25797:4;25671:131;:::i;:::-;25663:139;;25390:419;;;:::o;25815:165::-;25955:17;25951:1;25943:6;25939:14;25932:41;25815:165;:::o;25986:366::-;26128:3;26149:67;26213:2;26208:3;26149:67;:::i;:::-;26142:74;;26225:93;26314:3;26225:93;:::i;:::-;26343:2;26338:3;26334:12;26327:19;;25986:366;;;:::o;26358:419::-;26524:4;26562:2;26551:9;26547:18;26539:26;;26611:9;26605:4;26601:20;26597:1;26586:9;26582:17;26575:47;26639:131;26765:4;26639:131;:::i;:::-;26631:139;;26358:419;;;:::o;26783:174::-;26923:26;26919:1;26911:6;26907:14;26900:50;26783:174;:::o;26963:366::-;27105:3;27126:67;27190:2;27185:3;27126:67;:::i;:::-;27119:74;;27202:93;27291:3;27202:93;:::i;:::-;27320:2;27315:3;27311:12;27304:19;;26963:366;;;:::o;27335:419::-;27501:4;27539:2;27528:9;27524:18;27516:26;;27588:9;27582:4;27578:20;27574:1;27563:9;27559:17;27552:47;27616:131;27742:4;27616:131;:::i;:::-;27608:139;;27335:419;;;:::o;27760:179::-;27900:31;27896:1;27888:6;27884:14;27877:55;27760:179;:::o;27945:366::-;28087:3;28108:67;28172:2;28167:3;28108:67;:::i;:::-;28101:74;;28184:93;28273:3;28184:93;:::i;:::-;28302:2;28297:3;28293:12;28286:19;;27945:366;;;:::o;28317:419::-;28483:4;28521:2;28510:9;28506:18;28498:26;;28570:9;28564:4;28560:20;28556:1;28545:9;28541:17;28534:47;28598:131;28724:4;28598:131;:::i;:::-;28590:139;;28317:419;;;:::o;28742:177::-;28882:29;28878:1;28870:6;28866:14;28859:53;28742:177;:::o;28925:366::-;29067:3;29088:67;29152:2;29147:3;29088:67;:::i;:::-;29081:74;;29164:93;29253:3;29164:93;:::i;:::-;29282:2;29277:3;29273:12;29266:19;;28925:366;;;:::o;29297:419::-;29463:4;29501:2;29490:9;29486:18;29478:26;;29550:9;29544:4;29540:20;29536:1;29525:9;29521:17;29514:47;29578:131;29704:4;29578:131;:::i;:::-;29570:139;;29297:419;;;:::o;29722:182::-;29862:34;29858:1;29850:6;29846:14;29839:58;29722:182;:::o;29910:366::-;30052:3;30073:67;30137:2;30132:3;30073:67;:::i;:::-;30066:74;;30149:93;30238:3;30149:93;:::i;:::-;30267:2;30262:3;30258:12;30251:19;;29910:366;;;:::o;30282:419::-;30448:4;30486:2;30475:9;30471:18;30463:26;;30535:9;30529:4;30525:20;30521:1;30510:9;30506:17;30499:47;30563:131;30689:4;30563:131;:::i;:::-;30555:139;;30282:419;;;:::o;30707:305::-;30747:3;30766:20;30784:1;30766:20;:::i;:::-;30761:25;;30800:20;30818:1;30800:20;:::i;:::-;30795:25;;30954:1;30886:66;30882:74;30879:1;30876:81;30873:107;;;30960:18;;:::i;:::-;30873:107;31004:1;31001;30997:9;30990:16;;30707:305;;;;:::o;31018:178::-;31158:30;31154:1;31146:6;31142:14;31135:54;31018:178;:::o;31202:366::-;31344:3;31365:67;31429:2;31424:3;31365:67;:::i;:::-;31358:74;;31441:93;31530:3;31441:93;:::i;:::-;31559:2;31554:3;31550:12;31543:19;;31202:366;;;:::o;31574:419::-;31740:4;31778:2;31767:9;31763:18;31755:26;;31827:9;31821:4;31817:20;31813:1;31802:9;31798:17;31791:47;31855:131;31981:4;31855:131;:::i;:::-;31847:139;;31574:419;;;:::o;31999:348::-;32039:7;32062:20;32080:1;32062:20;:::i;:::-;32057:25;;32096:20;32114:1;32096:20;:::i;:::-;32091:25;;32284:1;32216:66;32212:74;32209:1;32206:81;32201:1;32194:9;32187:17;32183:105;32180:131;;;32291:18;;:::i;:::-;32180:131;32339:1;32336;32332:9;32321:20;;31999:348;;;;:::o;32353:177::-;32493:29;32489:1;32481:6;32477:14;32470:53;32353:177;:::o;32536:366::-;32678:3;32699:67;32763:2;32758:3;32699:67;:::i;:::-;32692:74;;32775:93;32864:3;32775:93;:::i;:::-;32893:2;32888:3;32884:12;32877:19;;32536:366;;;:::o;32908:419::-;33074:4;33112:2;33101:9;33097:18;33089:26;;33161:9;33155:4;33151:20;33147:1;33136:9;33132:17;33125:47;33189:131;33315:4;33189:131;:::i;:::-;33181:139;;32908:419;;;:::o;33333:179::-;33473:31;33469:1;33461:6;33457:14;33450:55;33333:179;:::o;33518:366::-;33660:3;33681:67;33745:2;33740:3;33681:67;:::i;:::-;33674:74;;33757:93;33846:3;33757:93;:::i;:::-;33875:2;33870:3;33866:12;33859:19;;33518:366;;;:::o;33890:419::-;34056:4;34094:2;34083:9;34079:18;34071:26;;34143:9;34137:4;34133:20;34129:1;34118:9;34114:17;34107:47;34171:131;34297:4;34171:131;:::i;:::-;34163:139;;33890:419;;;:::o;34315:174::-;34455:26;34451:1;34443:6;34439:14;34432:50;34315:174;:::o;34495:366::-;34637:3;34658:67;34722:2;34717:3;34658:67;:::i;:::-;34651:74;;34734:93;34823:3;34734:93;:::i;:::-;34852:2;34847:3;34843:12;34836:19;;34495:366;;;:::o;34867:419::-;35033:4;35071:2;35060:9;35056:18;35048:26;;35120:9;35114:4;35110:20;35106:1;35095:9;35091:17;35084:47;35148:131;35274:4;35148:131;:::i;:::-;35140:139;;34867:419;;;:::o;35292:172::-;35432:24;35428:1;35420:6;35416:14;35409:48;35292:172;:::o;35470:366::-;35612:3;35633:67;35697:2;35692:3;35633:67;:::i;:::-;35626:74;;35709:93;35798:3;35709:93;:::i;:::-;35827:2;35822:3;35818:12;35811:19;;35470:366;;;:::o;35842:419::-;36008:4;36046:2;36035:9;36031:18;36023:26;;36095:9;36089:4;36085:20;36081:1;36070:9;36066:17;36059:47;36123:131;36249:4;36123:131;:::i;:::-;36115:139;;35842:419;;;:::o;36267:180::-;36407:32;36403:1;36395:6;36391:14;36384:56;36267:180;:::o;36453:366::-;36595:3;36616:67;36680:2;36675:3;36616:67;:::i;:::-;36609:74;;36692:93;36781:3;36692:93;:::i;:::-;36810:2;36805:3;36801:12;36794:19;;36453:366;;;:::o;36825:419::-;36991:4;37029:2;37018:9;37014:18;37006:26;;37078:9;37072:4;37068:20;37064:1;37053:9;37049:17;37042:47;37106:131;37232:4;37106:131;:::i;:::-;37098:139;;36825:419;;;:::o;37250:179::-;37390:31;37386:1;37378:6;37374:14;37367:55;37250:179;:::o;37435:366::-;37577:3;37598:67;37662:2;37657:3;37598:67;:::i;:::-;37591:74;;37674:93;37763:3;37674:93;:::i;:::-;37792:2;37787:3;37783:12;37776:19;;37435:366;;;:::o;37807:419::-;37973:4;38011:2;38000:9;37996:18;37988:26;;38060:9;38054:4;38050:20;38046:1;38035:9;38031:17;38024:47;38088:131;38214:4;38088:131;:::i;:::-;38080:139;;37807:419;;;:::o;38232:234::-;38372:34;38368:1;38360:6;38356:14;38349:58;38441:17;38436:2;38428:6;38424:15;38417:42;38232:234;:::o;38472:366::-;38614:3;38635:67;38699:2;38694:3;38635:67;:::i;:::-;38628:74;;38711:93;38800:3;38711:93;:::i;:::-;38829:2;38824:3;38820:12;38813:19;;38472:366;;;:::o;38844:419::-;39010:4;39048:2;39037:9;39033:18;39025:26;;39097:9;39091:4;39087:20;39083:1;39072:9;39068:17;39061:47;39125:131;39251:4;39125:131;:::i;:::-;39117:139;;38844:419;;;:::o;39269:148::-;39371:11;39408:3;39393:18;;39269:148;;;;:::o;39423:377::-;39529:3;39557:39;39590:5;39557:39;:::i;:::-;39612:89;39694:6;39689:3;39612:89;:::i;:::-;39605:96;;39710:52;39755:6;39750:3;39743:4;39736:5;39732:16;39710:52;:::i;:::-;39787:6;39782:3;39778:16;39771:23;;39533:267;39423:377;;;;:::o;39806:435::-;39986:3;40008:95;40099:3;40090:6;40008:95;:::i;:::-;40001:102;;40120:95;40211:3;40202:6;40120:95;:::i;:::-;40113:102;;40232:3;40225:10;;39806:435;;;;;:::o;40247:169::-;40387:21;40383:1;40375:6;40371:14;40364:45;40247:169;:::o;40422:366::-;40564:3;40585:67;40649:2;40644:3;40585:67;:::i;:::-;40578:74;;40661:93;40750:3;40661:93;:::i;:::-;40779:2;40774:3;40770:12;40763:19;;40422:366;;;:::o;40794:419::-;40960:4;40998:2;40987:9;40983:18;40975:26;;41047:9;41041:4;41037:20;41033:1;41022:9;41018:17;41011:47;41075:131;41201:4;41075:131;:::i;:::-;41067:139;;40794:419;;;:::o;41219:225::-;41359:34;41355:1;41347:6;41343:14;41336:58;41428:8;41423:2;41415:6;41411:15;41404:33;41219:225;:::o;41450:366::-;41592:3;41613:67;41677:2;41672:3;41613:67;:::i;:::-;41606:74;;41689:93;41778:3;41689:93;:::i;:::-;41807:2;41802:3;41798:12;41791:19;;41450:366;;;:::o;41822:419::-;41988:4;42026:2;42015:9;42011:18;42003:26;;42075:9;42069:4;42065:20;42061:1;42050:9;42046:17;42039:47;42103:131;42229:4;42103:131;:::i;:::-;42095:139;;41822:419;;;:::o;42247:231::-;42387:34;42383:1;42375:6;42371:14;42364:58;42456:14;42451:2;42443:6;42439:15;42432:39;42247:231;:::o;42484:366::-;42626:3;42647:67;42711:2;42706:3;42647:67;:::i;:::-;42640:74;;42723:93;42812:3;42723:93;:::i;:::-;42841:2;42836:3;42832:12;42825:19;;42484:366;;;:::o;42856:419::-;43022:4;43060:2;43049:9;43045:18;43037:26;;43109:9;43103:4;43099:20;43095:1;43084:9;43080:17;43073:47;43137:131;43263:4;43137:131;:::i;:::-;43129:139;;42856:419;;;:::o;43281:224::-;43421:34;43417:1;43409:6;43405:14;43398:58;43490:7;43485:2;43477:6;43473:15;43466:32;43281:224;:::o;43511:366::-;43653:3;43674:67;43738:2;43733:3;43674:67;:::i;:::-;43667:74;;43750:93;43839:3;43750:93;:::i;:::-;43868:2;43863:3;43859:12;43852:19;;43511:366;;;:::o;43883:419::-;44049:4;44087:2;44076:9;44072:18;44064:26;;44136:9;44130:4;44126:20;44122:1;44111:9;44107:17;44100:47;44164:131;44290:4;44164:131;:::i;:::-;44156:139;;43883:419;;;:::o;44308:223::-;44448:34;44444:1;44436:6;44432:14;44425:58;44517:6;44512:2;44504:6;44500:15;44493:31;44308:223;:::o;44537:366::-;44679:3;44700:67;44764:2;44759:3;44700:67;:::i;:::-;44693:74;;44776:93;44865:3;44776:93;:::i;:::-;44894:2;44889:3;44885:12;44878:19;;44537:366;;;:::o;44909:419::-;45075:4;45113:2;45102:9;45098:18;45090:26;;45162:9;45156:4;45152:20;45148:1;45137:9;45133:17;45126:47;45190:131;45316:4;45190:131;:::i;:::-;45182:139;;44909:419;;;:::o;45334:191::-;45374:4;45394:20;45412:1;45394:20;:::i;:::-;45389:25;;45428:20;45446:1;45428:20;:::i;:::-;45423:25;;45467:1;45464;45461:8;45458:34;;;45472:18;;:::i;:::-;45458:34;45517:1;45514;45510:9;45502:17;;45334:191;;;;:::o;45531:175::-;45671:27;45667:1;45659:6;45655:14;45648:51;45531:175;:::o;45712:366::-;45854:3;45875:67;45939:2;45934:3;45875:67;:::i;:::-;45868:74;;45951:93;46040:3;45951:93;:::i;:::-;46069:2;46064:3;46060:12;46053:19;;45712:366;;;:::o;46084:419::-;46250:4;46288:2;46277:9;46273:18;46265:26;;46337:9;46331:4;46327:20;46323:1;46312:9;46308:17;46301:47;46365:131;46491:4;46365:131;:::i;:::-;46357:139;;46084:419;;;:::o;46509:237::-;46649:34;46645:1;46637:6;46633:14;46626:58;46718:20;46713:2;46705:6;46701:15;46694:45;46509:237;:::o;46752:366::-;46894:3;46915:67;46979:2;46974:3;46915:67;:::i;:::-;46908:74;;46991:93;47080:3;46991:93;:::i;:::-;47109:2;47104:3;47100:12;47093:19;;46752:366;;;:::o;47124:419::-;47290:4;47328:2;47317:9;47313:18;47305:26;;47377:9;47371:4;47367:20;47363:1;47352:9;47348:17;47341:47;47405:131;47531:4;47405:131;:::i;:::-;47397:139;;47124:419;;;:::o;47549:180::-;47597:77;47594:1;47587:88;47694:4;47691:1;47684:15;47718:4;47715:1;47708:15;47735:185;47775:1;47792:20;47810:1;47792:20;:::i;:::-;47787:25;;47826:20;47844:1;47826:20;:::i;:::-;47821:25;;47865:1;47855:35;;47870:18;;:::i;:::-;47855:35;47912:1;47909;47905:9;47900:14;;47735:185;;;;:::o;47926:176::-;47958:1;47975:20;47993:1;47975:20;:::i;:::-;47970:25;;48009:20;48027:1;48009:20;:::i;:::-;48004:25;;48048:1;48038:35;;48053:18;;:::i;:::-;48038:35;48094:1;48091;48087:9;48082:14;;47926:176;;;;:::o;48108:98::-;48159:6;48193:5;48187:12;48177:22;;48108:98;;;:::o;48212:168::-;48295:11;48329:6;48324:3;48317:19;48369:4;48364:3;48360:14;48345:29;;48212:168;;;;:::o;48386:360::-;48472:3;48500:38;48532:5;48500:38;:::i;:::-;48554:70;48617:6;48612:3;48554:70;:::i;:::-;48547:77;;48633:52;48678:6;48673:3;48666:4;48659:5;48655:16;48633:52;:::i;:::-;48710:29;48732:6;48710:29;:::i;:::-;48705:3;48701:39;48694:46;;48476:270;48386:360;;;;:::o;48752:640::-;48947:4;48985:3;48974:9;48970:19;48962:27;;48999:71;49067:1;49056:9;49052:17;49043:6;48999:71;:::i;:::-;49080:72;49148:2;49137:9;49133:18;49124:6;49080:72;:::i;:::-;49162;49230:2;49219:9;49215:18;49206:6;49162:72;:::i;:::-;49281:9;49275:4;49271:20;49266:2;49255:9;49251:18;49244:48;49309:76;49380:4;49371:6;49309:76;:::i;:::-;49301:84;;48752:640;;;;;;;:::o;49398:141::-;49454:5;49485:6;49479:13;49470:22;;49501:32;49527:5;49501:32;:::i;:::-;49398:141;;;;:::o;49545:349::-;49614:6;49663:2;49651:9;49642:7;49638:23;49634:32;49631:119;;;49669:79;;:::i;:::-;49631:119;49789:1;49814:63;49869:7;49860:6;49849:9;49845:22;49814:63;:::i;:::-;49804:73;;49760:127;49545:349;;;;:::o;49900:182::-;50040:34;50036:1;50028:6;50024:14;50017:58;49900:182;:::o;50088:366::-;50230:3;50251:67;50315:2;50310:3;50251:67;:::i;:::-;50244:74;;50327:93;50416:3;50327:93;:::i;:::-;50445:2;50440:3;50436:12;50429:19;;50088:366;;;:::o;50460:419::-;50626:4;50664:2;50653:9;50649:18;50641:26;;50713:9;50707:4;50703:20;50699:1;50688:9;50684:17;50677:47;50741:131;50867:4;50741:131;:::i;:::-;50733:139;;50460:419;;;:::o;50885:178::-;51025:30;51021:1;51013:6;51009:14;51002:54;50885:178;:::o;51069:366::-;51211:3;51232:67;51296:2;51291:3;51232:67;:::i;:::-;51225:74;;51308:93;51397:3;51308:93;:::i;:::-;51426:2;51421:3;51417:12;51410:19;;51069:366;;;:::o;51441:419::-;51607:4;51645:2;51634:9;51630:18;51622:26;;51694:9;51688:4;51684:20;51680:1;51669:9;51665:17;51658:47;51722:131;51848:4;51722:131;:::i;:::-;51714:139;;51441:419;;;:::o

Swarm Source

ipfs://1732cf5a71c465cca68c1ffeda5440b2fd8e8e5097f06ec897111f9722f09644
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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