ETH Price: $2,500.53 (-0.63%)

Token

CrudeBorne Jelly Babies (CB.JELLY)
 

Overview

Max Total Supply

6,998 CB.JELLY

Holders

1,401

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
j3spa.eth
Balance
5 CB.JELLY
0xaaf1add5b69c28c24652bfd08ffe266550e22065
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:
JellyBabies

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 14 : JellyBabies.sol
// SPDX-License-Identifier: Unlicense
// Creator: CrudeBorne

//  ∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰
//  ∰∰∰∰∰∰∰∰∰∰∰∰∰∰      __爪爪__      ∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰
//  ∰∰∰∰∰∰∰∰∰∰∰∰      爪ρρρρρρρρρρρρ爪      ∰∰∰∰∰∰∰∰∰∰∰∰∰
//  ∰∰∰∰∰∰∰∰∰∰      爪ρρρρρρρρρρρρρρρρρρρρ爪      ∰∰∰∰∰∰∰∰∰∰∰
//  ∰∰∰∰∰∰∰∰Ω      爪ρρρρρρρρρρρρ☤☤ρρρρρρρρρρρρ爪      Ω∰∰∰∰∰∰∰∰∰
//  ∰∰∰∰∰∰∰Ω     爪ρρρρρρρρρρρρρρρ☤☤ρρρρρρρρρρρρρρρ爪     Ω∰∰∰∰∰∰∰∰
//  ∰∰∰∰∰∰Ω     爪ρρρρρρρρρρρρρρρρρ☤☤ρρρρρρρρρρρρρρρρρ爪     Ω∰∰∰∰∰∰∰
//  ∰∰∰∰∰Ω     爪ρρρρρρρρρρρρρρρρρρ☤☤☤☤ρρρρρρρρρρρρρρρρρρ爪     Ω∰∰∰∰∰∰
//  ∰∰∰∰∰     爪ρρρρρρρρρρρρρρρρρρ☤☤☤☤☤☤ρρρρρρρρρρρρρρρρρρ爪     ∰∰∰∰∰∰
//  ∰∰∰∰Ω     爪ρρρρρρρρρρρρρρρρρρ☤☤☤☤☤☤☤☤ρρρρρρρρρρρρρρρρρρ爪     Ω∰∰∰∰∰
//  ∰∰∰∰     爪ρρρρρρρρρρρρρρρρρ☤☤☤☤☤☤☤☤☤☤☤☤ρρρρρρρρρρρρρρρρρ爪     ∰∰∰∰∰
//  ∰∰∰Ω     爪ρρρρρρρρρρρρρρρρ☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤ρρρρρρρρρρρρρρρρ爪     Ω∰∰∰∰
//  ∰∰∰Ω     爪ρρρρρρρρρρρρρ☤☤☤☤☤☤☤☤EGGGGG☤☤☤☤☤☤☤☤ρρρρρρρρρρρρρ爪     Ω∰∰∰∰
//  ∰∰∰Ω     爪ρρρρρρρρρρρρ☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤☤ρρρρρρρρρρρρ爪     Ω∰∰∰∰
//  ∰∰∰Ω     爪ρρρρρρρρρρρρ☤☤☤☤☤☤☤☤☤☤ρ☤☤ρ☤☤☤☤☤☤☤☤☤☤ρρρρρρρρρρρρ爪     Ω∰∰∰∰
//  ∰∰∰∰     爪ρρρρρρρρρρρρρ☤☤☤☤☤☤ρρρ☤☤ρρρ☤☤☤☤☤☤ρρρρρρρρρρρρρ爪     ∰∰∰∰∰
//  ∰∰∰∰Ω     爪ρρρρρρρρρρρρρρρρρρρρρ☤☤ρρρρρρρρρρρρρρρρρρρρρ爪     Ω∰∰∰∰∰
//  ∰∰∰∰∰      爪ρρρρρρρρρρρρρρρρρρ☤☤☤☤ρρρρρρρρρρρρρρρρρρ爪      ∰∰∰∰∰∰
//  ∰∰∰∰∰∰Ω      爪ρρρρρρρρρρρρρ☤☤☤☤☤☤☤☤ρρρρρρρρρρρρρ爪      Ω∰∰∰∰∰∰∰
//  ∰∰∰∰∰∰∰∰Ω       爪ρρρρρρρρρρρρρρρρρρρρρρρρ爪       Ω∰∰∰∰∰∰∰∰∰
//  ∰∰∰∰∰∰∰∰∰∰ΩΩΩ       °°°°爪爪爪爪°°°°        ΩΩΩ∰∰∰∰∰∰∰∰∰∰
//  ∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰∰

pragma solidity ^0.8.9;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "./ERC721.sol";

//        ꃃꆂ꒓ꁒꍟ
//       ________     ________    __        __   _______       _________
//      /⚚⚚⚚⚚⚚⚚⚚⚚\   ||.‾‾‾‾‾\\   ||.       ||  ||.‾‾‾‾\\     |⚚.‾‾‾‾‾‾\\
//     /⚚⚚/‾‾‾‾\⚚⚚\  ||.      \\  ||.       ||  ||.     \\    ||.       ‾
//    /⚚⚚/      ‾‾‾  ||.      //  ||.       ||  |⚚.      \\   ||.
//    |⚚⚚|           ||._____//   ||.       ||  ||.       ||  ||.======|
//    \⚚⚚\      ___  |⚚.‾‾‾‾‾\\    \\.      //  ||.      //   ||.
//     \⚚⚚\____/⚚⚚/  ||.      \\    \\.    //   ||.     //    ||.       _
//      \⚚⚚⚚⚚⚚⚚⚚⚚/   ||.       ||    \⚚.__//    ||.____//     ||.______//
//       ‾‾‾‾‾‾‾‾    ‾‾        ‾‾     ‾‾‾‾‾      ‾‾‾‾‾‾‾       ‾‾‾‾‾‾‾‾‾
//        ꃃꆂ꒓ꁒꍟ

contract JellyBabies is ERC721, Ownable {
    using Strings for uint256;
    string public PROVENANCE;
    bool provenanceSet;

    bool public swimming;

    enum Timeline {
        Yate,
        Yeet,
        Yote
    }

    Timeline public wen = Timeline.Yate;

    mapping(address => uint256) private paymentInfo;
    uint256 totalReceived = 0;
    mapping(address => uint256) amountsWithdrawn;

    modifier onlyPayee() {
        _isPayee();
        _;
    }
    function _isPayee() internal view virtual {
        require(paymentInfo[msg.sender] > 0, "not a royalty payee");
    }

    mapping(address => bool) public authorized;

    mapping(uint256 => uint256) public companionFound;

    CrudeBorneEggs public cbeContract;

    string collectionDescription = "Would you like a jelly baby?";
    string collecImg = "";
    string externalLink = "https://crudeborne.wtf";

    //  ____        ____
    //  |  |        |  |
    //  |54|====----|74|
    //  \  \        /  /
    //   \68\===---/49/
    //    \  \    /  /
    //     \65\=-/64/
    //      \  \/  /
    //       \⇓⇓\ /
    //        \⇓⇓\
    //       / \⇓⇓\
    //      /  /\  \
    //     /6E/-=\42\
    //    /  /    \  \
    //   /69/---===\61\
    //  /  /        \  \
    //  |46|----====|73|
    //  |  |        |  |
    //  |75|====----|65|
    //  \  \        /  /
    //   \6F\===---/64/
    //    \  \    /  /
    //     \59\=-/43/
    //      \  \/  /
    //       \⇑⇑\ /
    //        \⇑⇑\
    //       / \⇑⇑\
    //      /  /\  \
    //     /6F/-=\6E\
    //    /  /    \  \
    //   /64/---===\61\
    //  /  /        \  \
    //  |65|----====|43|
    //  |  |        |  |
    //  ‾‾‾‾        ‾‾‾‾

    constructor(
        address _cbeAddy,
        string memory _name,
        string memory _symbol,
        address[] memory _payees,
        uint128[] memory _basisPoints
    ) ERC721(_name, _symbol) {
        for (uint256 i = 0; i < _payees.length; i++) {
            paymentInfo[_payees[i]] = _basisPoints[i];
        }

        cbeContract = CrudeBorneEggs(_cbeAddy);
    }

    // p̸͓̂ą̵̢̗̘̫̼̯̻̃û̶̦̰̝͉͋̈́ͅs̵͉̒̃̐e̶͓̐̋̂̽̀̂́̕͝.̶̢̼̮͚̪̲͐̿̀̉͐̅̊͌̈̚.̴̯̮͈͋̂͗͒͐͊̌͋.̴̧͕̣͓̗͓͛̔ ̵̡͇̩̟̭̖͔͎͒̊̕͘t̴̫͚͚͚͒̀͒̃̈̈̿̍̽ĥ̸̨͓̠͖͎͙̙̱̙̄i̸̤͖̪̥͓̪̬̰͍͆́̒̊̒̃̏͒̈n̸̼̩̼̖̾͐̂̃̈́̅̈́͊̚͘ķ̸̡̋.̶̳͕̱̫͍̮́͒̉.̷̨̲̝̰̮͖̳̈́̔̄͗͊̈́̀̕.̵̙̗̦͗̄͗͝

    function addAuthorized(address toAuthorize) public onlyOwner {
        authorized[toAuthorize] = true;
    }

    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        require(!provenanceSet);
        PROVENANCE = provenanceHash;
        provenanceSet = true;
    }

    function swimOrSink() external onlyOwner {
        swimming = !swimming;
    }

    // ຟi๖๖lฯ ຟ໐๖๖lฯ
    function setTimeyWimey(Timeline _wen) public onlyOwner {
        require(_wen != Timeline.Yate);
        wen = _wen;
    }

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

    function hazCompanion(uint256 disEgg) public view returns (bool) {
        uint256 eggBlocc = disEgg/250;
        uint256 eggSlot = disEgg - eggBlocc*250;
        return ((companionFound[eggBlocc] >> eggSlot)%2 == 1);
    }

    function dontGoAlone(uint256[] memory eggz) public {
        require(wen == Timeline.Yeet || (authorized[msg.sender] && (wen == Timeline.Yate)), 'w');

        uint256 curBlocc = 0;
        uint256 bloccUpdates = 0;
        uint256 eggBlocc;

        bool companionRequire = true;
        bool ownerRequire = true;

        // ʂơɱɛ ɬɧıŋɠʂ ɧą۷ɛ ƈơɱɛ ɬɧཞơųɠɧ ơųɬ ơʄ ơཞɖɛཞ
        for (uint256 i = 0; i < eggz.length; i++) {
            eggBlocc = eggz[i]/250;
            if (eggBlocc != curBlocc) {
                companionFound[curBlocc] = companionFound[curBlocc] | bloccUpdates;
                curBlocc = eggBlocc;
                bloccUpdates = 0;
            }

            uint256 eggSlot = eggz[i] - curBlocc*250;
            companionRequire = companionRequire && (companionFound[curBlocc] >> eggSlot)%2 == 0;
            ownerRequire = ownerRequire && cbeContract.ownerOf(eggz[i]) == msg.sender;

            bloccUpdates += (1 << eggSlot);
        }
        require(companionRequire, 'c');
        require(ownerRequire, 'o');

        companionFound[curBlocc] = companionFound[curBlocc] | bloccUpdates;

        _safeMint(msg.sender, eggz.length);
    }

    // ρ(௶؆ξ) ∺ 爪(ϒ६∑ナ)/∰(¥Ꭿ₸ໂ) //

    function setCollectionDescription(string memory _collectionDescription) public onlyOwner {
        collectionDescription = _collectionDescription;
    }

    function setCollecImg(string memory _collecImg) public onlyOwner {
        collecImg = _collecImg;
    }

    function setExternalLink(string memory _externalLink) public onlyOwner {
        externalLink = _externalLink;
    }

    // ᄃ8ん10刀4の2

    function contractURI() public view returns (string memory) {
        return string(
            abi.encodePacked(
                "data:application/json;utf8,{\"name\":\"CrudeBorne: Jelly Babies\",",
                "\"description\":\"", collectionDescription, "\",",
                "\"image\":\"", collecImg, "\",",
                "\"external_link\":\"", externalLink, "\",",
                "\"seller_fee_basis_points\":420,\"fee_recipient\":\"",
                uint256(uint160(address(this))).toHexString(), "\"}"
            )
        );
    }

    ///////////////////////
    //        鷹         //
    // ☢☢☢☢☢☢☢☢☢☢☢☢☢☢☢☢ //
    /////////////////////

    receive() external payable {
        totalReceived += msg.value;
    }

    function withdraw() public onlyPayee {
        uint256 totalForPayee = (totalReceived/10000)*paymentInfo[msg.sender];
        uint256 toWithdraw = totalForPayee - amountsWithdrawn[msg.sender];
        amountsWithdrawn[msg.sender] = totalForPayee;
        (bool success, ) = payable(msg.sender).call{value: toWithdraw}("");
        require(success, "Payment failed!");
    }
}

