ETH Price: $3,272.10 (-4.06%)
Gas: 8 Gwei

Contract

0x7a86a2C5bB5094584a40Ac10796CE0E6b9cbbbd0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Set Approval For...202046072024-06-30 12:49:353 days ago1719751775IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.000144632.43558648
Set Approval For...196098772024-04-08 8:51:3586 days ago1712566295IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.0010524317.69772552
Set Approval For...193514632024-03-03 1:49:11122 days ago1709430551IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.0022776438.30102182
Set Approval For...192073762024-02-11 21:05:47142 days ago1707685547IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.00150525.30816446
Set Approval For...192072982024-02-11 20:49:59142 days ago1707684599IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.0017788129.91258663
Set Approval For...191215782024-01-30 20:02:35155 days ago1706644955IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.0021839436.72533584
Set Approval For...190867302024-01-25 22:52:35159 days ago1706223155IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.001316122.13166324
Set Approval For...190569452024-01-21 18:11:11164 days ago1705860671IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.0009104715.31065322
Set Approval For...189949852024-01-13 2:27:11172 days ago1705112831IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.0005283714.10081196
Set Approval For...189072182023-12-31 18:22:59185 days ago1704046979IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.0010220717.18726368
Set Approval For...189038332023-12-31 6:59:23185 days ago1704005963IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.0007138512.00424997
Set Approval For...189010002023-12-30 21:27:35185 days ago1703971655IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.0009514516.02228292
Set Approval For...188710302023-12-26 16:21:59190 days ago1703607719IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.001691528.45020076
Set Approval For...188403922023-12-22 9:08:11194 days ago1703236091IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.002266638.12303365
Set Approval For...186176402023-11-21 4:03:47225 days ago1700539427IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.0016481927.72169128
Set Approval For...185702472023-11-14 12:49:23232 days ago1699966163IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.0019129332.21349693
Set Approval For...184054552023-10-22 11:11:11255 days ago1697973071IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.000391486.59254218
Set Approval For...184054412023-10-22 11:08:23255 days ago1697972903IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.000384026.46698491
Set Approval For...184053982023-10-22 10:59:47255 days ago1697972387IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.000388346.53971724
Set Approval For...183817192023-10-19 3:31:11258 days ago1697686271IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.000370046.23147301
Set Approval For...176092672023-07-02 22:22:35366 days ago1688336555IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.0007857613.22688613
Set Approval For...173797892023-05-31 15:37:35399 days ago1685547455IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.0026632744.7857257
Set Approval For...169788052023-04-04 23:38:11455 days ago1680651491IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.0015786226.57301491
Transfer From169703462023-04-03 18:43:59457 days ago1680547439IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.0025391346.45231835
Safe Transfer Fr...169566912023-04-01 20:32:23459 days ago1680381143IN
0x7a86a2C5...6b9cbbbd0
0 ETH0.001119717.84680182
View all transactions

Latest 2 internal transactions

Advanced mode:
Parent Transaction Hash Block From To Value
165886022023-02-09 3:46:11510 days ago1675914371
0x7a86a2C5...6b9cbbbd0
124.475 ETH
165164632023-01-30 1:49:59520 days ago1675043399
0x7a86a2C5...6b9cbbbd0
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MeatKitesMaker

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-30
*/

// SPDX-License-Identifier: VPL - VIRAL PUBLIC LICENSE
pragma solidity ^0.8.13;

/*

MMMMMMMM               MMMMMMMMEEEEEEEEEEEEEEEEEEEEEE               AAA         TTTTTTTTTTTTTTTTTTTTTTT     
M:::::::M             M:::::::ME::::::::::::::::::::E              A:::A        T:::::::::::::::::::::T     
M::::::::M           M::::::::ME::::::::::::::::::::E             A:::::A       T:::::::::::::::::::::T     
M:::::::::M         M:::::::::MEE::::::EEEEEEEEE::::E            A:::::::A      T:::::TT:::::::TT:::::T     
M::::::::::M       M::::::::::M  E:::::E       EEEEEE           A:::::::::A     TTTTTT  T:::::T  TTTTTT     
M:::::::::::M     M:::::::::::M  E:::::E                       A:::::A:::::A            T:::::T               
M:::::::M::::M   M::::M:::::::M  E::::::EEEEEEEEEE            A:::::A A:::::A           T:::::T               
M::::::M M::::M M::::M M::::::M  E:::::::::::::::E           A:::::A   A:::::A          T:::::T               
M::::::M  M::::M::::M  M::::::M  E:::::::::::::::E          A:::::A     A:::::A         T:::::T               
M::::::M   M:::::::M   M::::::M  E::::::EEEEEEEEEE         A:::::AAAAAAAAA:::::A        T:::::T               
M::::::M    M:::::M    M::::::M  E:::::E                  A:::::::::::::::::::::A       T:::::T               
M::::::M     MMMMM     M::::::M  E:::::E       EEEEEE    A:::::AAAAAAAAAAAAA:::::A      T:::::T             
M::::::M               M::::::MEE::::::EEEEEEEE:::::E   A:::::A             A:::::A   TT:::::::TT           
M::::::M               M::::::ME::::::::::::::::::::E  A:::::A               A:::::A  T:::::::::T           
M::::::M               M::::::ME::::::::::::::::::::E A:::::A                 A:::::A T:::::::::T           
MMMMMMMM               MMMMMMMMEEEEEEEEEEEEEEEEEEEEEEAAAAAAA                   AAAAAAATTTTTTTTTTT           
                                                                                                                                                                                                          
               KKKKKKKKK    KKKKKKKIIIIIIIIIITTTTTTTTTTTTTTTTTTTTTTTEEEEEEEEEEEEEEEEEEEEEE   SSSSSSSSSSSSSSS 
              K:::::::K    K:::::KI::::::::IT:::::::::::::::::::::TE::::::::::::::::::::E SS:::::::::::::::S
             K:::::::K    K:::::KI::::::::IT:::::::::::::::::::::TE::::::::::::::::::::ES:::::SSSSSS::::::S
            K:::::::K   K::::::KII::::::IIT:::::TT:::::::TT:::::TEE::::::EEEEEEEEE::::ES:::::S     SSSSSSS
           KK::::::K  K:::::KKK  I::::I  TTTTTT  T:::::T  TTTTTT  E:::::E       EEEEEES:::::S            
            K:::::K K:::::K     I::::I          T:::::T          E:::::E             S:::::S            
           K::::::K:::::K      I::::I          T:::::T          E::::::EEEEEEEEEE    S::::SSSS         
          K:::::::::::K       I::::I          T:::::T          E:::::::::::::::E     SS::::::SSSSS    
         K:::::::::::K       I::::I          T:::::T          E:::::::::::::::E       SSS::::::::SS  
        K::::::K:::::K      I::::I          T:::::T          E::::::EEEEEEEEEE          SSSSSS::::S 
       K:::::K K:::::K     I::::I          T:::::T          E:::::E                         S:::::S
    KK::::::K  K:::::KKK  I::::I          T:::::T          E:::::E       EEEEEE            S:::::S
   K:::::::K   K::::::KII::::::II      TT:::::::TT      EE::::::EEEEEEEE:::::ESSSSSSS     S:::::S
  K:::::::K    K:::::KI::::::::I      T:::::::::T      E::::::::::::::::::::ES::::::SSSSSS:::::S
 K:::::::K    K:::::KI::::::::I      T:::::::::T      E::::::::::::::::::::ES:::::::::::::::SS 
KKKKKKKKK    KKKKKKKIIIIIIIIII      TTTTTTTTTTT      EEEEEEEEEEEEEEEEEEEEEE SSSSSSSSSSSSSSS   

       meatkites.xyz | twitter.com/no_side666
    
       The most exotic pets generated entirely 'in-chain'.

                                                            
                                                                              (copyleft) 2023 VPL no_side666

*/

/// @notice Library to encode strings in Base64.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/Base64.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/Base64.sol)
/// @author Modified from (https://github.com/Brechtpd/base64/blob/main/base64.sol) by Brecht Devos - <[email protected]>.
library Base64 {
    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// See: https://datatracker.ietf.org/doc/html/rfc4648
    /// @param fileSafe  Whether to replace '+' with '-' and '/' with '_'.
    /// @param noPadding Whether to strip away the padding.
    function encode(bytes memory data, bool fileSafe, bool noPadding)
        internal
        pure
        returns (string memory result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            for { let dataLength := mload(data) } dataLength {} {
                // Multiply by 4/3 rounded up.
                // The `shl(2, ...)` is equivalent to multiplying by 4.
                let encodedLength := shl(2, div(add(dataLength, 2), 3))

                // Set `result` to point to the start of the free memory.
                result := mload(0x40)

                // Store the table into the scratch space.
                // Offsetted by -1 byte so that the `mload` will load the character.
                // We will rewrite the free memory pointer at `0x40` later with
                // the allocated size.
                // The magic constant 0x0230 will translate "-_" + "+/".
                mstore(0x1f, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef")
                mstore(0x3f, sub("ghijklmnopqrstuvwxyz0123456789-_", mul(iszero(fileSafe), 0x0230)))

                // Skip the first slot, which stores the length.
                let ptr := add(result, 0x20)
                let end := add(ptr, encodedLength)

                // Run over the input, 3 bytes at a time.
                for {} 1 {} {
                    data := add(data, 3) // Advance 3 bytes.
                    let input := mload(data)

                    // Write 4 bytes. Optimized for fewer stack operations.
                    mstore8(ptr, mload(and(shr(18, input), 0x3F)))
                    mstore8(add(ptr, 1), mload(and(shr(12, input), 0x3F)))
                    mstore8(add(ptr, 2), mload(and(shr(6, input), 0x3F)))
                    mstore8(add(ptr, 3), mload(and(input, 0x3F)))

                    ptr := add(ptr, 4) // Advance 4 bytes.

                    if iszero(lt(ptr, end)) { break }
                }

                // Allocate the memory for the string.
                // Add 31 and mask with `not(31)` to round the
                // free memory pointer up the next multiple of 32.
                mstore(0x40, and(add(end, 31), not(31)))

                let r := mod(dataLength, 3)

                if iszero(noPadding) {
                    // Offset `ptr` and pad with '='. We can simply write over the end.
                    mstore8(sub(ptr, iszero(iszero(r))), 0x3d) // Pad at `ptr - 1` if `r > 0`.
                    mstore8(sub(ptr, shl(1, eq(r, 1))), 0x3d) // Pad at `ptr - 2` if `r == 1`.
                    // Write the length of the string.
                    mstore(result, encodedLength)
                    break
                }
                // Write the length of the string.
                mstore(result, sub(encodedLength, add(iszero(iszero(r)), eq(r, 1))))
                break
            }
        }
    }

    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// Equivalent to `encode(data, false, false)`.
    function encode(bytes memory data) internal pure returns (string memory result) {
        result = encode(data, false, false);
    }

    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// Equivalent to `encode(data, fileSafe, false)`.
    function encode(bytes memory data, bool fileSafe)
        internal
        pure
        returns (string memory result)
    {
        result = encode(data, fileSafe, false);
    }

    /// @dev Encodes base64 encoded `data`.
    ///
    /// Supports:
    /// - RFC 4648 (both standard and file-safe mode).
    /// - RFC 3501 (63: ',').
    ///
    /// Does not support:
    /// - Line breaks.
    ///
    /// Note: For performance reasons,
    /// this function will NOT revert on invalid `data` inputs.
    /// Outputs for invalid inputs will simply be undefined behaviour.
    /// It is the user's responsibility to ensure that the `data`
    /// is a valid base64 encoded string.
    function decode(string memory data) internal pure returns (bytes memory result) {
        /// @solidity memory-safe-assembly
        assembly {
            let dataLength := mload(data)

            if dataLength {
                let end := add(data, dataLength)
                let decodedLength := mul(shr(2, dataLength), 3)

                for {} 1 {} {
                    // If padded.
                    if iszero(and(dataLength, 3)) {
                        let t := xor(mload(end), 0x3d3d)
                        // forgefmt: disable-next-item
                        decodedLength := sub(
                            decodedLength,
                            add(iszero(byte(30, t)), iszero(byte(31, t)))
                        )
                        break
                    }
                    // If non-padded.
                    decodedLength := add(decodedLength, sub(and(dataLength, 3), 1))
                    break
                }
                result := mload(0x40)

                // Write the length of the string.
                mstore(result, decodedLength)

                // Skip the first slot, which stores the length.
                let ptr := add(result, 0x20)

                // Load the table into the scratch space.
                // Constants are optimized for smaller bytecode with zero gas overhead.
                // `m` also doubles as the mask of the upper 6 bits.
                let m := 0xfc000000fc00686c7074787c8084888c9094989ca0a4a8acb0b4b8bcc0c4c8cc
                mstore(0x5b, m)
                mstore(0x3b, 0x04080c1014181c2024282c3034383c4044484c5054585c6064)
                mstore(0x1a, 0xf8fcf800fcd0d4d8dce0e4e8ecf0f4)

                for {} 1 {} {
                    // Read 4 bytes.
                    data := add(data, 4)
                    let input := mload(data)

                    // Write 3 bytes.
                    // forgefmt: disable-next-item
                    mstore(ptr, or(
                        and(m, mload(byte(28, input))),
                        shr(6, or(
                            and(m, mload(byte(29, input))),
                            shr(6, or(
                                and(m, mload(byte(30, input))),
                                shr(6, mload(byte(31, input)))
                            ))
                        ))
                    ))

                    ptr := add(ptr, 3)

                    if iszero(lt(data, end)) { break }
                }

                // Allocate the memory for the string.
                // Add 32 + 31 and mask with `not(31)` to round the
                // free memory pointer up the next multiple of 32.
                mstore(0x40, and(add(add(result, decodedLength), 63), not(31)))

                // Restore the zero slot.
                mstore(0x60, 0)
            }
        }
    }
}

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

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