// ⟨ρ|∞⟩

abstract contract CrudeBorneEggs {
    function balanceOf(address owner) public view virtual returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual returns (uint256);
    function ownerOf(uint256 tokenId) public view virtual returns (address);
}

////////////////////////////////////////

File 2 of 14 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 3 of 14 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

File 4 of 14 : ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.3) (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) {
        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.
            /// @solidity memory-safe-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 {
            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 5 of 14 : ERC721.sol
// SPDX-License-Identifier: Unlicense
// Creator: CrudeBorne
pragma solidity ^0.8.9;

import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    uint256 private currentIndex = 0;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Base URI
    string private _baseURI;
    string private _preRevealURI;

    mapping(uint256 => address) private _ownerships;
    mapping(address => uint256) private _balances;

    address public immutable burnAddress = 0x000000000000000000000000000000000000dEaD;
    uint256 private numTokensBurned;

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), "g");
        require(ownerOf(index) != burnAddress, "b");
        return index;
    }

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

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

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

//    function ownershipOf(uint256 tokenId) internal view returns (address) {
//        require(tokenId < currentIndex, "t");
//
////        uint256 lowestTokenToCheck;
////        //        if (tokenId >= maxBatchSize) {
////        //            lowestTokenToCheck = tokenId - maxBatchSize + 1;
////        //        }
////        if (tokenId >= maxOwnerBatchSize) {
////            lowestTokenToCheck = tokenId - maxOwnerBatchSize + 1;
////        }
//
////        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
//        for (uint256 curr = tokenId; curr >= 0; curr--) {
//            address ownership = _ownerships[curr];
//            if (ownership != address(0)) {
//                return ownership;
//            }
//        }
//
//        revert("o");
//    }

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

        require(tokenId < currentIndex, "t");

        for (uint256 curr = tokenId; curr >= 0; curr--) {
            address ownership = _ownerships[curr];
            if (ownership != address(0)) {
                return ownership;
            }
        }

        revert("o");
    }

    /**
     * @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), "z");

        if (bytes(_baseURI).length > 0) {
            return string(abi.encodePacked(_baseURI, "/", tokenId.toString(), ".json"));
        }
        else {
            return _preRevealURI;
        }
    }

    /**
     * @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() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    function preRevealURI() public view virtual returns (string memory) {
        return _preRevealURI;
    }

    function _setPreRevealURI(string memory preRevealURI_) internal virtual {
        _preRevealURI = preRevealURI_;
    }

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

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "a"
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), "a");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), "a");

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "z"
        );
    }

    function burnToken(uint256 tokenId) public {
        _transfer(ownerOf(tokenId), burnAddress, tokenId);
        numTokensBurned++;
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return (tokenId < currentIndex && ownerOf(tokenId) != burnAddress);
    }

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

    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "0");
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), "a");

//        if (from != address(0)) {
//            _beforeTokenTransfers(address(0), from, startTokenId, quantity);
//        }
//        if (from != to) {
//            _beforeTokenTransfers(from, to, startTokenId, quantity);
//        }


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



//        AddressData memory addressData = _addressData[to];
//        _addressData[to] = AddressData(
//            addressData.balance + uint128(quantity),
//            addressData.numberMinted + uint128(quantity)
//        );
//        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        _balances[to] = quantity;
        _ownerships[startTokenId] = to;

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
//            if (from != address(0)) {
//                emit Transfer(address(0), from, updatedIndex);
//            }
//            if (from != to) {
//                emit Transfer(from, to, updatedIndex);
//            }
            emit Transfer(address(0), to, updatedIndex);
            require(
//                _checkOnERC721Received(address(0), from, updatedIndex, _data) && _checkOnERC721Received(from, to, updatedIndex, _data),
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                "z"
            );
            updatedIndex++;
        }

        currentIndex = updatedIndex;
//        if (from != address(0)) {
//            _afterTokenTransfers(address(0), from, startTokenId, quantity);
//        }
//        if (from != to) {
//            _afterTokenTransfers(from, to, startTokenId, quantity);
//        }
//        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        address prevOwnership = ownerOf(tokenId);

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

        require(isApprovedOrOwner, "a");

        require(prevOwnership == from, "o");
        require(to != address(0), "0");

//        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId] == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = prevOwnership;
            }
        }

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

    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /******************/

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("z");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
}

////////////////////////////////////////

File 6 of 14 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 7 of 14 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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

pragma solidity ^0.8.0;

import "../../utils/introspection/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`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

File 9 of 14 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (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 10 of 14 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 11 of 14 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 12 of 14 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 14 of 14 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_cbeAddy","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint128[]","name":"_basisPoints","type":"uint128[]"}],"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toAuthorize","type":"address"}],"name":"addAuthorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cbeContract","outputs":[{"internalType":"contract CrudeBorneEggs","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"companionFound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"eggz","type":"uint256[]"}],"name":"dontGoAlone","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"disEgg","type":"uint256"}],"name":"hazCompanion","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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preRevealURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_collecImg","type":"string"}],"name":"setCollecImg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_collectionDescription","type":"string"}],"name":"setCollectionDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_externalLink","type":"string"}],"name":"setExternalLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum JellyBabies.Timeline","name":"_wen","type":"uint8"}],"name":"setTimeyWimey","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":"swimOrSink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swimming","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wen","outputs":[{"internalType":"enum JellyBabies.Timeline","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526000805561dead73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff168152506000600c60026101000a81548160ff021916908360028111156200006657620000656200043b565b5b02179055506000600e556040518060400160405280601c81526020017f576f756c6420796f75206c696b652061206a656c6c7920626162793f0000000081525060139080519060200190620000bd9291906200038b565b506040518060200160405280600081525060149080519060200190620000e59291906200038b565b506040518060400160405280601681526020017f68747470733a2f2f6372756465626f726e652e7774660000000000000000000081525060159080519060200190620001339291906200038b565b503480156200014157600080fd5b50604051620054e5380380620054e583398181016040528101906200016791906200086a565b83838160019080519060200190620001819291906200038b565b5080600290805190602001906200019a9291906200038b565b505050620001bd620001b1620002bd60201b60201c565b620002c560201b60201c565b60005b82518110156200027057818181518110620001e057620001df6200096e565b5b60200260200101516fffffffffffffffffffffffffffffffff16600d60008584815181106200021457620002136200096e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806200026790620009d6565b915050620001c0565b5084601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505062000a89565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003999062000a53565b90600052602060002090601f016020900481019282620003bd576000855562000409565b82601f10620003d857805160ff191683800117855562000409565b8280016001018555821562000409579182015b8281111562000408578251825591602001919060010190620003eb565b5b5090506200041891906200041c565b5090565b5b80821115620004375760008160009055506001016200041d565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004ab826200047e565b9050919050565b620004bd816200049e565b8114620004c957600080fd5b50565b600081519050620004dd81620004b2565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200053882620004ed565b810181811067ffffffffffffffff821117156200055a5762000559620004fe565b5b80604052505050565b60006200056f6200046a565b90506200057d82826200052d565b919050565b600067ffffffffffffffff821115620005a0576200059f620004fe565b5b620005ab82620004ed565b9050602081019050919050565b60005b83811015620005d8578082015181840152602081019050620005bb565b83811115620005e8576000848401525b50505050565b600062000605620005ff8462000582565b62000563565b905082815260208101848484011115620006245762000623620004e8565b5b62000631848285620005b8565b509392505050565b600082601f830112620006515762000650620004e3565b5b815162000663848260208601620005ee565b91505092915050565b600067ffffffffffffffff8211156200068a5762000689620004fe565b5b602082029050602081019050919050565b600080fd5b6000620006b7620006b1846200066c565b62000563565b90508083825260208201905060208402830185811115620006dd57620006dc6200069b565b5b835b818110156200070a5780620006f58882620004cc565b845260208401935050602081019050620006df565b5050509392505050565b600082601f8301126200072c576200072b620004e3565b5b81516200073e848260208601620006a0565b91505092915050565b600067ffffffffffffffff821115620007655762000764620004fe565b5b602082029050602081019050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200079d8162000776565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000620007da620007d48462000747565b62000563565b905080838252602082019050602084028301858111156200080057620007ff6200069b565b5b835b818110156200082d5780620008188882620007ac565b84526020840193505060208101905062000802565b5050509392505050565b600082601f8301126200084f576200084e620004e3565b5b815162000861848260208601620007c3565b91505092915050565b600080600080600060a0868803121562000889576200088862000474565b5b60006200089988828901620004cc565b955050602086015167ffffffffffffffff811115620008bd57620008bc62000479565b5b620008cb8882890162000639565b945050604086015167ffffffffffffffff811115620008ef57620008ee62000479565b5b620008fd8882890162000639565b935050606086015167ffffffffffffffff81111562000921576200092062000479565b5b6200092f8882890162000714565b925050608086015167ffffffffffffffff81111562000953576200095262000479565b5b620009618882890162000837565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000620009e382620009cc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000a195762000a186200099d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a6c57607f821691505b6020821081141562000a835762000a8262000a24565b5b50919050565b608051614a2b62000aba600039600081816111ba01528181611a3701528181611b0d01526122470152614a2b6000f3fe60806040526004361061024a5760003560e01c80636373a6b11161013957806395d89b41116100b6578063c0ef0bad1161007a578063c0ef0bad1461089c578063c87b56dd146108c7578063cf1c316a14610904578063e8a3d4851461092d578063e985e9c514610958578063f2fde38b146109955761026a565b806395d89b41146107b7578063a22cb465146107e2578063a4a997f81461080b578063b88d4fde14610836578063b91816111461085f5761026a565b8063715018a6116100fd578063715018a6146106f857806379b6ed361461070f5780637b47ec1a1461073a5780638da5cb5b146107635780639471302e1461078e5761026a565b80636373a6b1146106115780636bc0cb6c1461063c5780636c0360eb1461066557806370a082311461069057806370d5ae05146106cd5761026a565b80632f745c59116101c757806355f804b31161018b57806355f804b3146105085780635a45c81f146105315780635cb7c2a01461056e57806360b384e7146105ab5780636352211e146105d45761026a565b80632f745c59146104255780633ccfd60b1461046257806342842e0e146104795780634f6ccce7146104a257806352c2dd16146104df5761026a565b8063095ea7b31161020e578063095ea7b314610356578063109695231461037f57806318160ddd146103a85780631f917921146103d357806323b872dd146103fc5761026a565b806301ffc9a71461026f57806306c67d9e146102ac57806306fdde03146102c357806307824c06146102ee578063081812fc146103195761026a565b3661026a5734600e600082825461026191906131e3565b92505081905550005b600080fd5b34801561027b57600080fd5b50610296600480360381019061029191906132a5565b6109be565b6040516102a391906132ed565b60405180910390f35b3480156102b857600080fd5b506102c1610b08565b005b3480156102cf57600080fd5b506102d8610b3c565b6040516102e591906133a1565b60405180910390f35b3480156102fa57600080fd5b50610303610bce565b604051610310919061343a565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190613481565b610be1565b60405161034d91906134ef565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190613536565b610c66565b005b34801561038b57600080fd5b506103a660048036038101906103a191906136ab565b610d7f565b005b3480156103b457600080fd5b506103bd610dd6565b6040516103ca9190613703565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f591906136ab565b610ded565b005b34801561040857600080fd5b50610423600480360381019061041e919061371e565b610e0f565b005b34801561043157600080fd5b5061044c60048036038101906104479190613536565b610e1f565b6040516104599190613703565b60405180910390f35b34801561046e57600080fd5b50610477610fa3565b005b34801561048557600080fd5b506104a0600480360381019061049b919061371e565b61114d565b005b3480156104ae57600080fd5b506104c960048036038101906104c49190613481565b61116d565b6040516104d69190613703565b60405180910390f35b3480156104eb57600080fd5b50610506600480360381019061050191906136ab565b611257565b005b34801561051457600080fd5b5061052f600480360381019061052a91906136ab565b611279565b005b34801561053d57600080fd5b5061055860048036038101906105539190613481565b61128d565b60405161056591906132ed565b60405180910390f35b34801561057a57600080fd5b5061059560048036038101906105909190613481565b6112ea565b6040516105a29190613703565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd9190613839565b611302565b005b3480156105e057600080fd5b506105fb60048036038101906105f69190613481565b6116d8565b60405161060891906134ef565b60405180910390f35b34801561061d57600080fd5b506106266117f6565b60405161063391906133a1565b60405180910390f35b34801561064857600080fd5b50610663600480360381019061065e91906138a7565b611884565b005b34801561067157600080fd5b5061067a6118eb565b60405161068791906133a1565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b291906138d4565b61197d565b6040516106c49190613703565b60405180910390f35b3480156106d957600080fd5b506106e2611a35565b6040516106ef91906134ef565b60405180910390f35b34801561070457600080fd5b5061070d611a59565b005b34801561071b57600080fd5b50610724611a6d565b60405161073191906133a1565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c9190613481565b611aff565b005b34801561076f57600080fd5b50610778611b4d565b60405161078591906134ef565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b091906136ab565b611b77565b005b3480156107c357600080fd5b506107cc611b99565b6040516107d991906133a1565b60405180910390f35b3480156107ee57600080fd5b506108096004803603810190610804919061392d565b611c2b565b005b34801561081757600080fd5b50610820611dac565b60405161082d91906139cc565b60405180910390f35b34801561084257600080fd5b5061085d60048036038101906108589190613a88565b611dd2565b005b34801561086b57600080fd5b50610886600480360381019061088191906138d4565b611e2e565b60405161089391906132ed565b60405180910390f35b3480156108a857600080fd5b506108b1611e4e565b6040516108be91906132ed565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e99190613481565b611e61565b6040516108fb91906133a1565b60405180910390f35b34801561091057600080fd5b5061092b600480360381019061092691906138d4565b611f87565b005b34801561093957600080fd5b50610942611fea565b60405161094f91906133a1565b60405180910390f35b34801561096457600080fd5b5061097f600480360381019061097a9190613b0b565b612038565b60405161098c91906132ed565b60405180910390f35b3480156109a157600080fd5b506109bc60048036038101906109b791906138d4565b6120cc565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610af157507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b015750610b0082612150565b5b9050919050565b610b106121ba565b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b606060018054610b4b90613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7790613b7a565b8015610bc45780601f10610b9957610100808354040283529160200191610bc4565b820191906000526020600020905b815481529060010190602001808311610ba757829003601f168201915b5050505050905090565b600c60029054906101000a900460ff1681565b6000610bec82612238565b610c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2290613bf8565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c71826116d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd990613c64565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d016122a5565b73ffffffffffffffffffffffffffffffffffffffff161480610d305750610d2f81610d2a6122a5565b612038565b5b610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6690613bf8565b60405180910390fd5b610d7a8383836122ad565b505050565b610d876121ba565b600c60009054906101000a900460ff1615610da157600080fd5b80600b9080519060200190610db7929190613107565b506001600c60006101000a81548160ff02191690831515021790555050565b6000600754600054610de89190613c84565b905090565b610df56121ba565b8060159080519060200190610e0b929190613107565b5050565b610e1a83838361235f565b505050565b6000610e2a8361197d565b8210610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290613d04565b60405180910390fd5b6000610e75610dd6565b905060008060005b83811015610f615760006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ef5578092505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f4d5786841415610f3e578195505050505050610f9d565b8380610f4990613d24565b9450505b508080610f5990613d24565b915050610e7d565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9490613db9565b60405180910390fd5b92915050565b610fab61276b565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612710600e54610ffd9190613e08565b6110079190613e39565b90506000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826110569190613c84565b905081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060003373ffffffffffffffffffffffffffffffffffffffff16826040516110c290613ec4565b60006040518083038185875af1925050503d80600081146110ff576040519150601f19603f3d011682016040523d82523d6000602084013e611104565b606091505b5050905080611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90613f25565b60405180910390fd5b505050565b61116883838360405180602001604052806000815250611dd2565b505050565b6000611177610dd6565b82106111b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111af90613f91565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166111f8836116d8565b73ffffffffffffffffffffffffffffffffffffffff16141561124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124690613d04565b60405180910390fd5b819050919050565b61125f6121ba565b8060149080519060200190611275929190613107565b5050565b6112816121ba565b61128a816127ef565b50565b60008060fa8361129d9190613e08565b9050600060fa826112ae9190613e39565b846112b99190613c84565b905060016002826011600086815260200190815260200160002054901c6112e09190613fb1565b1492505050919050565b60116020528060005260406000206000915090505481565b60016002811115611316576113156133c3565b5b600c60029054906101000a900460ff166002811115611338576113376133c3565b5b14806113cc5750601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156113cb5750600060028111156113a7576113a66133c3565b5b600c60029054906101000a900460ff1660028111156113c9576113c86133c3565b5b145b5b61140b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061402e565b60405180910390fd5b6000806000806001905060006001905060005b86518110156116175760fa87828151811061143c5761143b61404e565b5b602002602001015161144e9190613e08565b935085841461148c57846011600088815260200190815260200160002054176011600088815260200190815260200160002081905550839550600094505b600060fa8761149b9190613e39565b8883815181106114ae576114ad61404e565b5b60200260200101516114c09190613c84565b90508380156114f157506000600282601160008b815260200190815260200160002054901c6114ef9190613fb1565b145b93508280156115ef57503373ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8a85815181106115635761156261404e565b5b60200260200101516040518263ffffffff1660e01b81526004016115879190613703565b60206040518083038186803b15801561159f57600080fd5b505afa1580156115b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d79190614092565b73ffffffffffffffffffffffffffffffffffffffff16145b9250806001901b8661160191906131e3565b955050808061160f90613d24565b91505061141e565b5081611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164f9061410b565b60405180910390fd5b80611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90613c64565b60405180910390fd5b8360116000878152602001908152602001600020541760116000878152602001908152602001600020819055506116d0338751612809565b505050505050565b60008054821061171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171490614177565b60405180910390fd5b60008290505b600081106117b55760006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117a15780925050506117f1565b5080806117ad90614197565b915050611723565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e890613c64565b60405180910390fd5b919050565b600b805461180390613b7a565b80601f016020809104026020016040519081016040528092919081815260200182805461182f90613b7a565b801561187c5780601f106118515761010080835404028352916020019161187c565b820191906000526020600020905b81548152906001019060200180831161185f57829003601f168201915b505050505081565b61188c6121ba565b600060028111156118a05761189f6133c3565b5b8160028111156118b3576118b26133c3565b5b14156118be57600080fd5b80600c60026101000a81548160ff021916908360028111156118e3576118e26133c3565b5b021790555050565b6060600380546118fa90613b7a565b80601f016020809104026020016040519081016040528092919081815260200182805461192690613b7a565b80156119735780601f1061194857610100808354040283529160200191611973565b820191906000526020600020905b81548152906001019060200180831161195657829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e59061420d565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611a616121ba565b611a6b6000612827565b565b606060048054611a7c90613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa890613b7a565b8015611af55780601f10611aca57610100808354040283529160200191611af5565b820191906000526020600020905b815481529060010190602001808311611ad857829003601f168201915b5050505050905090565b611b32611b0b826116d8565b7f00000000000000000000000000000000000000000000000000000000000000008361235f565b60076000815480929190611b4590613d24565b919050555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b7f6121ba565b8060139080519060200190611b95929190613107565b5050565b606060028054611ba890613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd490613b7a565b8015611c215780601f10611bf657610100808354040283529160200191611c21565b820191906000526020600020905b815481529060010190602001808311611c0457829003601f168201915b5050505050905090565b611c336122a5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9890613bf8565b60405180910390fd5b8060096000611cae6122a5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d5b6122a5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611da091906132ed565b60405180910390a35050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ddd84848461235f565b611de9848484846128ed565b611e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1f90614279565b60405180910390fd5b50505050565b60106020528060005260406000206000915054906101000a900460ff1681565b600c60019054906101000a900460ff1681565b6060611e6c82612238565b611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea290614279565b60405180910390fd5b600060038054611eba90613b7a565b90501115611ef4576003611ecd83612a84565b604051602001611ede929190614401565b6040516020818303038152906040529050611f82565b60048054611f0190613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2d90613b7a565b8015611f7a5780601f10611f4f57610100808354040283529160200191611f7a565b820191906000526020600020905b815481529060010190602001808311611f5d57829003601f168201915b505050505090505b919050565b611f8f6121ba565b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60606013601460156120113073ffffffffffffffffffffffffffffffffffffffff16612be5565b604051602001612024949392919061469b565b604051602081830303815290604052905090565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120d46121ba565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213b906147ae565b60405180910390fd5b61214d81612827565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121c26122a5565b73ffffffffffffffffffffffffffffffffffffffff166121e0611b4d565b73ffffffffffffffffffffffffffffffffffffffff1614612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222d9061481a565b60405180910390fd5b565b600080548210801561229e57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612285836116d8565b73ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061236a826116d8565b905060008173ffffffffffffffffffffffffffffffffffffffff1661238d6122a5565b73ffffffffffffffffffffffffffffffffffffffff1614806123e957506123b26122a5565b73ffffffffffffffffffffffffffffffffffffffff166123d184610be1565b73ffffffffffffffffffffffffffffffffffffffff16145b806124015750612400826123fb6122a5565b612038565b5b905080612443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243a90613bf8565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146124b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a890613c64565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612521576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125189061420d565b60405180910390fd5b61252d600084846122ad565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461257d9190613c84565b925050819055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125d491906131e3565b92505081905550836005600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060018461263c91906131e3565b9050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612708576126af81612238565b1561270757826005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116127ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e490614886565b60405180910390fd5b565b8060039080519060200190612805929190613107565b5050565b612823828260405180602001604052806000815250612c6b565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061290e8473ffffffffffffffffffffffffffffffffffffffff16612ea8565b15612a77578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129376122a5565b8786866040518563ffffffff1660e01b815260040161295994939291906148fb565b602060405180830381600087803b15801561297357600080fd5b505af19250505080156129a457506040513d601f19601f820116820180604052508101906129a1919061495c565b60015b612a27573d80600081146129d4576040519150601f19603f3d011682016040523d82523d6000602084013e6129d9565b606091505b50600081511415612a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1690614279565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a7c565b600190505b949350505050565b60606000821415612acc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612be0565b600082905060005b60008214612afe578080612ae790613d24565b915050600a82612af79190613e08565b9150612ad4565b60008167ffffffffffffffff811115612b1a57612b19613580565b5b6040519080825280601f01601f191660200182016040528015612b4c5781602001600182028036833780820191505090505b5090505b60008514612bd957600182612b659190613c84565b9150600a85612b749190613fb1565b6030612b8091906131e3565b60f81b818381518110612b9657612b9561404e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bd29190613e08565b9450612b50565b8093505050505b919050565b60606000821415612c2d576040518060400160405280600481526020017f30783030000000000000000000000000000000000000000000000000000000008152509050612c66565b600082905060005b60008214612c57578080612c4890613d24565b915050600882901c9150612c35565b612c618482612ecb565b925050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd89061420d565b60405180910390fd5b612cea81612238565b15612d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2190613bf8565b60405180910390fd5b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600081905060005b84811015612e9957818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e3960008784876128ed565b612e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6f90614279565b60405180910390fd5b8180612e8390613d24565b9250508080612e9190613d24565b915050612dc8565b50806000819055505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060006002836002612ede9190613e39565b612ee891906131e3565b67ffffffffffffffff811115612f0157612f00613580565b5b6040519080825280601f01601f191660200182016040528015612f335781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612f6b57612f6a61404e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612fcf57612fce61404e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261300f9190613e39565b61301991906131e3565b90505b60018111156130b9577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061305b5761305a61404e565b5b1a60f81b8282815181106130725761307161404e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806130b290614197565b905061301c565b50600084146130fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f4906149d5565b60405180910390fd5b8091505092915050565b82805461311390613b7a565b90600052602060002090601f016020900481019282613135576000855561317c565b82601f1061314e57805160ff191683800117855561317c565b8280016001018555821561317c579182015b8281111561317b578251825591602001919060010190613160565b5b509050613189919061318d565b5090565b5b808211156131a657600081600090555060010161318e565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006131ee826131aa565b91506131f9836131aa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561322e5761322d6131b4565b5b828201905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132828161324d565b811461328d57600080fd5b50565b60008135905061329f81613279565b92915050565b6000602082840312156132bb576132ba613243565b5b60006132c984828501613290565b91505092915050565b60008115159050919050565b6132e7816132d2565b82525050565b600060208201905061330260008301846132de565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613342578082015181840152602081019050613327565b83811115613351576000848401525b50505050565b6000601f19601f8301169050919050565b600061337382613308565b61337d8185613313565b935061338d818560208601613324565b61339681613357565b840191505092915050565b600060208201905081810360008301526133bb8184613368565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613403576134026133c3565b5b50565b6000819050613414826133f2565b919050565b600061342482613406565b9050919050565b61343481613419565b82525050565b600060208201905061344f600083018461342b565b92915050565b61345e816131aa565b811461346957600080fd5b50565b60008135905061347b81613455565b92915050565b60006020828403121561349757613496613243565b5b60006134a58482850161346c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134d9826134ae565b9050919050565b6134e9816134ce565b82525050565b600060208201905061350460008301846134e0565b92915050565b613513816134ce565b811461351e57600080fd5b50565b6000813590506135308161350a565b92915050565b6000806040838503121561354d5761354c613243565b5b600061355b85828601613521565b925050602061356c8582860161346c565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135b882613357565b810181811067ffffffffffffffff821117156135d7576135d6613580565b5b80604052505050565b60006135ea613239565b90506135f682826135af565b919050565b600067ffffffffffffffff82111561361657613615613580565b5b61361f82613357565b9050602081019050919050565b82818337600083830152505050565b600061364e613649846135fb565b6135e0565b90508281526020810184848401111561366a5761366961357b565b5b61367584828561362c565b509392505050565b600082601f83011261369257613691613576565b5b81356136a284826020860161363b565b91505092915050565b6000602082840312156136c1576136c0613243565b5b600082013567ffffffffffffffff8111156136df576136de613248565b5b6136eb8482850161367d565b91505092915050565b6136fd816131aa565b82525050565b600060208201905061371860008301846136f4565b92915050565b60008060006060848603121561373757613736613243565b5b600061374586828701613521565b935050602061375686828701613521565b92505060406137678682870161346c565b9150509250925092565b600067ffffffffffffffff82111561378c5761378b613580565b5b602082029050602081019050919050565b600080fd5b60006137b56137b084613771565b6135e0565b905080838252602082019050602084028301858111156137d8576137d761379d565b5b835b8181101561380157806137ed888261346c565b8452602084019350506020810190506137da565b5050509392505050565b600082601f8301126138205761381f613576565b5b81356138308482602086016137a2565b91505092915050565b60006020828403121561384f5761384e613243565b5b600082013567ffffffffffffffff81111561386d5761386c613248565b5b6138798482850161380b565b91505092915050565b6003811061388f57600080fd5b50565b6000813590506138a181613882565b92915050565b6000602082840312156138bd576138bc613243565b5b60006138cb84828501613892565b91505092915050565b6000602082840312156138ea576138e9613243565b5b60006138f884828501613521565b91505092915050565b61390a816132d2565b811461391557600080fd5b50565b60008135905061392781613901565b92915050565b6000806040838503121561394457613943613243565b5b600061395285828601613521565b925050602061396385828601613918565b9150509250929050565b6000819050919050565b600061399261398d613988846134ae565b61396d565b6134ae565b9050919050565b60006139a482613977565b9050919050565b60006139b682613999565b9050919050565b6139c6816139ab565b82525050565b60006020820190506139e160008301846139bd565b92915050565b600067ffffffffffffffff821115613a0257613a01613580565b5b613a0b82613357565b9050602081019050919050565b6000613a2b613a26846139e7565b6135e0565b905082815260208101848484011115613a4757613a4661357b565b5b613a5284828561362c565b509392505050565b600082601f830112613a6f57613a6e613576565b5b8135613a7f848260208601613a18565b91505092915050565b60008060008060808587031215613aa257613aa1613243565b5b6000613ab087828801613521565b9450506020613ac187828801613521565b9350506040613ad28782880161346c565b925050606085013567ffffffffffffffff811115613af357613af2613248565b5b613aff87828801613a5a565b91505092959194509250565b60008060408385031215613b2257613b21613243565b5b6000613b3085828601613521565b9250506020613b4185828601613521565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b9257607f821691505b60208210811415613ba657613ba5613b4b565b5b50919050565b7f6100000000000000000000000000000000000000000000000000000000000000600082015250565b6000613be2600183613313565b9150613bed82613bac565b602082019050919050565b60006020820190508181036000830152613c1181613bd5565b9050919050565b7f6f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000613c4e600183613313565b9150613c5982613c18565b602082019050919050565b60006020820190508181036000830152613c7d81613c41565b9050919050565b6000613c8f826131aa565b9150613c9a836131aa565b925082821015613cad57613cac6131b4565b5b828203905092915050565b7f6200000000000000000000000000000000000000000000000000000000000000600082015250565b6000613cee600183613313565b9150613cf982613cb8565b602082019050919050565b60006020820190508181036000830152613d1d81613ce1565b9050919050565b6000613d2f826131aa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d6257613d616131b4565b5b600182019050919050565b7f7500000000000000000000000000000000000000000000000000000000000000600082015250565b6000613da3600183613313565b9150613dae82613d6d565b602082019050919050565b60006020820190508181036000830152613dd281613d96565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e13826131aa565b9150613e1e836131aa565b925082613e2e57613e2d613dd9565b5b828204905092915050565b6000613e44826131aa565b9150613e4f836131aa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e8857613e876131b4565b5b828202905092915050565b600081905092915050565b50565b6000613eae600083613e93565b9150613eb982613e9e565b600082019050919050565b6000613ecf82613ea1565b9150819050919050565b7f5061796d656e74206661696c6564210000000000000000000000000000000000600082015250565b6000613f0f600f83613313565b9150613f1a82613ed9565b602082019050919050565b60006020820190508181036000830152613f3e81613f02565b9050919050565b7f6700000000000000000000000000000000000000000000000000000000000000600082015250565b6000613f7b600183613313565b9150613f8682613f45565b602082019050919050565b60006020820190508181036000830152613faa81613f6e565b9050919050565b6000613fbc826131aa565b9150613fc7836131aa565b925082613fd757613fd6613dd9565b5b828206905092915050565b7f7700000000000000000000000000000000000000000000000000000000000000600082015250565b6000614018600183613313565b915061402382613fe2565b602082019050919050565b600060208201905081810360008301526140478161400b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061408c8161350a565b92915050565b6000602082840312156140a8576140a7613243565b5b60006140b68482850161407d565b91505092915050565b7f6300000000000000000000000000000000000000000000000000000000000000600082015250565b60006140f5600183613313565b9150614100826140bf565b602082019050919050565b60006020820190508181036000830152614124816140e8565b9050919050565b7f7400000000000000000000000000000000000000000000000000000000000000600082015250565b6000614161600183613313565b915061416c8261412b565b602082019050919050565b6000602082019050818103600083015261419081614154565b9050919050565b60006141a2826131aa565b915060008214156141b6576141b56131b4565b5b600182039050919050565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b60006141f7600183613313565b9150614202826141c1565b602082019050919050565b60006020820190508181036000830152614226816141ea565b9050919050565b7f7a00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614263600183613313565b915061426e8261422d565b602082019050919050565b6000602082019050818103600083015261429281614256565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546142c681613b7a565b6142d08186614299565b945060018216600081146142eb57600181146142fc5761432f565b60ff1983168652818601935061432f565b614305856142a4565b60005b8381101561432757815481890152600182019150602081019050614308565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061436e600183614299565b915061437982614338565b600182019050919050565b600061438f82613308565b6143998185614299565b93506143a9818560208601613324565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006143eb600583614299565b91506143f6826143b5565b600582019050919050565b600061440d82856142b9565b915061441882614361565b91506144248284614384565b915061442f826143de565b91508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d60008201527f65223a224372756465426f726e653a204a656c6c7920426162696573222c0000602082015250565b6000614497603e83614299565b91506144a28261443b565b603e82019050919050565b7f226465736372697074696f6e223a220000000000000000000000000000000000600082015250565b60006144e3600f83614299565b91506144ee826144ad565b600f82019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b600061452f600283614299565b915061453a826144f9565b600282019050919050565b7f22696d616765223a220000000000000000000000000000000000000000000000600082015250565b600061457b600983614299565b915061458682614545565b600982019050919050565b7f2265787465726e616c5f6c696e6b223a22000000000000000000000000000000600082015250565b60006145c7601183614299565b91506145d282614591565b601182019050919050565b7f2273656c6c65725f6665655f62617369735f706f696e7473223a3432302c226660008201527f65655f726563697069656e74223a220000000000000000000000000000000000602082015250565b6000614639602f83614299565b9150614644826145dd565b602f82019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614685600283614299565b91506146908261464f565b600282019050919050565b60006146a68261448a565b91506146b1826144d6565b91506146bd82876142b9565b91506146c882614522565b91506146d38261456e565b91506146df82866142b9565b91506146ea82614522565b91506146f5826145ba565b915061470182856142b9565b915061470c82614522565b91506147178261462c565b91506147238284614384565b915061472e82614678565b915081905095945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614798602683613313565b91506147a38261473c565b604082019050919050565b600060208201905081810360008301526147c78161478b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614804602083613313565b915061480f826147ce565b602082019050919050565b60006020820190508181036000830152614833816147f7565b9050919050565b7f6e6f74206120726f79616c747920706179656500000000000000000000000000600082015250565b6000614870601383613313565b915061487b8261483a565b602082019050919050565b6000602082019050818103600083015261489f81614863565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006148cd826148a6565b6148d781856148b1565b93506148e7818560208601613324565b6148f081613357565b840191505092915050565b600060808201905061491060008301876134e0565b61491d60208301866134e0565b61492a60408301856136f4565b818103606083015261493c81846148c2565b905095945050505050565b60008151905061495681613279565b92915050565b60006020828403121561497257614971613243565b5b600061498084828501614947565b91505092915050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006149bf602083613313565b91506149ca82614989565b602082019050919050565b600060208201905081810360008301526149ee816149b2565b905091905056fea264697066735822122071b90a0a8de4fb16c1dcaddc5c1a125e370012f94a33996e966586c745b281a664736f6c634300080900330000000000000000000000006c5a06ae6b773457480c12f12c2fb22627507a3a00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000174372756465426f726e65204a656c6c7920426162696573000000000000000000000000000000000000000000000000000000000000000000000000000000000843422e4a454c4c59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000066f3794178997a12779527b36a2f042e001625af0000000000000000000000005d5ee1d6b3c12b07519020b0b14a495d518be78d000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000005dc0000000000000000000000000000000000000000000000000000000000002134

Deployed Bytecode

0x60806040526004361061024a5760003560e01c80636373a6b11161013957806395d89b41116100b6578063c0ef0bad1161007a578063c0ef0bad1461089c578063c87b56dd146108c7578063cf1c316a14610904578063e8a3d4851461092d578063e985e9c514610958578063f2fde38b146109955761026a565b806395d89b41146107b7578063a22cb465146107e2578063a4a997f81461080b578063b88d4fde14610836578063b91816111461085f5761026a565b8063715018a6116100fd578063715018a6146106f857806379b6ed361461070f5780637b47ec1a1461073a5780638da5cb5b146107635780639471302e1461078e5761026a565b80636373a6b1146106115780636bc0cb6c1461063c5780636c0360eb1461066557806370a082311461069057806370d5ae05146106cd5761026a565b80632f745c59116101c757806355f804b31161018b57806355f804b3146105085780635a45c81f146105315780635cb7c2a01461056e57806360b384e7146105ab5780636352211e146105d45761026a565b80632f745c59146104255780633ccfd60b1461046257806342842e0e146104795780634f6ccce7146104a257806352c2dd16146104df5761026a565b8063095ea7b31161020e578063095ea7b314610356578063109695231461037f57806318160ddd146103a85780631f917921146103d357806323b872dd146103fc5761026a565b806301ffc9a71461026f57806306c67d9e146102ac57806306fdde03146102c357806307824c06146102ee578063081812fc146103195761026a565b3661026a5734600e600082825461026191906131e3565b92505081905550005b600080fd5b34801561027b57600080fd5b50610296600480360381019061029191906132a5565b6109be565b6040516102a391906132ed565b60405180910390f35b3480156102b857600080fd5b506102c1610b08565b005b3480156102cf57600080fd5b506102d8610b3c565b6040516102e591906133a1565b60405180910390f35b3480156102fa57600080fd5b50610303610bce565b604051610310919061343a565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190613481565b610be1565b60405161034d91906134ef565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190613536565b610c66565b005b34801561038b57600080fd5b506103a660048036038101906103a191906136ab565b610d7f565b005b3480156103b457600080fd5b506103bd610dd6565b6040516103ca9190613703565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f591906136ab565b610ded565b005b34801561040857600080fd5b50610423600480360381019061041e919061371e565b610e0f565b005b34801561043157600080fd5b5061044c60048036038101906104479190613536565b610e1f565b6040516104599190613703565b60405180910390f35b34801561046e57600080fd5b50610477610fa3565b005b34801561048557600080fd5b506104a0600480360381019061049b919061371e565b61114d565b005b3480156104ae57600080fd5b506104c960048036038101906104c49190613481565b61116d565b6040516104d69190613703565b60405180910390f35b3480156104eb57600080fd5b50610506600480360381019061050191906136ab565b611257565b005b34801561051457600080fd5b5061052f600480360381019061052a91906136ab565b611279565b005b34801561053d57600080fd5b5061055860048036038101906105539190613481565b61128d565b60405161056591906132ed565b60405180910390f35b34801561057a57600080fd5b5061059560048036038101906105909190613481565b6112ea565b6040516105a29190613703565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd9190613839565b611302565b005b3480156105e057600080fd5b506105fb60048036038101906105f69190613481565b6116d8565b60405161060891906134ef565b60405180910390f35b34801561061d57600080fd5b506106266117f6565b60405161063391906133a1565b60405180910390f35b34801561064857600080fd5b50610663600480360381019061065e91906138a7565b611884565b005b34801561067157600080fd5b5061067a6118eb565b60405161068791906133a1565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b291906138d4565b61197d565b6040516106c49190613703565b60405180910390f35b3480156106d957600080fd5b506106e2611a35565b6040516106ef91906134ef565b60405180910390f35b34801561070457600080fd5b5061070d611a59565b005b34801561071b57600080fd5b50610724611a6d565b60405161073191906133a1565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c9190613481565b611aff565b005b34801561076f57600080fd5b50610778611b4d565b60405161078591906134ef565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b091906136ab565b611b77565b005b3480156107c357600080fd5b506107cc611b99565b6040516107d991906133a1565b60405180910390f35b3480156107ee57600080fd5b506108096004803603810190610804919061392d565b611c2b565b005b34801561081757600080fd5b50610820611dac565b60405161082d91906139cc565b60405180910390f35b34801561084257600080fd5b5061085d60048036038101906108589190613a88565b611dd2565b005b34801561086b57600080fd5b50610886600480360381019061088191906138d4565b611e2e565b60405161089391906132ed565b60405180910390f35b3480156108a857600080fd5b506108b1611e4e565b6040516108be91906132ed565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e99190613481565b611e61565b6040516108fb91906133a1565b60405180910390f35b34801561091057600080fd5b5061092b600480360381019061092691906138d4565b611f87565b005b34801561093957600080fd5b50610942611fea565b60405161094f91906133a1565b60405180910390f35b34801561096457600080fd5b5061097f600480360381019061097a9190613b0b565b612038565b60405161098c91906132ed565b60405180910390f35b3480156109a157600080fd5b506109bc60048036038101906109b791906138d4565b6120cc565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610af157507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b015750610b0082612150565b5b9050919050565b610b106121ba565b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b606060018054610b4b90613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7790613b7a565b8015610bc45780601f10610b9957610100808354040283529160200191610bc4565b820191906000526020600020905b815481529060010190602001808311610ba757829003601f168201915b5050505050905090565b600c60029054906101000a900460ff1681565b6000610bec82612238565b610c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2290613bf8565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c71826116d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd990613c64565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d016122a5565b73ffffffffffffffffffffffffffffffffffffffff161480610d305750610d2f81610d2a6122a5565b612038565b5b610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6690613bf8565b60405180910390fd5b610d7a8383836122ad565b505050565b610d876121ba565b600c60009054906101000a900460ff1615610da157600080fd5b80600b9080519060200190610db7929190613107565b506001600c60006101000a81548160ff02191690831515021790555050565b6000600754600054610de89190613c84565b905090565b610df56121ba565b8060159080519060200190610e0b929190613107565b5050565b610e1a83838361235f565b505050565b6000610e2a8361197d565b8210610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290613d04565b60405180910390fd5b6000610e75610dd6565b905060008060005b83811015610f615760006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ef5578092505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f4d5786841415610f3e578195505050505050610f9d565b8380610f4990613d24565b9450505b508080610f5990613d24565b915050610e7d565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9490613db9565b60405180910390fd5b92915050565b610fab61276b565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612710600e54610ffd9190613e08565b6110079190613e39565b90506000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826110569190613c84565b905081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060003373ffffffffffffffffffffffffffffffffffffffff16826040516110c290613ec4565b60006040518083038185875af1925050503d80600081146110ff576040519150601f19603f3d011682016040523d82523d6000602084013e611104565b606091505b5050905080611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90613f25565b60405180910390fd5b505050565b61116883838360405180602001604052806000815250611dd2565b505050565b6000611177610dd6565b82106111b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111af90613f91565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000dead73ffffffffffffffffffffffffffffffffffffffff166111f8836116d8565b73ffffffffffffffffffffffffffffffffffffffff16141561124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124690613d04565b60405180910390fd5b819050919050565b61125f6121ba565b8060149080519060200190611275929190613107565b5050565b6112816121ba565b61128a816127ef565b50565b60008060fa8361129d9190613e08565b9050600060fa826112ae9190613e39565b846112b99190613c84565b905060016002826011600086815260200190815260200160002054901c6112e09190613fb1565b1492505050919050565b60116020528060005260406000206000915090505481565b60016002811115611316576113156133c3565b5b600c60029054906101000a900460ff166002811115611338576113376133c3565b5b14806113cc5750601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156113cb5750600060028111156113a7576113a66133c3565b5b600c60029054906101000a900460ff1660028111156113c9576113c86133c3565b5b145b5b61140b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114029061402e565b60405180910390fd5b6000806000806001905060006001905060005b86518110156116175760fa87828151811061143c5761143b61404e565b5b602002602001015161144e9190613e08565b935085841461148c57846011600088815260200190815260200160002054176011600088815260200190815260200160002081905550839550600094505b600060fa8761149b9190613e39565b8883815181106114ae576114ad61404e565b5b60200260200101516114c09190613c84565b90508380156114f157506000600282601160008b815260200190815260200160002054901c6114ef9190613fb1565b145b93508280156115ef57503373ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8a85815181106115635761156261404e565b5b60200260200101516040518263ffffffff1660e01b81526004016115879190613703565b60206040518083038186803b15801561159f57600080fd5b505afa1580156115b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d79190614092565b73ffffffffffffffffffffffffffffffffffffffff16145b9250806001901b8661160191906131e3565b955050808061160f90613d24565b91505061141e565b5081611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164f9061410b565b60405180910390fd5b80611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90613c64565b60405180910390fd5b8360116000878152602001908152602001600020541760116000878152602001908152602001600020819055506116d0338751612809565b505050505050565b60008054821061171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171490614177565b60405180910390fd5b60008290505b600081106117b55760006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117a15780925050506117f1565b5080806117ad90614197565b915050611723565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e890613c64565b60405180910390fd5b919050565b600b805461180390613b7a565b80601f016020809104026020016040519081016040528092919081815260200182805461182f90613b7a565b801561187c5780601f106118515761010080835404028352916020019161187c565b820191906000526020600020905b81548152906001019060200180831161185f57829003601f168201915b505050505081565b61188c6121ba565b600060028111156118a05761189f6133c3565b5b8160028111156118b3576118b26133c3565b5b14156118be57600080fd5b80600c60026101000a81548160ff021916908360028111156118e3576118e26133c3565b5b021790555050565b6060600380546118fa90613b7a565b80601f016020809104026020016040519081016040528092919081815260200182805461192690613b7a565b80156119735780601f1061194857610100808354040283529160200191611973565b820191906000526020600020905b81548152906001019060200180831161195657829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e59061420d565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f000000000000000000000000000000000000000000000000000000000000dead81565b611a616121ba565b611a6b6000612827565b565b606060048054611a7c90613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa890613b7a565b8015611af55780601f10611aca57610100808354040283529160200191611af5565b820191906000526020600020905b815481529060010190602001808311611ad857829003601f168201915b5050505050905090565b611b32611b0b826116d8565b7f000000000000000000000000000000000000000000000000000000000000dead8361235f565b60076000815480929190611b4590613d24565b919050555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b7f6121ba565b8060139080519060200190611b95929190613107565b5050565b606060028054611ba890613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd490613b7a565b8015611c215780601f10611bf657610100808354040283529160200191611c21565b820191906000526020600020905b815481529060010190602001808311611c0457829003601f168201915b5050505050905090565b611c336122a5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9890613bf8565b60405180910390fd5b8060096000611cae6122a5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d5b6122a5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611da091906132ed565b60405180910390a35050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ddd84848461235f565b611de9848484846128ed565b611e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1f90614279565b60405180910390fd5b50505050565b60106020528060005260406000206000915054906101000a900460ff1681565b600c60019054906101000a900460ff1681565b6060611e6c82612238565b611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea290614279565b60405180910390fd5b600060038054611eba90613b7a565b90501115611ef4576003611ecd83612a84565b604051602001611ede929190614401565b6040516020818303038152906040529050611f82565b60048054611f0190613b7a565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2d90613b7a565b8015611f7a5780601f10611f4f57610100808354040283529160200191611f7a565b820191906000526020600020905b815481529060010190602001808311611f5d57829003601f168201915b505050505090505b919050565b611f8f6121ba565b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60606013601460156120113073ffffffffffffffffffffffffffffffffffffffff16612be5565b604051602001612024949392919061469b565b604051602081830303815290604052905090565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120d46121ba565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213b906147ae565b60405180910390fd5b61214d81612827565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121c26122a5565b73ffffffffffffffffffffffffffffffffffffffff166121e0611b4d565b73ffffffffffffffffffffffffffffffffffffffff1614612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222d9061481a565b60405180910390fd5b565b600080548210801561229e57507f000000000000000000000000000000000000000000000000000000000000dead73ffffffffffffffffffffffffffffffffffffffff16612285836116d8565b73ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061236a826116d8565b905060008173ffffffffffffffffffffffffffffffffffffffff1661238d6122a5565b73ffffffffffffffffffffffffffffffffffffffff1614806123e957506123b26122a5565b73ffffffffffffffffffffffffffffffffffffffff166123d184610be1565b73ffffffffffffffffffffffffffffffffffffffff16145b806124015750612400826123fb6122a5565b612038565b5b905080612443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243a90613bf8565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146124b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a890613c64565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612521576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125189061420d565b60405180910390fd5b61252d600084846122ad565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461257d9190613c84565b925050819055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125d491906131e3565b92505081905550836005600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060018461263c91906131e3565b9050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612708576126af81612238565b1561270757826005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116127ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e490614886565b60405180910390fd5b565b8060039080519060200190612805929190613107565b5050565b612823828260405180602001604052806000815250612c6b565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061290e8473ffffffffffffffffffffffffffffffffffffffff16612ea8565b15612a77578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129376122a5565b8786866040518563ffffffff1660e01b815260040161295994939291906148fb565b602060405180830381600087803b15801561297357600080fd5b505af19250505080156129a457506040513d601f19601f820116820180604052508101906129a1919061495c565b60015b612a27573d80600081146129d4576040519150601f19603f3d011682016040523d82523d6000602084013e6129d9565b606091505b50600081511415612a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1690614279565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a7c565b600190505b949350505050565b60606000821415612acc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612be0565b600082905060005b60008214612afe578080612ae790613d24565b915050600a82612af79190613e08565b9150612ad4565b60008167ffffffffffffffff811115612b1a57612b19613580565b5b6040519080825280601f01601f191660200182016040528015612b4c5781602001600182028036833780820191505090505b5090505b60008514612bd957600182612b659190613c84565b9150600a85612b749190613fb1565b6030612b8091906131e3565b60f81b818381518110612b9657612b9561404e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bd29190613e08565b9450612b50565b8093505050505b919050565b60606000821415612c2d576040518060400160405280600481526020017f30783030000000000000000000000000000000000000000000000000000000008152509050612c66565b600082905060005b60008214612c57578080612c4890613d24565b915050600882901c9150612c35565b612c618482612ecb565b925050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd89061420d565b60405180910390fd5b612cea81612238565b15612d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2190613bf8565b60405180910390fd5b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600081905060005b84811015612e9957818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e3960008784876128ed565b612e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6f90614279565b60405180910390fd5b8180612e8390613d24565b9250508080612e9190613d24565b915050612dc8565b50806000819055505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060006002836002612ede9190613e39565b612ee891906131e3565b67ffffffffffffffff811115612f0157612f00613580565b5b6040519080825280601f01601f191660200182016040528015612f335781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612f6b57612f6a61404e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612fcf57612fce61404e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261300f9190613e39565b61301991906131e3565b90505b60018111156130b9577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061305b5761305a61404e565b5b1a60f81b8282815181106130725761307161404e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806130b290614197565b905061301c565b50600084146130fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f4906149d5565b60405180910390fd5b8091505092915050565b82805461311390613b7a565b90600052602060002090601f016020900481019282613135576000855561317c565b82601f1061314e57805160ff191683800117855561317c565b8280016001018555821561317c579182015b8281111561317b578251825591602001919060010190613160565b5b509050613189919061318d565b5090565b5b808211156131a657600081600090555060010161318e565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006131ee826131aa565b91506131f9836131aa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561322e5761322d6131b4565b5b828201905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132828161324d565b811461328d57600080fd5b50565b60008135905061329f81613279565b92915050565b6000602082840312156132bb576132ba613243565b5b60006132c984828501613290565b91505092915050565b60008115159050919050565b6132e7816132d2565b82525050565b600060208201905061330260008301846132de565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613342578082015181840152602081019050613327565b83811115613351576000848401525b50505050565b6000601f19601f8301169050919050565b600061337382613308565b61337d8185613313565b935061338d818560208601613324565b61339681613357565b840191505092915050565b600060208201905081810360008301526133bb8184613368565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613403576134026133c3565b5b50565b6000819050613414826133f2565b919050565b600061342482613406565b9050919050565b61343481613419565b82525050565b600060208201905061344f600083018461342b565b92915050565b61345e816131aa565b811461346957600080fd5b50565b60008135905061347b81613455565b92915050565b60006020828403121561349757613496613243565b5b60006134a58482850161346c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134d9826134ae565b9050919050565b6134e9816134ce565b82525050565b600060208201905061350460008301846134e0565b92915050565b613513816134ce565b811461351e57600080fd5b50565b6000813590506135308161350a565b92915050565b6000806040838503121561354d5761354c613243565b5b600061355b85828601613521565b925050602061356c8582860161346c565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135b882613357565b810181811067ffffffffffffffff821117156135d7576135d6613580565b5b80604052505050565b60006135ea613239565b90506135f682826135af565b919050565b600067ffffffffffffffff82111561361657613615613580565b5b61361f82613357565b9050602081019050919050565b82818337600083830152505050565b600061364e613649846135fb565b6135e0565b90508281526020810184848401111561366a5761366961357b565b5b61367584828561362c565b509392505050565b600082601f83011261369257613691613576565b5b81356136a284826020860161363b565b91505092915050565b6000602082840312156136c1576136c0613243565b5b600082013567ffffffffffffffff8111156136df576136de613248565b5b6136eb8482850161367d565b91505092915050565b6136fd816131aa565b82525050565b600060208201905061371860008301846136f4565b92915050565b60008060006060848603121561373757613736613243565b5b600061374586828701613521565b935050602061375686828701613521565b92505060406137678682870161346c565b9150509250925092565b600067ffffffffffffffff82111561378c5761378b613580565b5b602082029050602081019050919050565b600080fd5b60006137b56137b084613771565b6135e0565b905080838252602082019050602084028301858111156137d8576137d761379d565b5b835b8181101561380157806137ed888261346c565b8452602084019350506020810190506137da565b5050509392505050565b600082601f8301126138205761381f613576565b5b81356138308482602086016137a2565b91505092915050565b60006020828403121561384f5761384e613243565b5b600082013567ffffffffffffffff81111561386d5761386c613248565b5b6138798482850161380b565b91505092915050565b6003811061388f57600080fd5b50565b6000813590506138a181613882565b92915050565b6000602082840312156138bd576138bc613243565b5b60006138cb84828501613892565b91505092915050565b6000602082840312156138ea576138e9613243565b5b60006138f884828501613521565b91505092915050565b61390a816132d2565b811461391557600080fd5b50565b60008135905061392781613901565b92915050565b6000806040838503121561394457613943613243565b5b600061395285828601613521565b925050602061396385828601613918565b9150509250929050565b6000819050919050565b600061399261398d613988846134ae565b61396d565b6134ae565b9050919050565b60006139a482613977565b9050919050565b60006139b682613999565b9050919050565b6139c6816139ab565b82525050565b60006020820190506139e160008301846139bd565b92915050565b600067ffffffffffffffff821115613a0257613a01613580565b5b613a0b82613357565b9050602081019050919050565b6000613a2b613a26846139e7565b6135e0565b905082815260208101848484011115613a4757613a4661357b565b5b613a5284828561362c565b509392505050565b600082601f830112613a6f57613a6e613576565b5b8135613a7f848260208601613a18565b91505092915050565b60008060008060808587031215613aa257613aa1613243565b5b6000613ab087828801613521565b9450506020613ac187828801613521565b9350506040613ad28782880161346c565b925050606085013567ffffffffffffffff811115613af357613af2613248565b5b613aff87828801613a5a565b91505092959194509250565b60008060408385031215613b2257613b21613243565b5b6000613b3085828601613521565b9250506020613b4185828601613521565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b9257607f821691505b60208210811415613ba657613ba5613b4b565b5b50919050565b7f6100000000000000000000000000000000000000000000000000000000000000600082015250565b6000613be2600183613313565b9150613bed82613bac565b602082019050919050565b60006020820190508181036000830152613c1181613bd5565b9050919050565b7f6f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000613c4e600183613313565b9150613c5982613c18565b602082019050919050565b60006020820190508181036000830152613c7d81613c41565b9050919050565b6000613c8f826131aa565b9150613c9a836131aa565b925082821015613cad57613cac6131b4565b5b828203905092915050565b7f6200000000000000000000000000000000000000000000000000000000000000600082015250565b6000613cee600183613313565b9150613cf982613cb8565b602082019050919050565b60006020820190508181036000830152613d1d81613ce1565b9050919050565b6000613d2f826131aa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d6257613d616131b4565b5b600182019050919050565b7f7500000000000000000000000000000000000000000000000000000000000000600082015250565b6000613da3600183613313565b9150613dae82613d6d565b602082019050919050565b60006020820190508181036000830152613dd281613d96565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e13826131aa565b9150613e1e836131aa565b925082613e2e57613e2d613dd9565b5b828204905092915050565b6000613e44826131aa565b9150613e4f836131aa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e8857613e876131b4565b5b828202905092915050565b600081905092915050565b50565b6000613eae600083613e93565b9150613eb982613e9e565b600082019050919050565b6000613ecf82613ea1565b9150819050919050565b7f5061796d656e74206661696c6564210000000000000000000000000000000000600082015250565b6000613f0f600f83613313565b9150613f1a82613ed9565b602082019050919050565b60006020820190508181036000830152613f3e81613f02565b9050919050565b7f6700000000000000000000000000000000000000000000000000000000000000600082015250565b6000613f7b600183613313565b9150613f8682613f45565b602082019050919050565b60006020820190508181036000830152613faa81613f6e565b9050919050565b6000613fbc826131aa565b9150613fc7836131aa565b925082613fd757613fd6613dd9565b5b828206905092915050565b7f7700000000000000000000000000000000000000000000000000000000000000600082015250565b6000614018600183613313565b915061402382613fe2565b602082019050919050565b600060208201905081810360008301526140478161400b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061408c8161350a565b92915050565b6000602082840312156140a8576140a7613243565b5b60006140b68482850161407d565b91505092915050565b7f6300000000000000000000000000000000000000000000000000000000000000600082015250565b60006140f5600183613313565b9150614100826140bf565b602082019050919050565b60006020820190508181036000830152614124816140e8565b9050919050565b7f7400000000000000000000000000000000000000000000000000000000000000600082015250565b6000614161600183613313565b915061416c8261412b565b602082019050919050565b6000602082019050818103600083015261419081614154565b9050919050565b60006141a2826131aa565b915060008214156141b6576141b56131b4565b5b600182039050919050565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b60006141f7600183613313565b9150614202826141c1565b602082019050919050565b60006020820190508181036000830152614226816141ea565b9050919050565b7f7a00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614263600183613313565b915061426e8261422d565b602082019050919050565b6000602082019050818103600083015261429281614256565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546142c681613b7a565b6142d08186614299565b945060018216600081146142eb57600181146142fc5761432f565b60ff1983168652818601935061432f565b614305856142a4565b60005b8381101561432757815481890152600182019150602081019050614308565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061436e600183614299565b915061437982614338565b600182019050919050565b600061438f82613308565b6143998185614299565b93506143a9818560208601613324565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006143eb600583614299565b91506143f6826143b5565b600582019050919050565b600061440d82856142b9565b915061441882614361565b91506144248284614384565b915061442f826143de565b91508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d60008201527f65223a224372756465426f726e653a204a656c6c7920426162696573222c0000602082015250565b6000614497603e83614299565b91506144a28261443b565b603e82019050919050565b7f226465736372697074696f6e223a220000000000000000000000000000000000600082015250565b60006144e3600f83614299565b91506144ee826144ad565b600f82019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b600061452f600283614299565b915061453a826144f9565b600282019050919050565b7f22696d616765223a220000000000000000000000000000000000000000000000600082015250565b600061457b600983614299565b915061458682614545565b600982019050919050565b7f2265787465726e616c5f6c696e6b223a22000000000000000000000000000000600082015250565b60006145c7601183614299565b91506145d282614591565b601182019050919050565b7f2273656c6c65725f6665655f62617369735f706f696e7473223a3432302c226660008201527f65655f726563697069656e74223a220000000000000000000000000000000000602082015250565b6000614639602f83614299565b9150614644826145dd565b602f82019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614685600283614299565b91506146908261464f565b600282019050919050565b60006146a68261448a565b91506146b1826144d6565b91506146bd82876142b9565b91506146c882614522565b91506146d38261456e565b91506146df82866142b9565b91506146ea82614522565b91506146f5826145ba565b915061470182856142b9565b915061470c82614522565b91506147178261462c565b91506147238284614384565b915061472e82614678565b915081905095945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614798602683613313565b91506147a38261473c565b604082019050919050565b600060208201905081810360008301526147c78161478b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614804602083613313565b915061480f826147ce565b602082019050919050565b60006020820190508181036000830152614833816147f7565b9050919050565b7f6e6f74206120726f79616c747920706179656500000000000000000000000000600082015250565b6000614870601383613313565b915061487b8261483a565b602082019050919050565b6000602082019050818103600083015261489f81614863565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006148cd826148a6565b6148d781856148b1565b93506148e7818560208601613324565b6148f081613357565b840191505092915050565b600060808201905061491060008301876134e0565b61491d60208301866134e0565b61492a60408301856136f4565b818103606083015261493c81846148c2565b905095945050505050565b60008151905061495681613279565b92915050565b60006020828403121561497257614971613243565b5b600061498084828501614947565b91505092915050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006149bf602083613313565b91506149ca82614989565b602082019050919050565b600060208201905081810360008301526149ee816149b2565b905091905056fea264697066735822122071b90a0a8de4fb16c1dcaddc5c1a125e370012f94a33996e966586c745b281a664736f6c63430008090033

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

0000000000000000000000006c5a06ae6b773457480c12f12c2fb22627507a3a00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000174372756465426f726e65204a656c6c7920426162696573000000000000000000000000000000000000000000000000000000000000000000000000000000000843422e4a454c4c59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000066f3794178997a12779527b36a2f042e001625af0000000000000000000000005d5ee1d6b3c12b07519020b0b14a495d518be78d000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000005dc0000000000000000000000000000000000000000000000000000000000002134

-----Decoded View---------------
Arg [0] : _cbeAddy (address): 0x6C5a06AE6b773457480c12F12C2fB22627507A3A
Arg [1] : _name (string): CrudeBorne Jelly Babies
Arg [2] : _symbol (string): CB.JELLY
Arg [3] : _payees (address[]): 0x66F3794178997a12779527B36a2F042e001625aF,0x5d5EE1d6b3C12b07519020b0B14A495d518be78D
Arg [4] : _basisPoints (uint128[]): 1500,8500

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 0000000000000000000000006c5a06ae6b773457480c12f12c2fb22627507a3a
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [6] : 4372756465426f726e65204a656c6c7920426162696573000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [8] : 43422e4a454c4c59000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [10] : 00000000000000000000000066f3794178997a12779527b36a2f042e001625af
Arg [11] : 0000000000000000000000005d5ee1d6b3c12b07519020b0b14a495d518be78d
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [13] : 00000000000000000000000000000000000000000000000000000000000005dc
Arg [14] : 0000000000000000000000000000000000000000000000000000000000002134


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.