/**
 * @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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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);
}

/// @notice Read and write to persistent storage at a fraction of the cost.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SSTORE2.sol)
/// @author Modified from 0xSequence (https://github.com/0xSequence/sstore2/blob/master/contracts/SSTORE2.sol)
library SSTORE2 {
    error SSTORE2_DEPLOYMENT_FAILED();
    error SSTORE2_READ_OUT_OF_BOUNDS();

    // We skip the first byte as it's a STOP opcode to ensure the contract can't be called.
    uint256 internal constant DATA_OFFSET = 1;

    /*//////////////////////////////////////////////////////////////
                               WRITE LOGIC
    //////////////////////////////////////////////////////////////*/

    function write(bytes memory data) internal returns (address pointer) {
        // Note: The assembly block below does not expand the memory.
        assembly {
            let originalDataLength := mload(data)

            // Add 1 to data size since we are prefixing it with a STOP opcode.
            let dataSize := add(originalDataLength, 1)

            /**
             * ------------------------------------------------------------------------------------+
             *   Opcode  | Opcode + Arguments  | Description       | Stack View                    |
             * ------------------------------------------------------------------------------------|
             *   0x61    | 0x61XXXX            | PUSH2 codeSize    | codeSize                      |
             *   0x80    | 0x80                | DUP1              | codeSize codeSize             |
             *   0x60    | 0x600A              | PUSH1 10          | 10 codeSize codeSize          |
             *   0x3D    | 0x3D                | RETURNDATASIZE    | 0 10 codeSize codeSize        |
             *   0x39    | 0x39                | CODECOPY          | codeSize                      |
             *   0x3D    | 0x3D                | RETURNDATASZIE    | 0 codeSize                    |
             *   0xF3    | 0xF3                | RETURN            |                               |
             *   0x00    | 0x00                | STOP              |                               |
             * ------------------------------------------------------------------------------------+
             * @dev Prefix the bytecode with a STOP opcode to ensure it cannot be called. Also PUSH2 is
             * used since max contract size cap is 24,576 bytes which is less than 2 ** 16.
             */
            mstore(
                data,
                or(
                    0x61000080600a3d393df300,
                    shl(64, dataSize) // shift `dataSize` so that it lines up with the 0000 after PUSH2
                )
            )

            // Deploy a new contract with the generated creation code.
            pointer := create(0, add(data, 21), add(dataSize, 10))

            // Restore original length of the variable size `data`
            mstore(data, originalDataLength)
        }

        if (pointer == address(0)) {
            revert SSTORE2_DEPLOYMENT_FAILED();
        }
    }

    /*//////////////////////////////////////////////////////////////
                               READ LOGIC
    //////////////////////////////////////////////////////////////*/

    function read(address pointer) internal view returns (bytes memory) {
        return readBytecode(pointer, DATA_OFFSET, pointer.code.length - DATA_OFFSET);
    }

    function read(address pointer, uint256 start) internal view returns (bytes memory) {
        start += DATA_OFFSET;

        return readBytecode(pointer, start, pointer.code.length - start);
    }

    function read(
        address pointer,
        uint256 start,
        uint256 end
    ) internal view returns (bytes memory) {
        start += DATA_OFFSET;
        end += DATA_OFFSET;

        if (pointer.code.length < end) {
            revert SSTORE2_READ_OUT_OF_BOUNDS();
        }

        return readBytecode(pointer, start, end - start);
    }

    /*//////////////////////////////////////////////////////////////
                          INTERNAL HELPER LOGIC
    //////////////////////////////////////////////////////////////*/

    function readBytecode(
        address pointer,
        uint256 start,
        uint256 size
    ) private view returns (bytes memory data) {
        assembly {
            // Get a pointer to some free memory.
            data := mload(0x40)

            // Update the free memory pointer to prevent overriding our data.
            // We use and(x, not(31)) as a cheaper equivalent to sub(x, mod(x, 32)).
            // Adding 63 (32 + 31) to size and running the result through the logic
            // above ensures the memory pointer remains word-aligned, following
            // the Solidity convention.
            mstore(0x40, add(data, and(add(size, 63), not(31))))

            // Store the size of the data in the first 32 byte chunk of free memory.
            mstore(data, size)

            // Copy the code into memory right after the 32 bytes we used to store the size.
            extcodecopy(pointer, add(data, 32), start, size)
        }
    }
}

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

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

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

// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.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;
    }
}

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _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) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

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

abstract contract MarketWares is ERC2981, Ownable {

    address immutable private _tokenImagePtr;

    address immutable private _royaltyReceiver;

    constructor(bytes memory bTokenImage) Ownable() {
        _royaltyReceiver = owner();
        _setDefaultRoyalty(_royaltyReceiver, 500); // ERC2981 5% royalty on secondary sales
        _tokenImagePtr = SSTORE2.write(bTokenImage);
    }
      
    // needed for opensea
    function contractURI() public view returns(string memory) {
        return string(abi.encodePacked(
                  "data:application/json;base64,", 
                  Base64.encode(abi.encodePacked("{\"name\": \"MeatKites\","
                       " \"description\": \"The most exotic pets generated entirely 'in-chain'. meatkites.xyz | twitter.com/no_side666\","
                       " \"image\": \"", 
                       "data:image/svg+xml;base64,",
                       Base64.encode(SSTORE2.read(_tokenImagePtr)), 
                       "\",",
                       " \"seller_fee_basis_points:\": \"500\","
                       " \"fee_recipient\": \"", Strings.toHexString(_royaltyReceiver) ,"\"}"))));
    }

    function sendETH() external {
        (bool success,) = owner().call{value: address(this).balance}("");
        require(success, "call failed.");
    }
}

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /*//////////////////////////////////////////////////////////////
                         METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*//////////////////////////////////////////////////////////////
                      ERC721 BALANCE/OWNER STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) internal _ownerOf;

    mapping(address => uint256) internal _balanceOf;

    function ownerOf(uint256 id) public view virtual returns (address owner) {
        require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        require(owner != address(0), "ZERO_ADDRESS");

        return _balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                         ERC721 APPROVAL STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*//////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = _ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == _ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _balanceOf[from]--;

            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*//////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(_ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

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

    function _burn(uint256 id) internal virtual {
        address owner = _ownerOf[id];

        require(owner != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            _balanceOf[owner]--;
        }

        delete _ownerOf[id];

        delete getApproved[id];

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

    /*//////////////////////////////////////////////////////////////
                        INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }
}

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

abstract contract OperatorFilteredERC721 is ERC721, DefaultOperatorFilterer {

    constructor(
        string memory name_,
        string memory symbol_
    ) ERC721(name_, symbol_) {}

    // overrides for DefaultOperatorFilterer, which enables creator fees on opensea

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

interface IRenderer {
    function renderAttributes(uint256 tokenId) external view returns(string memory);
    function renderSVG(uint256 tokenId) external view returns(string memory);
}

contract MeatKitesMaker is OperatorFilteredERC721, MarketWares {
    
    uint256 public totalSupply;
    // qty's
    uint256 constant public FREE_MINT = 100;
    uint256 constant public PEOPLE_PRICES_MINT = 300;
    uint256 constant public MAX_SUPPLY = 2222;

    // prices
    uint256 constant public PEOPLE_PRICE = 0.01 ether;
    uint256 constant public WANKER_PRICE = 0.1 ether;

    uint256 public publicMintDate;

    IRenderer internal _renderer;

    constructor(address renderer_, bytes memory bTokenImage) OperatorFilteredERC721("MKs", "MeatKites") MarketWares(bTokenImage) {

        _renderer = IRenderer(renderer_);
    }

    function mint(address to) external payable returns(uint256 lastTokenId) {
        return _mintTo({to: to, discounted: false});
    }

    function mintDiscounted(address to) external payable returns(uint256 lastTokenId) {
        return _mintTo({to: to, discounted: callerOwnsSweetNFTs()}); 
    }

    function publicMintActive() public view returns(bool) {
        uint256 _publicMintDate = publicMintDate;
        return (_publicMintDate != 0) && (block.timestamp > _publicMintDate);
    }

    function currentPrice() external view returns(uint256) {
        return _currentPrice({totalSupply_: totalSupply, discounted: false});
    }

    function currentDiscountedPrice() external view returns(uint256) {
        return _currentPrice({
                  totalSupply_: totalSupply, 
                  discounted: callerOwnsSweetNFTs()});
    }

    function callerOwnsSweetNFTs() public view returns(bool isCoolOwner) {
        IERC721[4] memory coolNFTs = [
            IERC721(address(0x5078981549A1CC18673eb76fb47468f546aAdc51)), // FEETPIX wtf 
            IERC721(address(0xeF1a89cbfAbE59397FfdA11Fc5DF293E9bC5Db90)), // BASED GHOULS
            IERC721(address(0x5Af0D9827E0c53E4799BB226655A1de152A425a5)), // MILADY MAKER 
            IERC721(address(0x5DcE0bB0778694Ef3Ba79Bb702b88CAC1879cc7D))]; // bonSAI NFT
        for (uint256 i; i < coolNFTs.length; ++i) {
            if ((coolNFTs[i]).balanceOf(msg.sender) > 0) {
                isCoolOwner = true;
                break;
            } 
        }        
    }
    

    function tokenURI(uint256 tokenId) public view override returns(string memory) {

        require(tokenId < totalSupply, "tokenId dne.");
        string memory attributes = _renderer.renderAttributes(tokenId);
        assembly { // delete last comma
            mstore(attributes, sub(mload(attributes), 1))
        }

        return string(abi.encodePacked(
          "data:application/json;base64,", 
          Base64.encode(abi.encodePacked(
            "{\"name\":\"MeatKites ", Strings.toString(tokenId),
            "\", \"description\":\"the most exotic in-chain pets",
            "\", \"attributes\":[", attributes,
            "], \"image\":\"data:image/svg+xml;base64,", 
            Base64.encode(bytes(_renderer.renderSVG(tokenId))),
            "\"}"
        ))));
    }

    function renderSVG(uint256 tokenId) external view virtual returns(string memory) {
        require(tokenId < totalSupply, "tokenId dne.");
        return string(Base64.encode(bytes(_renderer.renderSVG(tokenId))));
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || 
               interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
               interfaceId == 0x5b5e139f || // ERC165 Interface ID for ERC721Metadata
               super.supportsInterface(interfaceId);
    }

    // priveledged fns
    
    function setPublicMintDate(uint256 publicMintDate_) external onlyOwner virtual {
        require(publicMintDate == 0, "can only set once.");
        publicMintDate = publicMintDate_;
    }

    // internal/private fns
    
    function _mintTo(address to, bool discounted) private returns(uint256 lastTokenId) {
        require(publicMintActive() || msg.sender == owner(), "!publicMintActive.");
        uint256 tokenId = totalSupply;
        uint256 currentPrice_ = _currentPrice({totalSupply_: tokenId, discounted: discounted});
        unchecked{
        uint256 qty = (currentPrice_ > 0) ? msg.value / currentPrice_ : 1;
        // means freeMint is qty=1 at a time
        _checkQty(qty, tokenId);
        for (uint256 i; i < qty; ++i) {
            _mint(to, tokenId++); 
        }
        lastTokenId = tokenId;
        totalSupply = lastTokenId;
        }//uc all math here safe
    }

    function _currentPrice(uint256 totalSupply_, bool discounted) private pure returns(uint256){
        unchecked{
        uint256 divisor = (discounted) ? 2 : 1;
        uint256[3] memory checkpoints = [FREE_MINT, PEOPLE_PRICES_MINT, MAX_SUPPLY];
        if (totalSupply_ < checkpoints[0]) {
            return 0; // free 
        } else if (totalSupply_ < checkpoints[1]) {
            return PEOPLE_PRICE / divisor;
        }
        return WANKER_PRICE / divisor;
        }//uc
    }

    function _checkQty(uint256 desiredQty, uint256 totalSupply_) private pure {
        require(desiredQty > 0, "msg.value must be n * currentPrice().");
        // this crosses over interval boundary thankfully
        unchecked{
        uint256 sum = desiredQty + totalSupply_; // won't overflow due to scarcity of eth and max supply
        require(sum <= MAX_SUPPLY, "all tokens minted.");
        if (desiredQty == 1) return; 
        uint256[3] memory checkpoints = [FREE_MINT, PEOPLE_PRICES_MINT, MAX_SUPPLY];
        bool inDifferentIntervals;
        for (uint256 i; i < checkpoints.length; ++i) {
            if ((totalSupply_ < checkpoints[i]) != (sum <= checkpoints[i])) {
                inDifferentIntervals = true;
                break;
            }
        }
        require(!inDifferentIntervals, "qty out of range.");
        }//uc
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"renderer_","type":"address"},{"internalType":"bytes","name":"bTokenImage","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"SSTORE2_DEPLOYMENT_FAILED","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FREE_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PEOPLE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PEOPLE_PRICES_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WANKER_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callerOwnsSweetNFTs","outputs":[{"internalType":"bool","name":"isCoolOwner","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDiscountedPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"lastTokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mintDiscounted","outputs":[{"internalType":"uint256","name":"lastTokenId","type":"uint256"}],"stateMutability":"payable","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":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"renderSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":[],"name":"sendETH","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":"uint256","name":"publicMintDate_","type":"uint256"}],"name":"setPublicMintDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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"}]

60c06040523480156200001157600080fd5b5060405162002cbd38038062002cbd833981016040819052620000349162000441565b80604051806040016040528060038152602001624d4b7360e81b815250604051806040016040528060098152602001684d6561744b6974657360b81b815250733cc6cdda760b79bafa08df41ecfa224f810dceb66001838381600090816200009d9190620005c6565b506001620000ac8282620005c6565b5050506daaeb6d7670e522a718067333cd4e3b15620001f45780156200014257604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200012357600080fd5b505af115801562000138573d6000803e3d6000fd5b50505050620001f4565b6001600160a01b03821615620001935760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000108565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001da57600080fd5b505af1158015620001ef573d6000803e3d6000fd5b505050505b50505050620002126200020c6200027760201b60201c565b6200027b565b6008546001600160a01b031660a081905262000231906101f4620002cd565b6200024781620003d260201b62000efe1760201c565b6001600160a01b03908116608052600b80546001600160a01b031916949091169390931790925550620006929050565b3390565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115620003415760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620003995760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640162000338565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600655565b60008151600181018060401b6a61000080600a3d393df300178452600a8101601585016000f09184525090506001600160a01b0381166200042657604051632da4836960e21b815260040160405180910390fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200045557600080fd5b82516001600160a01b03811681146200046d57600080fd5b602084810151919350906001600160401b03808211156200048d57600080fd5b818601915086601f830112620004a257600080fd5b815181811115620004b757620004b76200042b565b604051601f8201601f19908116603f01168101908382118183101715620004e257620004e26200042b565b816040528281528986848701011115620004fb57600080fd5b600093505b828410156200051f578484018601518185018701529285019262000500565b60008684830101528096505050505050509250929050565b600181811c908216806200054c57607f821691505b6020821081036200056d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620005c157600081815260208120601f850160051c810160208610156200059c5750805b601f850160051c820191505b81811015620005bd57828155600101620005a8565b5050505b505050565b81516001600160401b03811115620005e257620005e26200042b565b620005fa81620005f3845462000537565b8462000573565b602080601f831160018114620006325760008415620006195750858301515b600019600386901b1c1916600185901b178555620005bd565b600085815260208120601f198616915b82811015620006635788860151825594840194600190910190840162000642565b5085821015620006825787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051612605620006b86000396000610e2f01526000610e0601526126056000f3fe6080604052600436106102045760003560e01c80636352211e11610118578063b67c25a3116100a0578063db065b1d1161006f578063db065b1d146105a9578063dd18964a146105be578063e8a3d485146105da578063e985e9c5146105ef578063f2fde38b1461062a57600080fd5b8063b67c25a314610534578063b88d4fde14610549578063c87b56dd14610569578063d12a4c981461058957600080fd5b80638da5cb5b116100e75780638da5cb5b146104b957806395d89b41146104d75780639d1b464a146104ec578063a22cb46514610501578063ae4229881461052157600080fd5b80636352211e146104515780636a6278421461047157806370a0823114610484578063715018a6146104a457600080fd5b80631d16d9a01161019b57806332cb6b0c1161016a57806332cb6b0c146103ce578063381679ae146103e457806341f43434146103f957806342842e0e1461041b57806352af43d11461043b57600080fd5b80631d16d9a01461033a5780631ee34fab1461034f57806323b872dd1461036f5780632a55205a1461038f57600080fd5b8063081812fc116101d7578063081812fc1461029f578063095ea7b3146102ed5780630c69a2741461030f57806318160ddd1461032457600080fd5b8063016f19a51461020957806301ffc9a71461023757806306fdde0314610267578063074a130d14610289575b600080fd5b34801561021557600080fd5b50610224662386f26fc1000081565b6040519081526020015b60405180910390f35b34801561024357600080fd5b50610257610252366004611e46565b61064a565b604051901515815260200161022e565b34801561027357600080fd5b5061027c6106ab565b60405161022e9190611e87565b34801561029557600080fd5b50610224600a5481565b3480156102ab57600080fd5b506102d56102ba366004611eba565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161022e565b3480156102f957600080fd5b5061030d610308366004611eea565b610739565b005b34801561031b57600080fd5b50610224610752565b34801561033057600080fd5b5061022460095481565b34801561034657600080fd5b5061030d61076c565b34801561035b57600080fd5b5061030d61036a366004611eba565b610817565b34801561037b57600080fd5b5061030d61038a366004611f14565b610869565b34801561039b57600080fd5b506103af6103aa366004611f50565b610894565b604080516001600160a01b03909316835260208301919091520161022e565b3480156103da57600080fd5b506102246108ae81565b3480156103f057600080fd5b50610257610940565b34801561040557600080fd5b506102d56daaeb6d7670e522a718067333cd4e81565b34801561042757600080fd5b5061030d610436366004611f14565b610a65565b34801561044757600080fd5b5061022461012c81565b34801561045d57600080fd5b506102d561046c366004611eba565b610a8a565b61022461047f366004611f72565b610ae1565b34801561049057600080fd5b5061022461049f366004611f72565b610aee565b3480156104b057600080fd5b5061030d610b51565b3480156104c557600080fd5b506008546001600160a01b03166102d5565b3480156104e357600080fd5b5061027c610b65565b3480156104f857600080fd5b50610224610b72565b34801561050d57600080fd5b5061030d61051c366004611f9b565b610b81565b61022461052f366004611f72565b610b95565b34801561054057600080fd5b50610257610ba8565b34801561055557600080fd5b5061030d610564366004611fd2565b610bc2565b34801561057557600080fd5b5061027c610584366004611eba565b610bf1565b34801561059557600080fd5b5061027c6105a4366004611eba565b610d84565b3480156105b557600080fd5b50610224606481565b3480156105ca57600080fd5b5061022467016345785d8a000081565b3480156105e657600080fd5b5061027c610df9565b3480156105fb57600080fd5b5061025761060a36600461206d565b600560209081526000928352604080842090915290825290205460ff1681565b34801561063657600080fd5b5061030d610645366004611f72565b610e88565b60006001600160e01b0319821663152a902d60e11b148061067b57506380ac58cd60e01b6001600160e01b03198316145b806106965750635b5e139f60e01b6001600160e01b03198316145b806106a557506106a582610f51565b92915050565b600080546106b8906120a0565b80601f01602080910402602001604051908101604052809291908181526020018280546106e4906120a0565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b505050505081565b8161074381610f86565b61074d838361103f565b505050565b6000610767600954610762610940565b611121565b905090565b60006107806008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146107ca576040519150601f19603f3d011682016040523d82523d6000602084013e6107cf565b606091505b50509050806108145760405162461bcd60e51b815260206004820152600c60248201526b31b0b636103330b4b632b21760a11b60448201526064015b60405180910390fd5b50565b61081f6111bb565b600a54156108645760405162461bcd60e51b815260206004820152601260248201527131b0b71037b7363c9039b2ba1037b731b29760711b604482015260640161080b565b600a55565b826001600160a01b03811633146108835761088333610f86565b61088e848484611215565b50505050565b60008281526007602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916109095750604080518082019091526006546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610928906001600160601b0316876120f0565b610932919061211d565b915196919550909350505050565b60408051608081018252735078981549a1cc18673eb76fb47468f546aadc51815273ef1a89cbfabe59397ffda11fc5df293e9bc5db906020820152735af0d9827e0c53e4799bb226655a1de152a425a591810191909152735dce0bb0778694ef3ba79bb702b88cac1879cc7d6060820152600090815b6004811015610a605760008282600481106109d3576109d361213f565b60200201516040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a419190612155565b1115610a505760019250505090565b610a598161216e565b90506109b6565b505090565b826001600160a01b0381163314610a7f57610a7f33610f86565b61088e8484846113dc565b6000818152600260205260409020546001600160a01b031680610adc5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161080b565b919050565b60006106a58260006114cf565b60006001600160a01b038216610b355760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161080b565b506001600160a01b031660009081526003602052604090205490565b610b596111bb565b610b63600061159f565b565b600180546106b8906120a0565b60006107676009546000611121565b81610b8b81610f86565b61074d83836115f1565b60006106a582610ba3610940565b6114cf565b600a546000908015801590610bbc57508042115b91505090565b846001600160a01b0381163314610bdc57610bdc33610f86565b610be9868686868661165d565b505050505050565b60606009548210610c335760405162461bcd60e51b815260206004820152600c60248201526b3a37b5b2b724b2103237329760a11b604482015260640161080b565b600b546040516357e0286d60e11b8152600481018490526000916001600160a01b03169063afc050da90602401600060405180830381865afa158015610c7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ca5919081019061219d565b905060018151038152610d5d610cba84611745565b600b54604051631a25499360e31b8152600481018790528491610d37916001600160a01b039091169063d12a4c98906024015b600060405180830381865afa158015610d0a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d32919081019061219d565b6117d9565b604051602001610d499392919061224a565b6040516020818303038152906040526117d9565b604051602001610d6d9190612351565b604051602081830303815290604052915050919050565b60606009548210610dc65760405162461bcd60e51b815260206004820152600c60248201526b3a37b5b2b724b2103237329760a11b604482015260640161080b565b600b54604051631a25499360e31b8152600481018490526106a5916001600160a01b03169063d12a4c9890602401610ced565b6060610e64610e2a610d327f00000000000000000000000000000000000000000000000000000000000000006117e7565b610e537f0000000000000000000000000000000000000000000000000000000000000000611808565b604051602001610d49929190612396565b604051602001610e749190612351565b604051602081830303815290604052905090565b610e906111bb565b6001600160a01b038116610ef55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161080b565b6108148161159f565b60008151600181018060401b6a61000080600a3d393df300178452600a8101601585016000f09184525090506001600160a01b038116610adc57604051632da4836960e21b815260040160405180910390fd5b60006001600160e01b0319821663152a902d60e11b14806106a557506301ffc9a760e01b6001600160e01b03198316146106a5565b6daaeb6d7670e522a718067333cd4e3b1561081457604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110179190612504565b61081457604051633b79c77360e21b81526001600160a01b038216600482015260240161080b565b6000818152600260205260409020546001600160a01b03163381148061108857506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6110c55760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161080b565b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60008082611130576001611133565b60025b60408051606081018252606480825261012c60208301526108ae9282019290925260ff92909216925085101561116e576000925050506106a5565b602081015185101561119a5781662386f26fc100008161119057611190612107565b04925050506106a5565b8167016345785d8a0000816111b1576111b1612107565b0495945050505050565b6008546001600160a01b03163314610b635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161080b565b6000818152600260205260409020546001600160a01b0384811691161461126b5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161080b565b6001600160a01b0382166112b55760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161080b565b336001600160a01b03841614806112ef57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8061131057506000818152600460205260409020546001600160a01b031633145b61134d5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161080b565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6113e7838383610869565b6001600160a01b0382163b15806114905750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114849190612521565b6001600160e01b031916145b61074d5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161080b565b60006114d9610ba8565b806114ee57506008546001600160a01b031633145b61152f5760405162461bcd60e51b815260206004820152601260248201527110b83ab13634b1a6b4b73a20b1ba34bb329760711b604482015260640161080b565b600954600061153e8285611121565b90506000808211611550576001611561565b81348161155f5761155f612107565b045b905061156d818461181e565b60005b8181101561159057611588878580600101965061198c565b600101611570565b50505060098190559392505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611668858585610869565b6001600160a01b0384163b15806116ff5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906116b09033908a9089908990899060040161253e565b6020604051808303816000875af11580156116cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f39190612521565b6001600160e01b031916145b61173e5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161080b565b5050505050565b6060600061175283611a97565b600101905060008167ffffffffffffffff81111561177257611772612187565b6040519080825280601f01601f19166020018201604052801561179c576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846117a6575b509392505050565b60606106a582600080611b6f565b60606106a5826001611803816001600160a01b0384163b612592565b611c6a565b60606106a56001600160a01b0383166014611c8d565b6000821161187c5760405162461bcd60e51b815260206004820152602560248201527f6d73672e76616c7565206d757374206265206e202a2063757272656e7450726960448201526431b294149760d91b606482015260840161080b565b8181016108ae8111156118c65760405162461bcd60e51b815260206004820152601260248201527130b636103a37b5b2b7399036b4b73a32b21760711b604482015260640161080b565b826001036118d357505050565b604080516060810182526064815261012c60208201526108ae918101919091526000805b6003811015611949578281600381106119125761191261213f565b602002015184111583826003811061192c5761192c61213f565b60200201518610146119415760019150611949565b6001016118f7565b50801561173e5760405162461bcd60e51b815260206004820152601160248201527038ba3c9037baba1037b3103930b733b29760791b604482015260640161080b565b6001600160a01b0382166119d65760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161080b565b6000818152600260205260409020546001600160a01b031615611a2c5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161080b565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611ad65772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611b02576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611b2057662386f26fc10000830492506010015b6305f5e1008310611b38576305f5e100830492506008015b6127108310611b4c57612710830492506004015b60648310611b5e576064830492506002015b600a83106106a55760010192915050565b6060835180156117d1576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526102308515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f03603f52602083018181015b6003880197508751603f8160121c16518353603f81600c1c16516001840153603f8160061c16516002840153603f811651600384015350600482019150808210611bdf57601f01601f19166040526003830685611c5357603d811515830353603d6001821460011b830353505082526117d1565b600181148115150183038552505050509392505050565b60408051603f8301601f19168101909152818152818360208301863c9392505050565b60606000611c9c8360026120f0565b611ca79060026125a5565b67ffffffffffffffff811115611cbf57611cbf612187565b6040519080825280601f01601f191660200182016040528015611ce9576020820181803683370190505b509050600360fc1b81600081518110611d0457611d0461213f565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611d3357611d3361213f565b60200101906001600160f81b031916908160001a9053506000611d578460026120f0565b611d629060016125a5565b90505b6001811115611dda576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611d9657611d9661213f565b1a60f81b828281518110611dac57611dac61213f565b60200101906001600160f81b031916908160001a90535060049490941c93611dd3816125b8565b9050611d65565b508315611e295760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161080b565b9392505050565b6001600160e01b03198116811461081457600080fd5b600060208284031215611e5857600080fd5b8135611e2981611e30565b60005b83811015611e7e578181015183820152602001611e66565b50506000910152565b6020815260008251806020840152611ea6816040850160208701611e63565b601f01601f19169190910160400192915050565b600060208284031215611ecc57600080fd5b5035919050565b80356001600160a01b0381168114610adc57600080fd5b60008060408385031215611efd57600080fd5b611f0683611ed3565b946020939093013593505050565b600080600060608486031215611f2957600080fd5b611f3284611ed3565b9250611f4060208501611ed3565b9150604084013590509250925092565b60008060408385031215611f6357600080fd5b50508035926020909101359150565b600060208284031215611f8457600080fd5b611e2982611ed3565b801515811461081457600080fd5b60008060408385031215611fae57600080fd5b611fb783611ed3565b91506020830135611fc781611f8d565b809150509250929050565b600080600080600060808688031215611fea57600080fd5b611ff386611ed3565b945061200160208701611ed3565b935060408601359250606086013567ffffffffffffffff8082111561202557600080fd5b818801915088601f83011261203957600080fd5b81358181111561204857600080fd5b89602082850101111561205a57600080fd5b9699959850939650602001949392505050565b6000806040838503121561208057600080fd5b61208983611ed3565b915061209760208401611ed3565b90509250929050565b600181811c908216806120b457607f821691505b6020821081036120d457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106a5576106a56120da565b634e487b7160e01b600052601260045260246000fd5b60008261213a57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561216757600080fd5b5051919050565b600060018201612180576121806120da565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156121af57600080fd5b815167ffffffffffffffff808211156121c757600080fd5b818401915084601f8301126121db57600080fd5b8151818111156121ed576121ed612187565b604051601f8201601f19908116603f0116810190838211818310171561221557612215612187565b8160405282815287602084870101111561222e57600080fd5b61223f836020830160208801611e63565b979650505050505050565b7203d913730b6b2911d1126b2b0ba25b4ba32b99606d1b81528351600090612279816013850160208901611e63565b7f222c20226465736372697074696f6e223a22746865206d6f73742065786f74696013918401918201526e6320696e2d636861696e207065747360881b603382015270222c202261747472696275746573223a5b60781b604282015284516122e8816053840160208901611e63565b7f5d2c2022696d616765223a22646174613a696d6167652f7376672b786d6c3b626053929091019182015265185cd94d8d0b60d21b60738201528351612335816079840160208801611e63565b61227d60f01b60799290910191820152607b0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161238981601d850160208701611e63565b91909101601d0192915050565b7f7b226e616d65223a20224d6561744b69746573222c202264657363726970746981527f6f6e223a2022546865206d6f73742065786f74696320706574732067656e657260208201527f6174656420656e746972656c792027696e2d636861696e272e206d6561746b6960408201527f7465732e78797a207c20747769747465722e636f6d2f6e6f5f7369646536363660608201526c1116101134b6b0b3b2911d101160991b60808201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000608d8201526000835161247c8160a7850160208801611e63565b61088b60f21b60a7918401918201527f202273656c6c65725f6665655f62617369735f706f696e74733a223a2022353060a98201527518111610113332b2afb932b1b4b834b2b73a111d101160511b60c982015283516124e38160df840160208801611e63565b6124fa60df8284010161227d60f01b815260020190565b9695505050505050565b60006020828403121561251657600080fd5b8151611e2981611f8d565b60006020828403121561253357600080fd5b8151611e2981611e30565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b818103818111156106a5576106a56120da565b808201808211156106a5576106a56120da565b6000816125c7576125c76120da565b50600019019056fea26469706673582212208780f5fd5ed775d1d47307fc930576a5598a557c9c3f4637e2607d1dd235815164736f6c63430008110033000000000000000000000000b7849a7c0793ae20026acc1198d6532bbd5dad7e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000fb23c7376672076657273696f6e3d22312e312220206261736550726f66696c653d2266756c6c22202020202076696577426f783d223020302031303020313030222020202020786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220202020203e3c7374796c653e202020202e7374616e64617264416e696d6174696f6e207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2033733b2020202020202020616e696d6174696f6e2d74696d696e672d66756e6374696f6e3a206c696e6561723b2020202020202020616e696d6174696f6e2d697465726174696f6e2d636f756e743a20696e66696e6974653b202020207d20202020406b65796672616d65732073797374656d4d6f74696f6e207b2020202020202020333325207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c31293b20202020202020207d2020202020202020363625207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c2d31293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e30207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e31207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e32207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d202020207d202020202e737461727473496e76697369626c65207b6f7061636974793a2030253b20202020207d2020202020202020202e636c6f75644d617373207b202020202020202066696c6c3a2077686974653b20202020207d2020202020202020202e636c6f7564416363656e74207b202020202020202066696c6c3a20233837434546413b20202020207d2020202023636c6f756430207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203330733b20616e696d6174696f6e2d64656c61793a202d33733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e303b202020207d2020202023636c6f756431207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203437733b20616e696d6174696f6e2d64656c61793a202d3331733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e313b202020207d2020202023636c6f756432207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203637733b20616e696d6174696f6e2d64656c61793a203133733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e323b202020207d202020202373797374656d207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2034733b2020202020202020616e696d6174696f6e2d6e616d653a2073797374656d4d6f74696f6e3b202020207d3c2f7374796c653e3c706174682069643d2277686974656261636b64726f702220636c6173733d22222066696c6c3d22234646464646462220643d224d3020304831303056313030483056305a22202f3e3c706174682069643d22626c7565736b792220636c6173733d22222066696c6c3d22233837434546412220643d224d3020304831303056313030483056305a22202f3e3c672069643d22636c6f7564302220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d22636c6f7564312220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373312220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d34312033335633354832385633394831365634344831325635334831365635374832385636304834305636314835355636304836355635374837335635344838315634354837335634314836355633384835355633334834315a22202f3e3c706174682069643d22636c6f7564416363656e74312220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d34362035325635354835395635314835375635324834365a22202f3e3c2f673e3c672069643d22636c6f7564322220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d2273797374656d2220636c6173733d227374616e64617264416e696d6174696f6e222066696c6c3d2222203e3c706174682069643d227469746c6554657874222066696c6c3d22626c61636b2220643d224d31312033375635304831325633384831335634304831345634324831365634304831375633384831385635304832315633374831375633384831365634304831345633384831335633374831315a204d32332033374832395633384832345634334832395634344832355634394832395635304832335633374d33332033375634344833315635304833345634344833385635304833395633374833345633384833385634334833345633374833335a4d34312033374834395633384834375635304834345633384834315633375a4d35312033374835325634324835335634314835345634304835355633394835365633384835375633374836305633384835385633394835375634304835365634314835355634334836305635304835375634344835335635304835315633375a4d36332033375634344836315635304836345633374836335a4d36352033375633384836385635304837315633384837345633374836355a4d37352033375635304838325634394837385634344838325634334837375633384838325633374837355a4d38342033375634344838395634394838365634364838345635304839305634334838355633384838395634304839305633374838345a222f3e3c2f673e3c2f7376673e0000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102045760003560e01c80636352211e11610118578063b67c25a3116100a0578063db065b1d1161006f578063db065b1d146105a9578063dd18964a146105be578063e8a3d485146105da578063e985e9c5146105ef578063f2fde38b1461062a57600080fd5b8063b67c25a314610534578063b88d4fde14610549578063c87b56dd14610569578063d12a4c981461058957600080fd5b80638da5cb5b116100e75780638da5cb5b146104b957806395d89b41146104d75780639d1b464a146104ec578063a22cb46514610501578063ae4229881461052157600080fd5b80636352211e146104515780636a6278421461047157806370a0823114610484578063715018a6146104a457600080fd5b80631d16d9a01161019b57806332cb6b0c1161016a57806332cb6b0c146103ce578063381679ae146103e457806341f43434146103f957806342842e0e1461041b57806352af43d11461043b57600080fd5b80631d16d9a01461033a5780631ee34fab1461034f57806323b872dd1461036f5780632a55205a1461038f57600080fd5b8063081812fc116101d7578063081812fc1461029f578063095ea7b3146102ed5780630c69a2741461030f57806318160ddd1461032457600080fd5b8063016f19a51461020957806301ffc9a71461023757806306fdde0314610267578063074a130d14610289575b600080fd5b34801561021557600080fd5b50610224662386f26fc1000081565b6040519081526020015b60405180910390f35b34801561024357600080fd5b50610257610252366004611e46565b61064a565b604051901515815260200161022e565b34801561027357600080fd5b5061027c6106ab565b60405161022e9190611e87565b34801561029557600080fd5b50610224600a5481565b3480156102ab57600080fd5b506102d56102ba366004611eba565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161022e565b3480156102f957600080fd5b5061030d610308366004611eea565b610739565b005b34801561031b57600080fd5b50610224610752565b34801561033057600080fd5b5061022460095481565b34801561034657600080fd5b5061030d61076c565b34801561035b57600080fd5b5061030d61036a366004611eba565b610817565b34801561037b57600080fd5b5061030d61038a366004611f14565b610869565b34801561039b57600080fd5b506103af6103aa366004611f50565b610894565b604080516001600160a01b03909316835260208301919091520161022e565b3480156103da57600080fd5b506102246108ae81565b3480156103f057600080fd5b50610257610940565b34801561040557600080fd5b506102d56daaeb6d7670e522a718067333cd4e81565b34801561042757600080fd5b5061030d610436366004611f14565b610a65565b34801561044757600080fd5b5061022461012c81565b34801561045d57600080fd5b506102d561046c366004611eba565b610a8a565b61022461047f366004611f72565b610ae1565b34801561049057600080fd5b5061022461049f366004611f72565b610aee565b3480156104b057600080fd5b5061030d610b51565b3480156104c557600080fd5b506008546001600160a01b03166102d5565b3480156104e357600080fd5b5061027c610b65565b3480156104f857600080fd5b50610224610b72565b34801561050d57600080fd5b5061030d61051c366004611f9b565b610b81565b61022461052f366004611f72565b610b95565b34801561054057600080fd5b50610257610ba8565b34801561055557600080fd5b5061030d610564366004611fd2565b610bc2565b34801561057557600080fd5b5061027c610584366004611eba565b610bf1565b34801561059557600080fd5b5061027c6105a4366004611eba565b610d84565b3480156105b557600080fd5b50610224606481565b3480156105ca57600080fd5b5061022467016345785d8a000081565b3480156105e657600080fd5b5061027c610df9565b3480156105fb57600080fd5b5061025761060a36600461206d565b600560209081526000928352604080842090915290825290205460ff1681565b34801561063657600080fd5b5061030d610645366004611f72565b610e88565b60006001600160e01b0319821663152a902d60e11b148061067b57506380ac58cd60e01b6001600160e01b03198316145b806106965750635b5e139f60e01b6001600160e01b03198316145b806106a557506106a582610f51565b92915050565b600080546106b8906120a0565b80601f01602080910402602001604051908101604052809291908181526020018280546106e4906120a0565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b505050505081565b8161074381610f86565b61074d838361103f565b505050565b6000610767600954610762610940565b611121565b905090565b60006107806008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146107ca576040519150601f19603f3d011682016040523d82523d6000602084013e6107cf565b606091505b50509050806108145760405162461bcd60e51b815260206004820152600c60248201526b31b0b636103330b4b632b21760a11b60448201526064015b60405180910390fd5b50565b61081f6111bb565b600a54156108645760405162461bcd60e51b815260206004820152601260248201527131b0b71037b7363c9039b2ba1037b731b29760711b604482015260640161080b565b600a55565b826001600160a01b03811633146108835761088333610f86565b61088e848484611215565b50505050565b60008281526007602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916109095750604080518082019091526006546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610928906001600160601b0316876120f0565b610932919061211d565b915196919550909350505050565b60408051608081018252735078981549a1cc18673eb76fb47468f546aadc51815273ef1a89cbfabe59397ffda11fc5df293e9bc5db906020820152735af0d9827e0c53e4799bb226655a1de152a425a591810191909152735dce0bb0778694ef3ba79bb702b88cac1879cc7d6060820152600090815b6004811015610a605760008282600481106109d3576109d361213f565b60200201516040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a419190612155565b1115610a505760019250505090565b610a598161216e565b90506109b6565b505090565b826001600160a01b0381163314610a7f57610a7f33610f86565b61088e8484846113dc565b6000818152600260205260409020546001600160a01b031680610adc5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161080b565b919050565b60006106a58260006114cf565b60006001600160a01b038216610b355760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161080b565b506001600160a01b031660009081526003602052604090205490565b610b596111bb565b610b63600061159f565b565b600180546106b8906120a0565b60006107676009546000611121565b81610b8b81610f86565b61074d83836115f1565b60006106a582610ba3610940565b6114cf565b600a546000908015801590610bbc57508042115b91505090565b846001600160a01b0381163314610bdc57610bdc33610f86565b610be9868686868661165d565b505050505050565b60606009548210610c335760405162461bcd60e51b815260206004820152600c60248201526b3a37b5b2b724b2103237329760a11b604482015260640161080b565b600b546040516357e0286d60e11b8152600481018490526000916001600160a01b03169063afc050da90602401600060405180830381865afa158015610c7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ca5919081019061219d565b905060018151038152610d5d610cba84611745565b600b54604051631a25499360e31b8152600481018790528491610d37916001600160a01b039091169063d12a4c98906024015b600060405180830381865afa158015610d0a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d32919081019061219d565b6117d9565b604051602001610d499392919061224a565b6040516020818303038152906040526117d9565b604051602001610d6d9190612351565b604051602081830303815290604052915050919050565b60606009548210610dc65760405162461bcd60e51b815260206004820152600c60248201526b3a37b5b2b724b2103237329760a11b604482015260640161080b565b600b54604051631a25499360e31b8152600481018490526106a5916001600160a01b03169063d12a4c9890602401610ced565b6060610e64610e2a610d327f00000000000000000000000028d2c3e75ecf20aeee222af60e91fddf0b01c1126117e7565b610e537f000000000000000000000000d64e3c25b0cc9afb535157cbb96eb601a47650fa611808565b604051602001610d49929190612396565b604051602001610e749190612351565b604051602081830303815290604052905090565b610e906111bb565b6001600160a01b038116610ef55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161080b565b6108148161159f565b60008151600181018060401b6a61000080600a3d393df300178452600a8101601585016000f09184525090506001600160a01b038116610adc57604051632da4836960e21b815260040160405180910390fd5b60006001600160e01b0319821663152a902d60e11b14806106a557506301ffc9a760e01b6001600160e01b03198316146106a5565b6daaeb6d7670e522a718067333cd4e3b1561081457604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110179190612504565b61081457604051633b79c77360e21b81526001600160a01b038216600482015260240161080b565b6000818152600260205260409020546001600160a01b03163381148061108857506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6110c55760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161080b565b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60008082611130576001611133565b60025b60408051606081018252606480825261012c60208301526108ae9282019290925260ff92909216925085101561116e576000925050506106a5565b602081015185101561119a5781662386f26fc100008161119057611190612107565b04925050506106a5565b8167016345785d8a0000816111b1576111b1612107565b0495945050505050565b6008546001600160a01b03163314610b635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161080b565b6000818152600260205260409020546001600160a01b0384811691161461126b5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161080b565b6001600160a01b0382166112b55760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161080b565b336001600160a01b03841614806112ef57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8061131057506000818152600460205260409020546001600160a01b031633145b61134d5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161080b565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6113e7838383610869565b6001600160a01b0382163b15806114905750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114849190612521565b6001600160e01b031916145b61074d5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161080b565b60006114d9610ba8565b806114ee57506008546001600160a01b031633145b61152f5760405162461bcd60e51b815260206004820152601260248201527110b83ab13634b1a6b4b73a20b1ba34bb329760711b604482015260640161080b565b600954600061153e8285611121565b90506000808211611550576001611561565b81348161155f5761155f612107565b045b905061156d818461181e565b60005b8181101561159057611588878580600101965061198c565b600101611570565b50505060098190559392505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611668858585610869565b6001600160a01b0384163b15806116ff5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906116b09033908a9089908990899060040161253e565b6020604051808303816000875af11580156116cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f39190612521565b6001600160e01b031916145b61173e5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161080b565b5050505050565b6060600061175283611a97565b600101905060008167ffffffffffffffff81111561177257611772612187565b6040519080825280601f01601f19166020018201604052801561179c576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846117a6575b509392505050565b60606106a582600080611b6f565b60606106a5826001611803816001600160a01b0384163b612592565b611c6a565b60606106a56001600160a01b0383166014611c8d565b6000821161187c5760405162461bcd60e51b815260206004820152602560248201527f6d73672e76616c7565206d757374206265206e202a2063757272656e7450726960448201526431b294149760d91b606482015260840161080b565b8181016108ae8111156118c65760405162461bcd60e51b815260206004820152601260248201527130b636103a37b5b2b7399036b4b73a32b21760711b604482015260640161080b565b826001036118d357505050565b604080516060810182526064815261012c60208201526108ae918101919091526000805b6003811015611949578281600381106119125761191261213f565b602002015184111583826003811061192c5761192c61213f565b60200201518610146119415760019150611949565b6001016118f7565b50801561173e5760405162461bcd60e51b815260206004820152601160248201527038ba3c9037baba1037b3103930b733b29760791b604482015260640161080b565b6001600160a01b0382166119d65760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161080b565b6000818152600260205260409020546001600160a01b031615611a2c5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161080b565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611ad65772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611b02576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611b2057662386f26fc10000830492506010015b6305f5e1008310611b38576305f5e100830492506008015b6127108310611b4c57612710830492506004015b60648310611b5e576064830492506002015b600a83106106a55760010192915050565b6060835180156117d1576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526102308515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f03603f52602083018181015b6003880197508751603f8160121c16518353603f81600c1c16516001840153603f8160061c16516002840153603f811651600384015350600482019150808210611bdf57601f01601f19166040526003830685611c5357603d811515830353603d6001821460011b830353505082526117d1565b600181148115150183038552505050509392505050565b60408051603f8301601f19168101909152818152818360208301863c9392505050565b60606000611c9c8360026120f0565b611ca79060026125a5565b67ffffffffffffffff811115611cbf57611cbf612187565b6040519080825280601f01601f191660200182016040528015611ce9576020820181803683370190505b509050600360fc1b81600081518110611d0457611d0461213f565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611d3357611d3361213f565b60200101906001600160f81b031916908160001a9053506000611d578460026120f0565b611d629060016125a5565b90505b6001811115611dda576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611d9657611d9661213f565b1a60f81b828281518110611dac57611dac61213f565b60200101906001600160f81b031916908160001a90535060049490941c93611dd3816125b8565b9050611d65565b508315611e295760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161080b565b9392505050565b6001600160e01b03198116811461081457600080fd5b600060208284031215611e5857600080fd5b8135611e2981611e30565b60005b83811015611e7e578181015183820152602001611e66565b50506000910152565b6020815260008251806020840152611ea6816040850160208701611e63565b601f01601f19169190910160400192915050565b600060208284031215611ecc57600080fd5b5035919050565b80356001600160a01b0381168114610adc57600080fd5b60008060408385031215611efd57600080fd5b611f0683611ed3565b946020939093013593505050565b600080600060608486031215611f2957600080fd5b611f3284611ed3565b9250611f4060208501611ed3565b9150604084013590509250925092565b60008060408385031215611f6357600080fd5b50508035926020909101359150565b600060208284031215611f8457600080fd5b611e2982611ed3565b801515811461081457600080fd5b60008060408385031215611fae57600080fd5b611fb783611ed3565b91506020830135611fc781611f8d565b809150509250929050565b600080600080600060808688031215611fea57600080fd5b611ff386611ed3565b945061200160208701611ed3565b935060408601359250606086013567ffffffffffffffff8082111561202557600080fd5b818801915088601f83011261203957600080fd5b81358181111561204857600080fd5b89602082850101111561205a57600080fd5b9699959850939650602001949392505050565b6000806040838503121561208057600080fd5b61208983611ed3565b915061209760208401611ed3565b90509250929050565b600181811c908216806120b457607f821691505b6020821081036120d457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106a5576106a56120da565b634e487b7160e01b600052601260045260246000fd5b60008261213a57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561216757600080fd5b5051919050565b600060018201612180576121806120da565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156121af57600080fd5b815167ffffffffffffffff808211156121c757600080fd5b818401915084601f8301126121db57600080fd5b8151818111156121ed576121ed612187565b604051601f8201601f19908116603f0116810190838211818310171561221557612215612187565b8160405282815287602084870101111561222e57600080fd5b61223f836020830160208801611e63565b979650505050505050565b7203d913730b6b2911d1126b2b0ba25b4ba32b99606d1b81528351600090612279816013850160208901611e63565b7f222c20226465736372697074696f6e223a22746865206d6f73742065786f74696013918401918201526e6320696e2d636861696e207065747360881b603382015270222c202261747472696275746573223a5b60781b604282015284516122e8816053840160208901611e63565b7f5d2c2022696d616765223a22646174613a696d6167652f7376672b786d6c3b626053929091019182015265185cd94d8d0b60d21b60738201528351612335816079840160208801611e63565b61227d60f01b60799290910191820152607b0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161238981601d850160208701611e63565b91909101601d0192915050565b7f7b226e616d65223a20224d6561744b69746573222c202264657363726970746981527f6f6e223a2022546865206d6f73742065786f74696320706574732067656e657260208201527f6174656420656e746972656c792027696e2d636861696e272e206d6561746b6960408201527f7465732e78797a207c20747769747465722e636f6d2f6e6f5f7369646536363660608201526c1116101134b6b0b3b2911d101160991b60808201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000608d8201526000835161247c8160a7850160208801611e63565b61088b60f21b60a7918401918201527f202273656c6c65725f6665655f62617369735f706f696e74733a223a2022353060a98201527518111610113332b2afb932b1b4b834b2b73a111d101160511b60c982015283516124e38160df840160208801611e63565b6124fa60df8284010161227d60f01b815260020190565b9695505050505050565b60006020828403121561251657600080fd5b8151611e2981611f8d565b60006020828403121561253357600080fd5b8151611e2981611e30565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b818103818111156106a5576106a56120da565b808201808211156106a5576106a56120da565b6000816125c7576125c76120da565b50600019019056fea26469706673582212208780f5fd5ed775d1d47307fc930576a5598a557c9c3f4637e2607d1dd235815164736f6c63430008110033

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

000000000000000000000000b7849a7c0793ae20026acc1198d6532bbd5dad7e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000fb23c7376672076657273696f6e3d22312e312220206261736550726f66696c653d2266756c6c22202020202076696577426f783d223020302031303020313030222020202020786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220202020203e3c7374796c653e202020202e7374616e64617264416e696d6174696f6e207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2033733b2020202020202020616e696d6174696f6e2d74696d696e672d66756e6374696f6e3a206c696e6561723b2020202020202020616e696d6174696f6e2d697465726174696f6e2d636f756e743a20696e66696e6974653b202020207d20202020406b65796672616d65732073797374656d4d6f74696f6e207b2020202020202020333325207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c31293b20202020202020207d2020202020202020363625207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c2d31293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e30207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e31207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e32207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d202020207d202020202e737461727473496e76697369626c65207b6f7061636974793a2030253b20202020207d2020202020202020202e636c6f75644d617373207b202020202020202066696c6c3a2077686974653b20202020207d2020202020202020202e636c6f7564416363656e74207b202020202020202066696c6c3a20233837434546413b20202020207d2020202023636c6f756430207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203330733b20616e696d6174696f6e2d64656c61793a202d33733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e303b202020207d2020202023636c6f756431207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203437733b20616e696d6174696f6e2d64656c61793a202d3331733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e313b202020207d2020202023636c6f756432207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203637733b20616e696d6174696f6e2d64656c61793a203133733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e323b202020207d202020202373797374656d207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2034733b2020202020202020616e696d6174696f6e2d6e616d653a2073797374656d4d6f74696f6e3b202020207d3c2f7374796c653e3c706174682069643d2277686974656261636b64726f702220636c6173733d22222066696c6c3d22234646464646462220643d224d3020304831303056313030483056305a22202f3e3c706174682069643d22626c7565736b792220636c6173733d22222066696c6c3d22233837434546412220643d224d3020304831303056313030483056305a22202f3e3c672069643d22636c6f7564302220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d22636c6f7564312220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373312220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d34312033335633354832385633394831365634344831325635334831365635374832385636304834305636314835355636304836355635374837335635344838315634354837335634314836355633384835355633334834315a22202f3e3c706174682069643d22636c6f7564416363656e74312220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d34362035325635354835395635314835375635324834365a22202f3e3c2f673e3c672069643d22636c6f7564322220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d2273797374656d2220636c6173733d227374616e64617264416e696d6174696f6e222066696c6c3d2222203e3c706174682069643d227469746c6554657874222066696c6c3d22626c61636b2220643d224d31312033375635304831325633384831335634304831345634324831365634304831375633384831385635304832315633374831375633384831365634304831345633384831335633374831315a204d32332033374832395633384832345634334832395634344832355634394832395635304832335633374d33332033375634344833315635304833345634344833385635304833395633374833345633384833385634334833345633374833335a4d34312033374834395633384834375635304834345633384834315633375a4d35312033374835325634324835335634314835345634304835355633394835365633384835375633374836305633384835385633394835375634304835365634314835355634334836305635304835375634344835335635304835315633375a4d36332033375634344836315635304836345633374836335a4d36352033375633384836385635304837315633384837345633374836355a4d37352033375635304838325634394837385634344838325634334837375633384838325633374837355a4d38342033375634344838395634394838365634364838345635304839305634334838355633384838395634304839305633374838345a222f3e3c2f673e3c2f7376673e0000000000000000000000000000

-----Decoded View---------------
Arg [0] : renderer_ (address): 0xb7849A7C0793aE20026ACC1198d6532BBd5DAd7E
Arg [1] : bTokenImage (bytes): 0x3c7376672076657273696f6e3d22312e312220206261736550726f66696c653d2266756c6c22202020202076696577426f783d223020302031303020313030222020202020786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220202020203e3c7374796c653e202020202e7374616e64617264416e696d6174696f6e207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2033733b2020202020202020616e696d6174696f6e2d74696d696e672d66756e6374696f6e3a206c696e6561723b2020202020202020616e696d6174696f6e2d697465726174696f6e2d636f756e743a20696e66696e6974653b202020207d20202020406b65796672616d65732073797374656d4d6f74696f6e207b2020202020202020333325207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c31293b20202020202020207d2020202020202020363625207b2020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c302c2d31293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e30207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e31207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c2d3230293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d202020207d20202020406b65796672616d657320636c6f7564416e696d6174696f6e32207b202020202020202066726f6d207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020203125207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c39302c3330293b20202020202020207d2020202020202020393925207b2020202020202020202020206f7061636974793a20313030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d2020202020202020746f207b2020202020202020202020206f7061636974793a2030253b202020202020202020202020207472616e73666f726d3a206d617472697828312c302c302c312c2d39302c3330293b20202020202020207d202020207d202020202e737461727473496e76697369626c65207b6f7061636974793a2030253b20202020207d2020202020202020202e636c6f75644d617373207b202020202020202066696c6c3a2077686974653b20202020207d2020202020202020202e636c6f7564416363656e74207b202020202020202066696c6c3a20233837434546413b20202020207d2020202023636c6f756430207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203330733b20616e696d6174696f6e2d64656c61793a202d33733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e303b202020207d2020202023636c6f756431207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203437733b20616e696d6174696f6e2d64656c61793a202d3331733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e313b202020207d2020202023636c6f756432207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a203637733b20616e696d6174696f6e2d64656c61793a203133733b2020202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d6174696f6e323b202020207d202020202373797374656d207b2020202020202020616e696d6174696f6e2d6475726174696f6e3a2034733b2020202020202020616e696d6174696f6e2d6e616d653a2073797374656d4d6f74696f6e3b202020207d3c2f7374796c653e3c706174682069643d2277686974656261636b64726f702220636c6173733d22222066696c6c3d22234646464646462220643d224d3020304831303056313030483056305a22202f3e3c706174682069643d22626c7565736b792220636c6173733d22222066696c6c3d22233837434546412220643d224d3020304831303056313030483056305a22202f3e3c672069643d22636c6f7564302220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d22636c6f7564312220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373312220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d34312033335633354832385633394831365634344831325635334831365635374832385636304834305636314835355636304836355635374837335635344838315634354837335634314836355633384835355633334834315a22202f3e3c706174682069643d22636c6f7564416363656e74312220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d34362035325635354835395635314835375635324834365a22202f3e3c2f673e3c672069643d22636c6f7564322220636c6173733d227374616e64617264416e696d6174696f6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d617373222066696c6c3d222220643d224d31362035305635354832365635364834305635354835325635364836345635344837385635354838375635344839335634344838395634304838325633354836345633364835385634314835325634334835315633384834395633354834325633334833305633354832345634314832305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220643d224d33362033385634304834305634344834335633384833365a4d37312034305634324837355634344837375634304837315a4d35362034395635314837315634394835365a4d32332034385635304833355634384832335a22202f3e3c2f673e3c672069643d2273797374656d2220636c6173733d227374616e64617264416e696d6174696f6e222066696c6c3d2222203e3c706174682069643d227469746c6554657874222066696c6c3d22626c61636b2220643d224d31312033375635304831325633384831335634304831345634324831365634304831375633384831385635304832315633374831375633384831365634304831345633384831335633374831315a204d32332033374832395633384832345634334832395634344832355634394832395635304832335633374d33332033375634344833315635304833345634344833385635304833395633374833345633384833385634334833345633374833335a4d34312033374834395633384834375635304834345633384834315633375a4d35312033374835325634324835335634314835345634304835355633394835365633384835375633374836305633384835385633394835375634304835365634314835355634334836305635304835375634344835335635304835315633375a4d36332033375634344836315635304836345633374836335a4d36352033375633384836385635304837315633384837345633374836355a4d37352033375635304838325634394837385634344838325634334837375633384838325633374837355a4d38342033375634344838395634394838365634364838345635304839305634334838355633384838395634304839305633374838345a222f3e3c2f673e3c2f7376673e

-----Encoded View---------------
129 Constructor Arguments found :
Arg [0] : 000000000000000000000000b7849a7c0793ae20026acc1198d6532bbd5dad7e
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000fb2
Arg [3] : 3c7376672076657273696f6e3d22312e312220206261736550726f66696c653d
Arg [4] : 2266756c6c22202020202076696577426f783d22302030203130302031303022
Arg [5] : 2020202020786d6c6e733d22687474703a2f2f7777772e77332e6f72672f3230
Arg [6] : 30302f7376672220202020203e3c7374796c653e202020202e7374616e646172
Arg [7] : 64416e696d6174696f6e207b2020202020202020616e696d6174696f6e2d6475
Arg [8] : 726174696f6e3a2033733b2020202020202020616e696d6174696f6e2d74696d
Arg [9] : 696e672d66756e6374696f6e3a206c696e6561723b2020202020202020616e69
Arg [10] : 6d6174696f6e2d697465726174696f6e2d636f756e743a20696e66696e697465
Arg [11] : 3b202020207d20202020406b65796672616d65732073797374656d4d6f74696f
Arg [12] : 6e207b2020202020202020333325207b2020202020202020202020207472616e
Arg [13] : 73666f726d3a206d617472697828312c302c302c312c302c31293b2020202020
Arg [14] : 2020207d2020202020202020363625207b202020202020202020202020747261
Arg [15] : 6e73666f726d3a206d617472697828312c302c302c312c302c2d31293b202020
Arg [16] : 20202020207d202020207d20202020406b65796672616d657320636c6f756441
Arg [17] : 6e696d6174696f6e30207b202020202020202066726f6d207b20202020202020
Arg [18] : 20202020206f7061636974793a2030253b202020202020202020202020207472
Arg [19] : 616e73666f726d3a206d617472697828312c302c302c312c39302c3130293b20
Arg [20] : 202020202020207d2020202020202020203125207b2020202020202020202020
Arg [21] : 206f7061636974793a20313030253b202020202020202020202020207472616e
Arg [22] : 73666f726d3a206d617472697828312c302c302c312c39302c3130293b202020
Arg [23] : 20202020207d2020202020202020393925207b2020202020202020202020206f
Arg [24] : 7061636974793a20313030253b202020202020202020202020207472616e7366
Arg [25] : 6f726d3a206d617472697828312c302c302c312c2d39302c3130293b20202020
Arg [26] : 202020207d2020202020202020746f207b2020202020202020202020206f7061
Arg [27] : 636974793a2030253b202020202020202020202020207472616e73666f726d3a
Arg [28] : 206d617472697828312c302c302c312c2d39302c3130293b2020202020202020
Arg [29] : 7d202020207d20202020406b65796672616d657320636c6f7564416e696d6174
Arg [30] : 696f6e31207b202020202020202066726f6d207b202020202020202020202020
Arg [31] : 6f7061636974793a2030253b202020202020202020202020207472616e73666f
Arg [32] : 726d3a206d617472697828312c302c302c312c39302c2d3230293b2020202020
Arg [33] : 2020207d2020202020202020203125207b2020202020202020202020206f7061
Arg [34] : 636974793a20313030253b202020202020202020202020207472616e73666f72
Arg [35] : 6d3a206d617472697828312c302c302c312c39302c2d3230293b202020202020
Arg [36] : 20207d2020202020202020393925207b2020202020202020202020206f706163
Arg [37] : 6974793a20313030253b202020202020202020202020207472616e73666f726d
Arg [38] : 3a206d617472697828312c302c302c312c2d39302c2d3230293b202020202020
Arg [39] : 20207d2020202020202020746f207b2020202020202020202020206f70616369
Arg [40] : 74793a2030253b202020202020202020202020207472616e73666f726d3a206d
Arg [41] : 617472697828312c302c302c312c2d39302c2d3230293b20202020202020207d
Arg [42] : 202020207d20202020406b65796672616d657320636c6f7564416e696d617469
Arg [43] : 6f6e32207b202020202020202066726f6d207b2020202020202020202020206f
Arg [44] : 7061636974793a2030253b202020202020202020202020207472616e73666f72
Arg [45] : 6d3a206d617472697828312c302c302c312c39302c3330293b20202020202020
Arg [46] : 207d2020202020202020203125207b2020202020202020202020206f70616369
Arg [47] : 74793a20313030253b202020202020202020202020207472616e73666f726d3a
Arg [48] : 206d617472697828312c302c302c312c39302c3330293b20202020202020207d
Arg [49] : 2020202020202020393925207b2020202020202020202020206f706163697479
Arg [50] : 3a20313030253b202020202020202020202020207472616e73666f726d3a206d
Arg [51] : 617472697828312c302c302c312c2d39302c3330293b20202020202020207d20
Arg [52] : 20202020202020746f207b2020202020202020202020206f7061636974793a20
Arg [53] : 30253b202020202020202020202020207472616e73666f726d3a206d61747269
Arg [54] : 7828312c302c302c312c2d39302c3330293b20202020202020207d202020207d
Arg [55] : 202020202e737461727473496e76697369626c65207b6f7061636974793a2030
Arg [56] : 253b20202020207d2020202020202020202e636c6f75644d617373207b202020
Arg [57] : 202020202066696c6c3a2077686974653b20202020207d202020202020202020
Arg [58] : 2e636c6f7564416363656e74207b202020202020202066696c6c3a2023383743
Arg [59] : 4546413b20202020207d2020202023636c6f756430207b202020202020202061
Arg [60] : 6e696d6174696f6e2d6475726174696f6e3a203330733b20616e696d6174696f
Arg [61] : 6e2d64656c61793a202d33733b2020202020202020616e696d6174696f6e2d6e
Arg [62] : 616d653a20636c6f7564416e696d6174696f6e303b202020207d202020202363
Arg [63] : 6c6f756431207b2020202020202020616e696d6174696f6e2d6475726174696f
Arg [64] : 6e3a203437733b20616e696d6174696f6e2d64656c61793a202d3331733b2020
Arg [65] : 202020202020616e696d6174696f6e2d6e616d653a20636c6f7564416e696d61
Arg [66] : 74696f6e313b202020207d2020202023636c6f756432207b2020202020202020
Arg [67] : 616e696d6174696f6e2d6475726174696f6e3a203637733b20616e696d617469
Arg [68] : 6f6e2d64656c61793a203133733b2020202020202020616e696d6174696f6e2d
Arg [69] : 6e616d653a20636c6f7564416e696d6174696f6e323b202020207d2020202023
Arg [70] : 73797374656d207b2020202020202020616e696d6174696f6e2d647572617469
Arg [71] : 6f6e3a2034733b2020202020202020616e696d6174696f6e2d6e616d653a2073
Arg [72] : 797374656d4d6f74696f6e3b202020207d3c2f7374796c653e3c706174682069
Arg [73] : 643d2277686974656261636b64726f702220636c6173733d22222066696c6c3d
Arg [74] : 22234646464646462220643d224d3020304831303056313030483056305a2220
Arg [75] : 2f3e3c706174682069643d22626c7565736b792220636c6173733d2222206669
Arg [76] : 6c6c3d22233837434546412220643d224d302030483130305631303048305630
Arg [77] : 5a22202f3e3c672069643d22636c6f7564302220636c6173733d227374616e64
Arg [78] : 617264416e696d6174696f6e20737461727473496e76697369626c6522206669
Arg [79] : 6c6c3d2222203e3c706174682069643d22636c6f75644d617373302220636c61
Arg [80] : 73733d22636c6f75644d617373222066696c6c3d222220643d224d3136203530
Arg [81] : 5635354832365635364834305635354835325635364836345635344837385635
Arg [82] : 3548383756353448393356343448383956343048383256333548363456333648
Arg [83] : 3538563431483532563433483531563338483439563335483432563333483330
Arg [84] : 5633354832345634314832305635304831365a22202f3e3c706174682069643d
Arg [85] : 22636c6f7564416363656e74302220636c6173733d22636c6f7564416363656e
Arg [86] : 74222066696c6c3d222220643d224d3336203338563430483430563434483433
Arg [87] : 5633384833365a4d37312034305634324837355634344837375634304837315a
Arg [88] : 4d35362034395635314837315634394835365a4d323320343856353048333556
Arg [89] : 34384832335a22202f3e3c2f673e3c672069643d22636c6f7564312220636c61
Arg [90] : 73733d227374616e64617264416e696d6174696f6e20737461727473496e7669
Arg [91] : 7369626c65222066696c6c3d2222203e3c706174682069643d22636c6f75644d
Arg [92] : 617373312220636c6173733d22636c6f75644d617373222066696c6c3d222220
Arg [93] : 643d224d34312033335633354832385633394831365634344831325635334831
Arg [94] : 3656353748323856363048343056363148353556363048363556353748373356
Arg [95] : 35344838315634354837335634314836355633384835355633334834315a2220
Arg [96] : 2f3e3c706174682069643d22636c6f7564416363656e74312220636c6173733d
Arg [97] : 22636c6f7564416363656e74222066696c6c3d222220643d224d343620353256
Arg [98] : 35354835395635314835375635324834365a22202f3e3c2f673e3c672069643d
Arg [99] : 22636c6f7564322220636c6173733d227374616e64617264416e696d6174696f
Arg [100] : 6e20737461727473496e76697369626c65222066696c6c3d2222203e3c706174
Arg [101] : 682069643d22636c6f75644d617373302220636c6173733d22636c6f75644d61
Arg [102] : 7373222066696c6c3d222220643d224d31362035305635354832365635364834
Arg [103] : 3056353548353256353648363456353448373856353548383756353448393356
Arg [104] : 3434483839563430483832563335483634563336483538563431483532563433
Arg [105] : 4835315633384834395633354834325633334833305633354832345634314832
Arg [106] : 305635304831365a22202f3e3c706174682069643d22636c6f7564416363656e
Arg [107] : 74302220636c6173733d22636c6f7564416363656e74222066696c6c3d222220
Arg [108] : 643d224d33362033385634304834305634344834335633384833365a4d373120
Arg [109] : 34305634324837355634344837375634304837315a4d35362034395635314837
Arg [110] : 315634394835365a4d32332034385635304833355634384832335a22202f3e3c
Arg [111] : 2f673e3c672069643d2273797374656d2220636c6173733d227374616e646172
Arg [112] : 64416e696d6174696f6e222066696c6c3d2222203e3c706174682069643d2274
Arg [113] : 69746c6554657874222066696c6c3d22626c61636b2220643d224d3131203337
Arg [114] : 5635304831325633384831335634304831345634324831365634304831375633
Arg [115] : 3848313856353048323156333748313756333848313656343048313456333848
Arg [116] : 31335633374831315a204d323320333748323956333848323456343348323956
Arg [117] : 34344832355634394832395635304832335633374d3333203337563434483331
Arg [118] : 5635304833345634344833385635304833395633374833345633384833385634
Arg [119] : 334833345633374833335a4d3431203337483439563338483437563530483434
Arg [120] : 5633384834315633375a4d353120333748353256343248353356343148353456
Arg [121] : 3430483535563339483536563338483537563337483630563338483538563339
Arg [122] : 4835375634304835365634314835355634334836305635304835375634344835
Arg [123] : 335635304835315633375a4d3633203337563434483631563530483634563337
Arg [124] : 4836335a4d363520333756333848363856353048373156333848373456333748
Arg [125] : 36355a4d37352033375635304838325634394837385634344838325634334837
Arg [126] : 375633384838325633374837355a4d3834203337563434483839563439483836
Arg [127] : 5634364838345635304839305634334838355633384838395634304839305633
Arg [128] : 374838345a222f3e3c2f673e3c2f7376673e0000000000000000000000000000


Deployed Bytecode Sourcemap

62475:6017:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62764:49;;;;;;;;;;;;62803:10;62764:49;;;;;160:25:1;;;148:2;133:18;62764:49:0;;;;;;;;65759:398;;;;;;;;;;-1:-1:-1;65759:398:0;;;;;:::i;:::-;;:::i;:::-;;;747:14:1;;740:22;722:41;;710:2;695:18;65759:398:0;582:187:1;49250:18:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;62877:29::-;;;;;;;;;;;;;;;;50223:46;;;;;;;;;;-1:-1:-1;50223:46:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;50223:46:0;;;;;;-1:-1:-1;;;;;1779:32:1;;;1761:51;;1749:2;1734:18;50223:46:0;1615:203:1;61530:157:0;;;;;;;;;;-1:-1:-1;61530:157:0;;;;;:::i;:::-;;:::i;:::-;;63799:208;;;;;;;;;;;;;:::i;62551:26::-;;;;;;;;;;;;;;;;48241:154;;;;;;;;;;;;;:::i;66195:191::-;;;;;;;;;;-1:-1:-1;66195:191:0;;;;;:::i;:::-;;:::i;61695:163::-;;;;;;;;;;-1:-1:-1;61695:163:0;;;;;:::i;:::-;;:::i;29525:442::-;;;;;;;;;;-1:-1:-1;29525:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3038:32:1;;;3020:51;;3102:2;3087:18;;3080:34;;;;2993:18;29525:442:0;2846:274:1;62699:41:0;;;;;;;;;;;;62736:4;62699:41;;64015:690;;;;;;;;;;;;;:::i;58663:143::-;;;;;;;;;;;;58763:42;58663:143;;61866:171;;;;;;;;;;-1:-1:-1;61866:171:0;;;;;:::i;:::-;;:::i;62644:48::-;;;;;;;;;;;;62689:3;62644:48;;49692:151;;;;;;;;;;-1:-1:-1;49692:151:0;;;;;:::i;:::-;;:::i;63138:134::-;;;;;;:::i;:::-;;:::i;49851:172::-;;;;;;;;;;-1:-1:-1;49851:172:0;;;;;:::i;:::-;;:::i;25408:103::-;;;;;;;;;;;;;:::i;24760:87::-;;;;;;;;;;-1:-1:-1;24833:6:0;;-1:-1:-1;;;;;24833:6:0;24760:87;;49277:20;;;;;;;;;;;;;:::i;63649:142::-;;;;;;;;;;;;;:::i;61346:176::-;;;;;;;;;;-1:-1:-1;61346:176:0;;;;;:::i;:::-;;:::i;63280:161::-;;;;;;:::i;:::-;;:::i;63449:192::-;;;;;;;;;;;;;:::i;62045:230::-;;;;;;;;;;-1:-1:-1;62045:230:0;;;;;:::i;:::-;;:::i;64719:802::-;;;;;;;;;;-1:-1:-1;64719:802:0;;;;;:::i;:::-;;:::i;65529:222::-;;;;;;;;;;-1:-1:-1;65529:222:0;;;;;:::i;:::-;;:::i;62598:39::-;;;;;;;;;;;;62634:3;62598:39;;62820:48;;;;;;;;;;;;62859:9;62820:48;;47491:742;;;;;;;;;;;;;:::i;50278:68::-;;;;;;;;;;-1:-1:-1;50278:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;25666:201;;;;;;;;;;-1:-1:-1;25666:201:0;;;;;:::i;:::-;;:::i;65759:398::-;65861:4;-1:-1:-1;;;;;;65885:41:0;;-1:-1:-1;;;65885:41:0;;:87;;-1:-1:-1;;;;;;;;;;65947:25:0;;;65885:87;:166;;;-1:-1:-1;;;;;;;;;;66026:25:0;;;65885:166;:264;;;;66113:36;66137:11;66113:23;:36::i;:::-;65878:271;65759:398;-1:-1:-1;;65759:398:0:o;49250:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61530:157::-;61626:8;60184:30;60205:8;60184:20;:30::i;:::-;61647:32:::1;61661:8;61671:7;61647:13;:32::i;:::-;61530:157:::0;;;:::o;63799:208::-;63855:7;63882:117;63931:11;;63976:21;:19;:21::i;:::-;63882:13;:117::i;:::-;63875:124;;63799:208;:::o;48241:154::-;48281:12;48298:7;24833:6;;-1:-1:-1;;;;;24833:6:0;;24760:87;48298:7;-1:-1:-1;;;;;48298:12:0;48318:21;48298:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48280:64;;;48363:7;48355:32;;;;-1:-1:-1;;;48355:32:0;;5874:2:1;48355:32:0;;;5856:21:1;5913:2;5893:18;;;5886:30;-1:-1:-1;;;5932:18:1;;;5925:42;5984:18;;48355:32:0;;;;;;;;;48269:126;48241:154::o;66195:191::-;24646:13;:11;:13::i;:::-;66293:14:::1;::::0;:19;66285:50:::1;;;::::0;-1:-1:-1;;;66285:50:0;;6215:2:1;66285:50:0::1;::::0;::::1;6197:21:1::0;6254:2;6234:18;;;6227:30;-1:-1:-1;;;6273:18:1;;;6266:48;6331:18;;66285:50:0::1;6013:342:1::0;66285:50:0::1;66346:14;:32:::0;66195:191::o;61695:163::-;61796:4;-1:-1:-1;;;;;60004:18:0;;60012:10;60004:18;60000:83;;60039:32;60060:10;60039:20;:32::i;:::-;61813:37:::1;61832:4;61838:2;61842:7;61813:18;:37::i;:::-;61695:163:::0;;;;:::o;29525:442::-;29622:7;29680:27;;;:17;:27;;;;;;;;29651:56;;;;;;;;;-1:-1:-1;;;;;29651:56:0;;;;;-1:-1:-1;;;29651:56:0;;;-1:-1:-1;;;;;29651:56:0;;;;;;;;29622:7;;29720:92;;-1:-1:-1;29771:29:0;;;;;;;;;29781:19;29771:29;-1:-1:-1;;;;;29771:29:0;;;;-1:-1:-1;;;29771:29:0;;-1:-1:-1;;;;;29771:29:0;;;;;29720:92;29862:23;;;;29824:21;;30333:5;;29849:36;;-1:-1:-1;;;;;29849:36:0;:10;:36;:::i;:::-;29848:58;;;;:::i;:::-;29927:16;;;;;-1:-1:-1;29525:442:0;;-1:-1:-1;;;;29525:442:0:o;64015:690::-;64095:379;;;;;;;;64155:42;64095:379;;64246:42;64095:379;;;;64337:42;64095:379;;;;;;;64429:42;64095:379;;;;64066:16;;;64499:191;64519:15;64515:1;:19;64499:191;;;64598:1;64561:8;64570:1;64561:11;;;;;;;:::i;:::-;;;;;64560:35;;-1:-1:-1;;;64560:35:0;;64584:10;64560:35;;;1761:51:1;-1:-1:-1;;;;;64560:23:0;;;;;;1734:18:1;;64560:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;64556:122;;;64634:4;64620:18;;64499:191;64084:621;64015:690;:::o;64556:122::-;64536:3;;;:::i;:::-;;;64499:191;;;;64084:621;64015:690;:::o;61866:171::-;61971:4;-1:-1:-1;;;;;60004:18:0;;60012:10;60004:18;60000:83;;60039:32;60060:10;60039:20;:32::i;:::-;61988:41:::1;62011:4;62017:2;62021:7;61988:22;:41::i;49692:151::-:0;49750:13;49793:12;;;:8;:12;;;;;;-1:-1:-1;;;;;49793:12:0;;49776:59;;;;-1:-1:-1;;;49776:59:0;;7682:2:1;49776:59:0;;;7664:21:1;7721:2;7701:18;;;7694:30;-1:-1:-1;;;7740:18:1;;;7733:40;7790:18;;49776:59:0;7480:334:1;49776:59:0;49692:151;;;:::o;63138:134::-;63189:19;63228:36;63241:2;63257:5;63228:7;:36::i;49851:172::-;49914:7;-1:-1:-1;;;;;49942:19:0;;49934:44;;;;-1:-1:-1;;;49934:44:0;;8021:2:1;49934:44:0;;;8003:21:1;8060:2;8040:18;;;8033:30;-1:-1:-1;;;8079:18:1;;;8072:42;8131:18;;49934:44:0;7819:336:1;49934:44:0;-1:-1:-1;;;;;;49998:17:0;;;;;:10;:17;;;;;;;49851:172::o;25408:103::-;24646:13;:11;:13::i;:::-;25473:30:::1;25500:1;25473:18;:30::i;:::-;25408:103::o:0;49277:20::-;;;;;;;:::i;63649:142::-;63695:7;63722:61;63751:11;;63776:5;63722:13;:61::i;61346:176::-;61450:8;60184:30;60205:8;60184:20;:30::i;:::-;61471:43:::1;61495:8;61505;61471:23;:43::i;63280:161::-:0;63341:19;63380:52;63393:2;63409:21;:19;:21::i;:::-;63380:7;:52::i;63449:192::-;63540:14;;63497:4;;63573:20;;;;;63572:61;;;63617:15;63599;:33;63572:61;63565:68;;;63449:192;:::o;62045:230::-;62198:4;-1:-1:-1;;;;;60004:18:0;;60012:10;60004:18;60000:83;;60039:32;60060:10;60039:20;:32::i;:::-;62220:47:::1;62243:4;62249:2;62253:7;62262:4;;62220:22;:47::i;:::-;62045:230:::0;;;;;;:::o;64719:802::-;64783:13;64829:11;;64819:7;:21;64811:46;;;;-1:-1:-1;;;64811:46:0;;8362:2:1;64811:46:0;;;8344:21:1;8401:2;8381:18;;;8374:30;-1:-1:-1;;;8420:18:1;;;8413:42;8472:18;;64811:46:0;8160:336:1;64811:46:0;64895:9;;:35;;-1:-1:-1;;;64895:35:0;;;;;160:25:1;;;64868:24:0;;-1:-1:-1;;;;;64895:9:0;;:26;;133:18:1;;64895:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64895:35:0;;;;;;;;;;;;:::i;:::-;64868:62;;65028:1;65015:10;65009:17;65005:25;64993:10;64986:45;65142:369;65213:25;65230:7;65213:16;:25::i;:::-;65449:9;;:28;;-1:-1:-1;;;65449:28:0;;;;;160:25:1;;;65345:10:0;;65429:50;;-1:-1:-1;;;;;65449:9:0;;;;:19;;133:18:1;;65449:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65449:28:0;;;;;;;;;;;;:::i;:::-;65429:13;:50::i;:::-;65156:354;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65142:13;:369::i;:::-;65068:444;;;;;;;;:::i;:::-;;;;;;;;;;;;;65054:459;;;64719:802;;;:::o;65529:222::-;65595:13;65639:11;;65629:7;:21;65621:46;;;;-1:-1:-1;;;65621:46:0;;8362:2:1;65621:46:0;;;8344:21:1;8401:2;8381:18;;;8374:30;-1:-1:-1;;;8420:18:1;;;8413:42;8472:18;;65621:46:0;8160:336:1;65621:46:0;65712:9;;:28;;-1:-1:-1;;;65712:28:0;;;;;160:25:1;;;65692:50:0;;-1:-1:-1;;;;;65712:9:0;;:19;;133:18:1;;65712:28:0;14:177:1;47491:742:0;47534:13;47664:559;47984:43;47998:28;48011:14;47998:12;:28::i;47984:43::-;48177:37;48197:16;48177:19;:37::i;:::-;47678:544;;;;;;;;;:::i;47664:559::-;47574:650;;;;;;;;:::i;:::-;;;;;;;;;;;;;47560:665;;47491:742;:::o;25666:201::-;24646:13;:11;:13::i;:::-;-1:-1:-1;;;;;25755:22:0;::::1;25747:73;;;::::0;-1:-1:-1;;;25747:73:0;;13785:2:1;25747:73:0::1;::::0;::::1;13767:21:1::0;13824:2;13804:18;;;13797:30;13863:34;13843:18;;;13836:62;-1:-1:-1;;;13914:18:1;;;13907:36;13960:19;;25747:73:0::1;13583:402:1::0;25747:73:0::1;25831:28;25850:8;25831:18;:28::i;18240:2436::-:0;18292:15;18447:4;18441:11;18589:1;18569:18;18565:26;20191:8;20187:2;20183:17;20136:24;20111:174;20088:4;20063:237;20438:2;20428:8;20424:17;20419:2;20413:4;20409:13;20406:1;20399:43;20526:32;;;-1:-1:-1;20388:54:0;-1:-1:-1;;;;;;20585:21:0;;20581:88;;20630:27;;-1:-1:-1;;;20630:27:0;;;;;;;;;;;29255:215;29357:4;-1:-1:-1;;;;;;29381:41:0;;-1:-1:-1;;;29381:41:0;;:81;;-1:-1:-1;;;;;;;;;;27986:40:0;;;29426:36;27877:157;60242:419;58763:42;60433:45;:49;60429:225;;60504:67;;-1:-1:-1;;;60504:67:0;;60555:4;60504:67;;;14202:34:1;-1:-1:-1;;;;;14272:15:1;;14252:18;;;14245:43;58763:42:0;;60504;;14137:18:1;;60504:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60499:144;;60599:28;;-1:-1:-1;;;60599:28:0;;-1:-1:-1;;;;;1779:32:1;;60599:28:0;;;1761:51:1;1734:18;;60599:28:0;1615:203:1;50849:290:0;50921:13;50937:12;;;:8;:12;;;;;;-1:-1:-1;;;;;50937:12:0;50970:10;:19;;;:58;;-1:-1:-1;;;;;;50993:23:0;;;;;;:16;:23;;;;;;;;51017:10;50993:35;;;;;;;;;;50970:58;50962:85;;;;-1:-1:-1;;;50962:85:0;;14751:2:1;50962:85:0;;;14733:21:1;14790:2;14770:18;;;14763:30;-1:-1:-1;;;14809:18:1;;;14802:44;14863:18;;50962:85:0;14549:338:1;50962:85:0;51060:15;;;;:11;:15;;;;;;:25;;-1:-1:-1;;;;;;51060:25:0;-1:-1:-1;;;;;51060:25:0;;;;;;;;;51103:28;;51060:15;;51103:28;;;;;;;50910:229;50849:290;;:::o;67116:495::-;67199:7;67238:15;67257:10;67256:20;;67275:1;67256:20;;;67271:1;67256:20;67287:75;;;;;;;;62634:3;67287:75;;;62689:3;67287:75;;;;62736:4;67287:75;;;;;;;67238:38;;;;;;-1:-1:-1;67377:29:0;;67373:176;;;67430:1;67423:8;;;;;;67373:176;67477:14;;;;67462:29;;67458:91;;;67530:7;62803:10;67515:22;;;;;:::i;:::-;;67508:29;;;;;;67458:91;67581:7;62859:9;67566:22;;;;;:::i;:::-;;;67116:495;-1:-1:-1;;;;;67116:495:0:o;24925:132::-;24833:6;;-1:-1:-1;;;;;24833:6:0;23549:10;24989:23;24981:68;;;;-1:-1:-1;;;24981:68:0;;15094:2:1;24981:68:0;;;15076:21:1;;;15113:18;;;15106:30;15172:34;15152:18;;;15145:62;15224:18;;24981:68:0;14892:356:1;51362:768:0;51498:12;;;;:8;:12;;;;;;-1:-1:-1;;;;;51490:20:0;;;51498:12;;51490:20;51482:43;;;;-1:-1:-1;;;51482:43:0;;15455:2:1;51482:43:0;;;15437:21:1;15494:2;15474:18;;;15467:30;-1:-1:-1;;;15513:18:1;;;15506:40;15563:18;;51482:43:0;15253:334:1;51482:43:0;-1:-1:-1;;;;;51546:16:0;;51538:46;;;;-1:-1:-1;;;51538:46:0;;15794:2:1;51538:46:0;;;15776:21:1;15833:2;15813:18;;;15806:30;-1:-1:-1;;;15852:18:1;;;15845:47;15909:18;;51538:46:0;15592:341:1;51538:46:0;51619:10;-1:-1:-1;;;;;51619:18:0;;;;:56;;-1:-1:-1;;;;;;51641:22:0;;;;;;:16;:22;;;;;;;;51664:10;51641:34;;;;;;;;;;51619:56;:89;;;-1:-1:-1;51693:15:0;;;;:11;:15;;;;;;-1:-1:-1;;;;;51693:15:0;51679:10;:29;51619:89;51597:153;;;;-1:-1:-1;;;51597:153:0;;14751:2:1;51597:153:0;;;14733:21:1;14790:2;14770:18;;;14763:30;-1:-1:-1;;;14809:18:1;;;14802:44;14863:18;;51597:153:0;14549:338:1;51597:153:0;-1:-1:-1;;;;;51955:16:0;;;;;;;:10;:16;;;;;;;;:18;;-1:-1:-1;;51955:18:0;;;51990:14;;;;;;;;;:16;;51955:18;51990:16;;;52030:12;;;:8;:12;;;;;:17;;-1:-1:-1;;;;;;52030:17:0;;;;;;;;52067:11;:15;;;;;;52060:22;;;;;;;;52100;;52039:2;;51990:14;51955:16;52100:22;;;51362:768;;;:::o;52138:409::-;52262:26;52275:4;52281:2;52285;52262:12;:26::i;:::-;-1:-1:-1;;;;;52323:14:0;;;:19;;:172;;-1:-1:-1;52363:66:0;;-1:-1:-1;;;52363:66:0;;;52404:10;52363:66;;;16243:34:1;-1:-1:-1;;;;;16313:15:1;;;16293:18;;;16286:43;16345:18;;;16338:34;;;16408:3;16388:18;;;16381:31;-1:-1:-1;16428:19:1;;;16421:30;52450:45:0;;52363:40;;;;52450:45;;16468:19:1;;52363:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;52363:132:0;;52323:172;52301:238;;;;-1:-1:-1;;;52301:238:0;;16954:2:1;52301:238:0;;;16936:21:1;16993:2;16973:18;;;16966:30;-1:-1:-1;;;17012:18:1;;;17005:46;17068:18;;52301:238:0;16752:340:1;66429:679:0;66491:19;66531:18;:16;:18::i;:::-;:43;;;-1:-1:-1;24833:6:0;;-1:-1:-1;;;;;24833:6:0;66553:10;:21;66531:43;66523:74;;;;-1:-1:-1;;;66523:74:0;;17299:2:1;66523:74:0;;;17281:21:1;17338:2;17318:18;;;17311:30;-1:-1:-1;;;17357:18:1;;;17350:48;17415:18;;66523:74:0;17097:342:1;66523:74:0;66626:11;;66608:15;66672:62;66626:11;66722:10;66672:13;:62::i;:::-;66648:86;;66765:11;66796:1;66780:13;:17;66779:51;;66829:1;66779:51;;;66813:13;66801:9;:25;;;;;:::i;:::-;;66779:51;66765:65;;66887:23;66897:3;66902:7;66887:9;:23::i;:::-;66926:9;66921:78;66941:3;66937:1;:7;66921:78;;;66966:20;66972:2;66976:9;;;;;;66966:5;:20::i;:::-;66946:3;;66921:78;;;-1:-1:-1;;;67041:11:0;:25;;;67023:7;66429:679;-1:-1:-1;;;66429:679:0:o;26027:191::-;26120:6;;;-1:-1:-1;;;;;26137:17:0;;;-1:-1:-1;;;;;;26137:17:0;;;;;;;26170:40;;26120:6;;;26137:17;26120:6;;26170:40;;26101:16;;26170:40;26090:128;26027:191;:::o;51147:207::-;51250:10;51233:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;51233:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;51233:49:0;;;;;;;;;;51300:46;;722:41:1;;;51233:38:0;;51250:10;51300:46;;695:18:1;51300:46:0;;;;;;;51147:207;;:::o;52555:441::-;52709:26;52722:4;52728:2;52732;52709:12;:26::i;:::-;-1:-1:-1;;;;;52770:14:0;;;:19;;:174;;-1:-1:-1;52810:68:0;;-1:-1:-1;;;52810:68:0;;;52899:45;-1:-1:-1;;;;;52810:40:0;;;52899:45;;52810:68;;52851:10;;52863:4;;52869:2;;52873:4;;;;52810:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;52810:134:0;;52770:174;52748:240;;;;-1:-1:-1;;;52748:240:0;;16954:2:1;52748:240:0;;;16936:21:1;16993:2;16973:18;;;16966:30;-1:-1:-1;;;17012:18:1;;;17005:46;17068:18;;52748:240:0;16752:340:1;52748:240:0;52555:441;;;;;:::o;45157:716::-;45213:13;45264:14;45281:17;45292:5;45281:10;:17::i;:::-;45301:1;45281:21;45264:38;;45317:20;45351:6;45340:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45340:18:0;-1:-1:-1;45317:41:0;-1:-1:-1;45482:28:0;;;45498:2;45482:28;45539:288;-1:-1:-1;;45571:5:0;-1:-1:-1;;;45708:2:0;45697:14;;45692:30;45571:5;45679:44;45769:2;45760:11;;;-1:-1:-1;45790:21:0;45539:288;45790:21;45539:288;-1:-1:-1;45848:6:0;45157:716;-1:-1:-1;;;45157:716:0:o;7762:134::-;7820:20;7862:26;7869:4;7875:5;7882;7862:6;:26::i;20869:163::-;20923:12;20955:69;20968:7;18044:1;20990:33;18044:1;-1:-1:-1;;;;;20990:19:0;;;:33;:::i;:::-;20955:12;:69::i;46893:151::-;46951:13;46984:52;-1:-1:-1;;;;;46996:22:0;;45048:2;46984:11;:52::i;67619:870::-;67725:1;67712:10;:14;67704:64;;;;-1:-1:-1;;;67704:64:0;;18446:2:1;67704:64:0;;;18428:21:1;18485:2;18465:18;;;18458:30;18524:34;18504:18;;;18497:62;-1:-1:-1;;;18575:18:1;;;18568:35;18620:19;;67704:64:0;18244:401:1;67704:64:0;67872:25;;;62736:4;67972:17;;;67964:48;;;;-1:-1:-1;;;67964:48:0;;18852:2:1;67964:48:0;;;18834:21:1;18891:2;18871:18;;;18864:30;-1:-1:-1;;;18910:18:1;;;18903:48;18968:18;;67964:48:0;18650:342:1;67964:48:0;68027:10;68041:1;68027:15;68023:28;;68044:7;67619:870;;:::o;68023:28::-;68062:75;;;;;;;;62634:3;68062:75;;62689:3;68062:75;;;;62736:4;68062:75;;;;;;;:29;;68184:221;68204:18;68200:1;:22;68184:221;;;68291:11;68303:1;68291:14;;;;;;;:::i;:::-;;;;;68284:21;;;68264:11;68276:1;68264:14;;;;;;;:::i;:::-;;;;;68249:29;;68248:58;68244:150;;68350:4;68327:27;;68373:5;;68244:150;68224:3;;68184:221;;;;68424:20;68423:21;68415:51;;;;-1:-1:-1;;;68415:51:0;;19199:2:1;68415:51:0;;;19181:21:1;19238:2;19218:18;;;19211:30;-1:-1:-1;;;19257:18:1;;;19250:47;19314:18;;68415:51:0;18997:341:1;53730:384:0;-1:-1:-1;;;;;53805:16:0;;53797:46;;;;-1:-1:-1;;;53797:46:0;;15794:2:1;53797:46:0;;;15776:21:1;15833:2;15813:18;;;15806:30;-1:-1:-1;;;15852:18:1;;;15845:47;15909:18;;53797:46:0;15592:341:1;53797:46:0;53888:1;53864:12;;;:8;:12;;;;;;-1:-1:-1;;;;;53864:12:0;:26;53856:53;;;;-1:-1:-1;;;53856:53:0;;19545:2:1;53856:53:0;;;19527:21:1;19584:2;19564:18;;;19557:30;-1:-1:-1;;;19603:18:1;;;19596:44;19657:18;;53856:53:0;19343:338:1;53856:53:0;-1:-1:-1;;;;;54003:14:0;;;;;;:10;:14;;;;;;;;:16;;;;;;54043:12;;;:8;:12;;;;;;:17;;-1:-1:-1;;;;;;54043:17:0;;;;;54078:28;54052:2;;54003:14;;54078:28;;54003:14;;54078:28;53730:384;;:::o;42179:922::-;42232:7;;-1:-1:-1;;;42310:15:0;;42306:102;;-1:-1:-1;;;42346:15:0;;;-1:-1:-1;42390:2:0;42380:12;42306:102;42435:6;42426:5;:15;42422:102;;42471:6;42462:15;;;-1:-1:-1;42506:2:0;42496:12;42422:102;42551:6;42542:5;:15;42538:102;;42587:6;42578:15;;;-1:-1:-1;42622:2:0;42612:12;42538:102;42667:5;42658;:14;42654:99;;42702:5;42693:14;;;-1:-1:-1;42736:1:0;42726:11;42654:99;42780:5;42771;:14;42767:99;;42815:5;42806:14;;;-1:-1:-1;42849:1:0;42839:11;42767:99;42893:5;42884;:14;42880:99;;42928:5;42919:14;;;-1:-1:-1;42962:1:0;42952:11;42880:99;43006:5;42997;:14;42993:66;;43042:1;43032:11;43087:6;42179:922;-1:-1:-1;;42179:922:0:o;4693:2930::-;4809:20;4945:4;4939:11;4953:10;4915:2690;;;5159:1;5155;5143:10;5139:18;5135:26;5132:1;5128:34;5273:4;5267:11;5257:21;;5652:34;5646:4;5639:48;5780:6;5769:8;5762:16;5758:29;5722:34;5718:70;5712:4;5705:84;5898:4;5890:6;5886:17;5941:13;5936:3;5932:23;6034:624;6087:1;6081:4;6077:12;6069:20;;6150:4;6144:11;6295:4;6287:5;6283:2;6279:14;6275:25;6269:32;6264:3;6256:46;6371:4;6363:5;6359:2;6355:14;6351:25;6345:32;6341:1;6336:3;6332:11;6324:54;6446:4;6438:5;6435:1;6431:13;6427:24;6421:31;6417:1;6412:3;6408:11;6400:53;6513:4;6506:5;6502:16;6496:23;6492:1;6487:3;6483:11;6475:45;;6560:1;6555:3;6551:11;6544:18;;6624:3;6619;6616:12;6034:624;6606:33;6901:2;6883:12;-1:-1:-1;;6879:26:0;6873:4;6866:40;6951:1;6935:18;;6983:9;6973:456;;7143:4;7137:1;7130:9;7123:17;7118:3;7114:27;7106:42;7238:4;7232:1;7229;7226:8;7223:1;7219:16;7214:3;7210:26;7202:41;-1:-1:-1;;7354:29:0;;7405:5;;6973:456;7562:1;7559;7556:8;7551:1;7544:9;7537:17;7533:32;7518:13;7514:52;7506:6;7499:68;;;;4919:33;4693:2930;;;;;:::o;21810:984::-;22053:4;22047:11;;22483:2;22473:13;;-1:-1:-1;;22469:27:0;22459:38;;22446:52;;;22600:18;;;22477:4;22764:5;22759:2;22749:13;;22740:7;22728:48;21810:984;;;;;:::o;46289:447::-;46364:13;46390:19;46422:10;46426:6;46422:1;:10;:::i;:::-;:14;;46435:1;46422:14;:::i;:::-;46412:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46412:25:0;;46390:47;;-1:-1:-1;;;46448:6:0;46455:1;46448:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;46448:15:0;;;;;;;;;-1:-1:-1;;;46474:6:0;46481:1;46474:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;46474:15:0;;;;;;;;-1:-1:-1;46505:9:0;46517:10;46521:6;46517:1;:10;:::i;:::-;:14;;46530:1;46517:14;:::i;:::-;46505:26;;46500:131;46537:1;46533;:5;46500:131;;;-1:-1:-1;;;46581:5:0;46589:3;46581:11;46572:21;;;;;;;:::i;:::-;;;;46560:6;46567:1;46560:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;46560:33:0;;;;;;;;-1:-1:-1;46618:1:0;46608:11;;;;;46540:3;;;:::i;:::-;;;46500:131;;;-1:-1:-1;46649:10:0;;46641:55;;;;-1:-1:-1;;;46641:55:0;;20159:2:1;46641:55:0;;;20141:21:1;;;20178:18;;;20171:30;20237:34;20217:18;;;20210:62;20289:18;;46641:55:0;19957:356:1;46641:55:0;46721:6;46289:447;-1:-1:-1;;;46289:447:0:o;196:131:1:-;-1:-1:-1;;;;;;270:32:1;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;774:250::-;859:1;869:113;883:6;880:1;877:13;869:113;;;959:11;;;953:18;940:11;;;933:39;905:2;898:10;869:113;;;-1:-1:-1;;1016:1:1;998:16;;991:27;774:250::o;1029:396::-;1178:2;1167:9;1160:21;1141:4;1210:6;1204:13;1253:6;1248:2;1237:9;1233:18;1226:34;1269:79;1341:6;1336:2;1325:9;1321:18;1316:2;1308:6;1304:15;1269:79;:::i;:::-;1409:2;1388:15;-1:-1:-1;;1384:29:1;1369:45;;;;1416:2;1365:54;;1029:396;-1:-1:-1;;1029:396:1:o;1430:180::-;1489:6;1542:2;1530:9;1521:7;1517:23;1513:32;1510:52;;;1558:1;1555;1548:12;1510:52;-1:-1:-1;1581:23:1;;1430:180;-1:-1:-1;1430:180:1:o;1823:173::-;1891:20;;-1:-1:-1;;;;;1940:31:1;;1930:42;;1920:70;;1986:1;1983;1976:12;2001:254;2069:6;2077;2130:2;2118:9;2109:7;2105:23;2101:32;2098:52;;;2146:1;2143;2136:12;2098:52;2169:29;2188:9;2169:29;:::i;:::-;2159:39;2245:2;2230:18;;;;2217:32;;-1:-1:-1;;;2001:254:1:o;2260:328::-;2337:6;2345;2353;2406:2;2394:9;2385:7;2381:23;2377:32;2374:52;;;2422:1;2419;2412:12;2374:52;2445:29;2464:9;2445:29;:::i;:::-;2435:39;;2493:38;2527:2;2516:9;2512:18;2493:38;:::i;:::-;2483:48;;2578:2;2567:9;2563:18;2550:32;2540:42;;2260:328;;;;;:::o;2593:248::-;2661:6;2669;2722:2;2710:9;2701:7;2697:23;2693:32;2690:52;;;2738:1;2735;2728:12;2690:52;-1:-1:-1;;2761:23:1;;;2831:2;2816:18;;;2803:32;;-1:-1:-1;2593:248:1:o;3365:186::-;3424:6;3477:2;3465:9;3456:7;3452:23;3448:32;3445:52;;;3493:1;3490;3483:12;3445:52;3516:29;3535:9;3516:29;:::i;3556:118::-;3642:5;3635:13;3628:21;3621:5;3618:32;3608:60;;3664:1;3661;3654:12;3679:315;3744:6;3752;3805:2;3793:9;3784:7;3780:23;3776:32;3773:52;;;3821:1;3818;3811:12;3773:52;3844:29;3863:9;3844:29;:::i;:::-;3834:39;;3923:2;3912:9;3908:18;3895:32;3936:28;3958:5;3936:28;:::i;:::-;3983:5;3973:15;;;3679:315;;;;;:::o;3999:808::-;4096:6;4104;4112;4120;4128;4181:3;4169:9;4160:7;4156:23;4152:33;4149:53;;;4198:1;4195;4188:12;4149:53;4221:29;4240:9;4221:29;:::i;:::-;4211:39;;4269:38;4303:2;4292:9;4288:18;4269:38;:::i;:::-;4259:48;;4354:2;4343:9;4339:18;4326:32;4316:42;;4409:2;4398:9;4394:18;4381:32;4432:18;4473:2;4465:6;4462:14;4459:34;;;4489:1;4486;4479:12;4459:34;4527:6;4516:9;4512:22;4502:32;;4572:7;4565:4;4561:2;4557:13;4553:27;4543:55;;4594:1;4591;4584:12;4543:55;4634:2;4621:16;4660:2;4652:6;4649:14;4646:34;;;4676:1;4673;4666:12;4646:34;4721:7;4716:2;4707:6;4703:2;4699:15;4695:24;4692:37;4689:57;;;4742:1;4739;4732:12;4689:57;3999:808;;;;-1:-1:-1;3999:808:1;;-1:-1:-1;4773:2:1;4765:11;;4795:6;3999:808;-1:-1:-1;;;3999:808:1:o;4812:260::-;4880:6;4888;4941:2;4929:9;4920:7;4916:23;4912:32;4909:52;;;4957:1;4954;4947:12;4909:52;4980:29;4999:9;4980:29;:::i;:::-;4970:39;;5028:38;5062:2;5051:9;5047:18;5028:38;:::i;:::-;5018:48;;4812:260;;;;;:::o;5077:380::-;5156:1;5152:12;;;;5199;;;5220:61;;5274:4;5266:6;5262:17;5252:27;;5220:61;5327:2;5319:6;5316:14;5296:18;5293:38;5290:161;;5373:10;5368:3;5364:20;5361:1;5354:31;5408:4;5405:1;5398:15;5436:4;5433:1;5426:15;5290:161;;5077:380;;;:::o;6360:127::-;6421:10;6416:3;6412:20;6409:1;6402:31;6452:4;6449:1;6442:15;6476:4;6473:1;6466:15;6492:168;6565:9;;;6596;;6613:15;;;6607:22;;6593:37;6583:71;;6634:18;;:::i;6665:127::-;6726:10;6721:3;6717:20;6714:1;6707:31;6757:4;6754:1;6747:15;6781:4;6778:1;6771:15;6797:217;6837:1;6863;6853:132;;6907:10;6902:3;6898:20;6895:1;6888:31;6942:4;6939:1;6932:15;6970:4;6967:1;6960:15;6853:132;-1:-1:-1;6999:9:1;;6797:217::o;7019:127::-;7080:10;7075:3;7071:20;7068:1;7061:31;7111:4;7108:1;7101:15;7135:4;7132:1;7125:15;7151:184;7221:6;7274:2;7262:9;7253:7;7249:23;7245:32;7242:52;;;7290:1;7287;7280:12;7242:52;-1:-1:-1;7313:16:1;;7151:184;-1:-1:-1;7151:184:1:o;7340:135::-;7379:3;7400:17;;;7397:43;;7420:18;;:::i;:::-;-1:-1:-1;7467:1:1;7456:13;;7340:135::o;8501:127::-;8562:10;8557:3;8553:20;8550:1;8543:31;8593:4;8590:1;8583:15;8617:4;8614:1;8607:15;8633:897;8713:6;8766:2;8754:9;8745:7;8741:23;8737:32;8734:52;;;8782:1;8779;8772:12;8734:52;8815:9;8809:16;8844:18;8885:2;8877:6;8874:14;8871:34;;;8901:1;8898;8891:12;8871:34;8939:6;8928:9;8924:22;8914:32;;8984:7;8977:4;8973:2;8969:13;8965:27;8955:55;;9006:1;9003;8996:12;8955:55;9035:2;9029:9;9057:2;9053;9050:10;9047:36;;;9063:18;;:::i;:::-;9138:2;9132:9;9106:2;9192:13;;-1:-1:-1;;9188:22:1;;;9212:2;9184:31;9180:40;9168:53;;;9236:18;;;9256:22;;;9233:46;9230:72;;;9282:18;;:::i;:::-;9322:10;9318:2;9311:22;9357:2;9349:6;9342:18;9397:7;9392:2;9387;9383;9379:11;9375:20;9372:33;9369:53;;;9418:1;9415;9408:12;9369:53;9431:68;9496:2;9491;9483:6;9479:15;9474:2;9470;9466:11;9431:68;:::i;:::-;9518:6;8633:897;-1:-1:-1;;;;;;;8633:897:1:o;9665:1720::-;-1:-1:-1;;;10415:63:1;;10501:13;;10397:3;;10523:75;10501:13;10586:2;10577:12;;10570:4;10558:17;;10523:75;:::i;:::-;10662:66;10657:2;10617:16;;;10649:11;;;10642:87;-1:-1:-1;;;10753:2:1;10745:11;;10738:38;-1:-1:-1;;;10800:2:1;10792:11;;10785:67;10877:13;;10899:76;10877:13;10961:2;10953:11;;10946:4;10934:17;;10899:76;:::i;:::-;11040:66;11035:2;10994:17;;;;11027:11;;;11020:87;-1:-1:-1;;;11131:3:1;11123:12;;11116:30;11171:13;;11193:77;11171:13;11255:3;11247:12;;11240:4;11228:17;;11193:77;:::i;:::-;-1:-1:-1;;;11330:3:1;11289:17;;;;11322:12;;;11315:36;11375:3;11367:12;;9665:1720;-1:-1:-1;;;;;9665:1720:1:o;11390:461::-;11652:31;11647:3;11640:44;11622:3;11713:6;11707:13;11729:75;11797:6;11792:2;11787:3;11783:12;11776:4;11768:6;11764:17;11729:75;:::i;:::-;11824:16;;;;11842:2;11820:25;;11390:461;-1:-1:-1;;11390:461:1:o;11856:1722::-;12570:66;12565:3;12558:79;12667:66;12662:2;12657:3;12653:12;12646:88;12764:34;12759:2;12754:3;12750:12;12743:56;12829:34;12824:2;12819:3;12815:12;12808:56;12904:28;12899:3;12895:38;12889:3;12884;12880:13;12873:61;12965:28;12959:3;12954;12950:13;12943:51;12540:3;13023:6;13017:13;13039:74;13106:6;13100:3;13095;13091:13;13086:2;13078:6;13074:15;13039:74;:::i;:::-;-1:-1:-1;;;13172:3:1;13132:16;;;13164:12;;;13157:36;13223:66;13217:3;13209:12;;13202:88;-1:-1:-1;;;13314:3:1;13306:12;;13299:77;13401:13;;13423:75;13401:13;13483:3;13475:12;;13470:2;13458:15;;13423:75;:::i;:::-;13514:58;13567:3;13556:8;13552:2;13548:17;13544:27;-1:-1:-1;;;9600:27:1;;9652:1;9643:11;;9535:125;13514:58;13507:65;11856:1722;-1:-1:-1;;;;;;11856:1722:1:o;14299:245::-;14366:6;14419:2;14407:9;14398:7;14394:23;14390:32;14387:52;;;14435:1;14432;14425:12;14387:52;14467:9;14461:16;14486:28;14508:5;14486:28;:::i;16498:249::-;16567:6;16620:2;16608:9;16599:7;16595:23;16591:32;16588:52;;;16636:1;16633;16626:12;16588:52;16668:9;16662:16;16687:30;16711:5;16687:30;:::i;17444:662::-;-1:-1:-1;;;;;17723:15:1;;;17705:34;;17775:15;;17770:2;17755:18;;17748:43;17822:2;17807:18;;17800:34;;;17870:3;17865:2;17850:18;;17843:31;;;17890:19;;17883:35;;;17648:4;17911:6;17961;17685:3;17940:19;;17927:49;18026:1;18020:3;18011:6;18000:9;17996:22;17992:32;17985:43;18096:3;18089:2;18085:7;18080:2;18072:6;18068:15;18064:29;18053:9;18049:45;18045:55;18037:63;;17444:662;;;;;;;;:::o;18111:128::-;18178:9;;;18199:11;;;18196:37;;;18213:18;;:::i;19686:125::-;19751:9;;;19772:10;;;19769:36;;;19785:18;;:::i;19816:136::-;19855:3;19883:5;19873:39;;19892:18;;:::i;:::-;-1:-1:-1;;;19928:18:1;;19816:136::o

Swarm Source

ipfs://8780f5fd5ed775d1d47307fc930576a5598a557c9c3f4637e2607d1dd2358151

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.