ETH Price: $3,452.50 (-1.96%)
Gas: 4 Gwei

Token

Faces of Rekt (FoR)
 

Overview

Max Total Supply

135 FoR

Holders

82

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 FoR
0x46540c666a5d42ea3c07fdc3ab6e11598b0d905e
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
FACES_OF_REKT_CONTRACT

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-27
*/

//By interacting with this contract, you agree to our terms and conditions. Please check our website for the latest version.

// SPDX-License-Identifier: UNLICENSED
/*  ______    ___    ______    ______   _____          ____     ______           ____     ______    __ __  ______
   / ____/   /   |  / ____/   / ____/  / ___/         / __ \   / ____/          / __ \   / ____/   / //_/ /_  __/
  / /_      / /| | / /       / __/     \__ \         / / / /  / /_             / /_/ /  / __/     / ,<     / /
 / __/     / ___ |/ /___    / /___    ___/ /        / /_/ /  / __/            / _, _/  / /___    / /| |   / /
/_/       /_/  |_|\____/   /_____/   /____/         \____/  /_/              /_/ |_|  /_____/   /_/ |_|  /_/
                                                                                                                 */


/*
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOOOOO,,,,,,,,,,,,O,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOOOOOOOOO,,,,,,,,,,,,OOOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,°OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOIFOOOOROOOOOOOOOOELSEOOOOOOOOOOOOOOOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOOOOOOOOOOOOOOOOOOE###OOOOOOWHILEOOOOOOOOOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOOOOOOOOOOO#####OOOOOOOOOOOOOO##OOOOOOOOOOOOOOOOO°],,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOFOROOOOOOOOOOOOOOOOOOOOOEE#OOOOO]°°]OOOOOOOOOOOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOOOOOOOOOOO]°.....°(OOOOOOOOO.°...........,O,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O]°O.........°OOOOOOO].............]OOOOO°..O,,,,,,,,,,,,,°°°,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O...........OO°........°..........°.....°OO.O,,,,,,,,°°°°°°°°°°°,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O..............OOO}}°..............OO°}},...O,,,,,,,,,}}°°}}]°}}],,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O....E........OOOOOO}}............COODE}}]..O,,,,,,,,,}}}}]°°°°°°°°,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O.............,COOODE]............,COODE}}.°O,,,,,,,,,,}}°}}°°°°°°°°,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O....°,........COOODE].............COODE}}.O,,,,,,,,,,,,,}}]°°°°°°°°,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O.....O........COOODE].............COODE]°.O,,,,,,,,,,,,]°]°°°°°°°°,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°,,,,O,...........COOODE].............COODE}}.O,,,,,,,,,,,}}°°°°}}],,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O,..}}].............COOODE].............COODE}}.O,,,,,,,,,,,,]°],,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O..°°}}.............COOODE].............COODE}}.O,,,,,,,,,,,]°°,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O..°°°°°............COOODE].............COODE]°..O,,,,,,,,,,}}°°°°°°°°,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O....°°°...........COOOODE]............COODE}}..O,,,,,,,,,,,}}]°°°°°°°,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OO...O...........COOODE}}.°.°......O.COODE}}].°O,,,,,,,,,,,,°]°°°°°°°,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O.................°°....°OOOOO°......°°°..O,,,,,,°]°°°°]°°°°°°,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O.......................................°O,,,,,],,}}}}°,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O.................    OOO.  .OOOOOO°....O,,O°°°°°°°°°O,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°...........,   ,° ,°,,,°°OOOOOE}}}}COOODE#COOOOODE##O,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°.......°..OOOOE...................COOODE°°°°°°°°###O,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°°.....°O°....................°O,,,,,,O#°°°°°°°###O,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°°°°°°°°°°°°O,,,,,,,,,,,,,,,,,COOOODE,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°°°°°°°°°°°°O,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OO#O]°°..°...]..°OO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OE###OOOO.......°...OO#EO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOO##O####O    °OO.....OO.O###E°,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOO############O######O        O.    O####O######OOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,OE###############OO########O    #OO###EOO O###OOO###########EE°,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,O###################O#########OOO.  O####O  O#####O##############O,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,O#####################O#########O    O####O   O####O###############O,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,O###############################O#E.#######O OO#####################O,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,O################################O##########OO#O#####################O,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,O#################################O#####OOOO####O#####################O,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,O#################################O#######O#####O#####################O,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,O##################################O#(#####O#####O#####################O,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,O################O#################O((##,##O#####O#############O########O,,,,,,,,,,,,,,,,,,,,,,,,
 */
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
// -------------------------------------------- ERC 721A n Stuff, just removed the comments, didn't edit anything this time ------------------

pragma solidity ^0.8.0;

library MerkleProof {

    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {

        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;

        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {

        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;


        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;

        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {

        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

pragma solidity ^0.8.0;
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    function toString(uint256 value) internal pure returns (string memory) {

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

pragma solidity ^0.8.0;

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

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

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

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

    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

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

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

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

        return (signer, RecoverError.NoError);
    }

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

    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {

        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

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

pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

pragma solidity ^0.8.0;

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor() {
        _transferOwnership(_msgSender());
    }

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

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.1;

library Address {

    function isContract(address account) internal view returns (bool) {

        return account.code.length > 0;
    }


    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

pragma solidity ^0.8.4;

interface IERC721A {

    error ApprovalCallerNotOwnerNorApproved();
    error ApprovalQueryForNonexistentToken();
    error ApproveToCaller();
    error BalanceQueryForZeroAddress();
    error MintToZeroAddress();
    error MintZeroQuantity();
    error OwnerQueryForNonexistentToken();
    error TransferCallerNotOwnerNorApproved();
    error TransferFromIncorrectOwner();
    error TransferToNonERC721ReceiverImplementer();
    error TransferToZeroAddress();
    error URIQueryForNonexistentToken();
    error MintERC2309QuantityExceedsLimit();
    error OwnershipNotInitializedForExtraData();


    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
        bool burned;
        uint24 extraData;
    }

    function totalSupply() external view returns (uint256);

    function supportsInterface(bytes4 interfaceId) external view returns (bool);

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

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

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

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);

    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

pragma solidity ^0.8.4;

interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract ERC721A is IERC721A {
    struct TokenApprovalRef {
        address value;
    }


    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    uint256 private constant _BITPOS_AUX = 192;

    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    uint256 private constant _BITMASK_BURNED = 1 << 224;

    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
    0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;


    uint256 private _currentIndex;

    uint256 private _burnCounter;

    string private _name;

    string private _symbol;

    mapping(uint256 => uint256) private _packedOwnerships;

    mapping(address => uint256) private _packedAddressData;

    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;


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


    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    function totalSupply() public view virtual override returns (uint256) {
    unchecked {
        return _currentIndex - _burnCounter - _startTokenId();
    }
    }

    function __burn_non_minted_token(uint16 amount) internal virtual {
        _currentIndex += amount;
    }

    function _totalMinted() internal view virtual returns (uint256) {
    unchecked {
        return _currentIndex - _startTokenId();
    }
    }

    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }


    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }


    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return
        interfaceId == 0x01ffc9a7 ||
        interfaceId == 0x80ac58cd ||
        interfaceId == 0x5b5e139f;
    }


    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

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


    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

    unchecked {
        if (_startTokenId() <= curr)
            if (curr < _currentIndex) {
                uint256 packed = _packedOwnerships[curr];
                if (packed & _BITMASK_BURNED == 0) {
                    while (packed == 0) {
                        packed = _packedOwnerships[--curr];
                    }
                    return packed;
                }
            }
    }
        revert OwnerQueryForNonexistentToken();
    }

    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            owner := and(owner, _BITMASK_ADDRESS)
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        assembly {
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }


    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);

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

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
        _startTokenId() <= tokenId &&
        tokenId < _currentIndex &&
        _packedOwnerships[tokenId] & _BITMASK_BURNED == 0;
    }

    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            owner := and(owner, _BITMASK_ADDRESS)
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    function _getApprovedSlotAndAddress(uint256 tokenId)
    private
    view
    returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }


    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        assembly {
            if approvedAddress {
                sstore(approvedAddressSlot, 0)
            }
        }

    unchecked {
        --_packedAddressData[from];
        ++_packedAddressData[to];

        _packedOwnerships[tokenId] = _packOwnershipData(
            to,
            _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
        );

        if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
            uint256 nextTokenId = tokenId + 1;
            if (_packedOwnerships[nextTokenId] == 0) {
                if (nextTokenId != _currentIndex) {
                    _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                }
            }
        }
    }

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }


    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

    unchecked {
        _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

        _packedOwnerships[startTokenId] = _packOwnershipData(
            to,
            _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
        );

        uint256 toMasked;
        uint256 end = startTokenId + quantity;

        assembly {
            toMasked := and(to, _BITMASK_ADDRESS)
            log4(
            0,
            0,
            _TRANSFER_EVENT_SIGNATURE,
            0,
            toMasked,
            startTokenId
            )

            for {
                let tokenId := add(startTokenId, 1)
            } iszero(eq(tokenId, end)) {
                tokenId := add(tokenId, 1)
            } {
                log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
            }
        }
        if (toMasked == 0) revert MintToZeroAddress();

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

    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

    unchecked {
        _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

        _packedOwnerships[startTokenId] = _packOwnershipData(
            to,
            _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
        );

        emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

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

    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

    unchecked {
        if (to.code.length != 0) {
            uint256 end = _currentIndex;
            uint256 index = end - quantity;
            do {
                if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
            } while (index < end);
            if (_currentIndex != end) revert();
        }
    }
    }

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


    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        assembly {
            if approvedAddress {
                sstore(approvedAddressSlot, 0)
            }
        }

    unchecked {
        _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

        _packedOwnerships[tokenId] = _packOwnershipData(
            from,
            (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
        );

        if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
            uint256 nextTokenId = tokenId + 1;
            if (_packedOwnerships[nextTokenId] == 0) {
                if (nextTokenId != _currentIndex) {
                    _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                }
            }
        }
    }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

    unchecked {
        _burnCounter++;
    }
    }


    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }


    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            str := add(mload(0x40), 0x80)
            mstore(0x40, str)

            let end := str

            for { let temp := value } 1 {} {
                str := sub(str, 1)
                mstore8(str, add(48, mod(temp, 10)))
                temp := div(temp, 10)
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            str := sub(str, 0x20)
            mstore(str, length)
        }
    }
}


// -------------------------------------------- ERC 721A n Stuff, just removed the comments, didn't edit anything this time ------------------
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//

pragma solidity ^0.8.14;

contract FACES_OF_REKT_CONTRACT is ERC721A, Ownable {

    using ECDSA for bytes32;

    string public _baseURIextended = "ipfs://QmPNh2m595pWnxRbSUSXxnTL91KHLQv1TQEgG8H4HUdDfR/"; // This one is used on OpenSea to define the metadata IPFS address

    bool public mint_paused = true; // in case someone tries to rekt our mint we can pause at will

    bool public whitelist_mint = true;

    struct token  {
        uint256 experience;
        bool is_staked;
        uint256 stake_date;
    }

    mapping(uint256 => token) public token_struct;

    mapping(uint8 => bytes32) public whiteListMapping;

    uint256 capMultiplier = 1;

    address public interacter_address;

    address public can_contract_address = 0x01E690c5D3cc89cea84F2a3C2CcB38410Ce2992D;

    address public multi_sig_wallet = 0x1eD3486C2Abe166cC10a57F54fA9E4D41F87dea4;

    uint public wl_mint_price = 0.05 ether;

    uint public public_mint_price = 0.08  ether;

    mapping(address => uint8) private free_mint_already_minted ;

    constructor() ERC721A("Faces of Rekt", "FoR") {
        whiteListMapping[0] = 0xa6ed8e5f435cf2dee09434b2fc9bd6cf7bba099d9af57bfdb60803d8d8818294;
        whiteListMapping[1] = 0x32a9ce9fccbe0bf6a0e0b5fd4147e3690c7be43f9b95d848a2d6c15b34015c1a;
    }

    function set_Base_URI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

    function set_Can_Address(address canContract) external onlyOwner() {
        can_contract_address = canContract;
    }

    function switch_Mint_State() external onlyOwner() {

        mint_paused = !mint_paused;

    }

    function switch_Whitelist_Mint_State() external onlyOwner() {

        whitelist_mint = !whitelist_mint;

    }

    function burn(uint16 amount) external onlyOwner() {

        __burn_non_minted_token(amount);

    }

    function _baseURI() internal view virtual override returns (string memory) {

        return _baseURIextended;

    }

    function set_Whitelist_MerkleRoot(bytes32 newMerkleRoot_, uint8 _id) external onlyOwner {

        whiteListMapping[_id] = newMerkleRoot_;

    }


    function bulk_give_Exp (uint256 xp_amount, uint16[]memory id_array) external {

        require(msg.sender == interacter_address || msg.sender == owner(), "Not an interacter");

        for (uint index = 0; index < id_array.length; index++) {

            token_struct[id_array[index]].experience += xp_amount;

        }

    }

    function giveExp (uint16 tokenId, uint256 xp_amount) external {

        require(msg.sender == interacter_address || msg.sender == owner(), "Not an interacter");
        token_struct[tokenId].experience += xp_amount;

    }

    function setMarketCapMultiplier (bytes32[] memory proof, uint256 _capMultiplier) external {

        require(MerkleProof.verify(
            proof,
            whiteListMapping[2],
            keccak256(abi.encodePacked(msg.sender))) || msg.sender == owner(), "Not whitelisted");

        capMultiplier = _capMultiplier;
    }

    function M_I_N_T(bytes32[] memory proof, uint16 quantity) public payable {


        require((totalSupply() + quantity) < 10000, "Sold out");

        if (whitelist_mint) {

            require(msg.value == (wl_mint_price * quantity));

            require(MerkleProof.verify(
                    proof,
                    whiteListMapping[0],
                    keccak256(abi.encodePacked(msg.sender))), "Not whitelisted");

            Can_contract spray_can = Can_contract(can_contract_address);

            if(quantity + _numberMinted(msg.sender) > 2) {
                require(
                    spray_can.balanceOf(msg.sender)
                    >= quantity + _numberMinted(msg.sender),
                    "Can't mint more faces than canz");
            }

        } else {
            require(msg.value == (public_mint_price * quantity));
        }

        require(!mint_paused, ">MINT PAUSED< If you're getting this message, shit went down. >MINT PAUSED<");



        _safeMint(msg.sender, quantity);

    }

    function getExpBonus(uint16 tokenId) external { // this is used in order to "save" the bonus exp you got from any of ours events

        require(ownerOf(tokenId) == msg.sender, "You're not the owner of this token"); // ofc you can only grab that for your tokens

        token_struct[tokenId].experience += (block.timestamp - token_struct[tokenId].stake_date) * capMultiplier; // today minus stake date times multiplier
        token_struct[tokenId].stake_date = block.timestamp; // and today is your new stake date
        // so basically what we did was multiplying the amount of time you've already staked by our event multiplier, and then set today as the new stake date.

    }

    function switch_stake(uint16 tokenId) external { // switchs between staked and not staked.

        require(ownerOf(tokenId) == msg.sender, "You're not the owner of this token"); // of course you can't unstake or stake someone else's token right?

        token_struct[tokenId].is_staked ? // the token is staked?

        token_struct[tokenId].experience += (block.timestamp - token_struct[tokenId].stake_date) : // yes? then give exp

        token_struct[tokenId].stake_date = block.timestamp; // no? then start staking date

        token_struct[tokenId].is_staked = !token_struct[tokenId].is_staked; // either way its now the oposite.

    }

    function check_Xp_Owned(uint16 tokenId)public view returns (uint256) { // at any time, us or any of you, can check how much xp a token has

        return token_struct[tokenId].is_staked ? // is staked

        (block.timestamp - token_struct[tokenId].stake_date + token_struct[tokenId].experience) : // if it is, calcs the time staked, plus the experience saved.

        token_struct[tokenId].experience; // else just return the experience saved.

    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual override {

        require(!token_struct[startTokenId].is_staked, "Staked transfer"); // this is to prevent sale while staking
        // the problem with this is that people can still list their token on open sea or rarible etc... but only who buys gets the error.
        // you also get the error trying to do a free transfer.
    }

    function withdraw() external onlyOwner {            // only the owner can withdraw
        address payable to = payable(multi_sig_wallet); // goes direct to the multi_sig_wallet
        to.transfer(address(this).balance);             // to is the gnosis wallet, address(this) is the contract.


    }

    function dev_mint(uint16 quantity) external onlyOwner { // dev mint for airdrops and free mints
        require((totalSupply() + quantity) < 10000, "Sold out");
        _safeMint(msg.sender, quantity);
    }

    function free_M_I_N_T(bytes32[] memory proof) public {


        require(totalSupply() + 1 < 10000, "sold out");
        require(MerkleProof.verify(
                proof,
                whiteListMapping[1],
                keccak256(abi.encodePacked(msg.sender))), "Not whitelisted");
        require(free_mint_already_minted[msg.sender] < 1, "Only one free mint please");
        require(!mint_paused, ">MINT PAUSED< If you're getting this message, shit went down. >MINT PAUSED<");

        _safeMint(msg.sender, 1);
        free_mint_already_minted[msg.sender] += 1;

    }

}

pragma solidity 0.8.14;

interface Can_contract {

    function balanceOf(address owner) external view returns (uint256 balance);

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint16","name":"quantity","type":"uint16"}],"name":"M_I_N_T","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"_baseURIextended","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"xp_amount","type":"uint256"},{"internalType":"uint16[]","name":"id_array","type":"uint16[]"}],"name":"bulk_give_Exp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"can_contract_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"check_Xp_Owned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"quantity","type":"uint16"}],"name":"dev_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"free_M_I_N_T","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"getExpBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"},{"internalType":"uint256","name":"xp_amount","type":"uint256"}],"name":"giveExp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interacter_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multi_sig_wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"public_mint_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"_capMultiplier","type":"uint256"}],"name":"setMarketCapMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"set_Base_URI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"canContract","type":"address"}],"name":"set_Can_Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot_","type":"bytes32"},{"internalType":"uint8","name":"_id","type":"uint8"}],"name":"set_Whitelist_MerkleRoot","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":"switch_Mint_State","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switch_Whitelist_Mint_State","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"switch_stake","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"token_struct","outputs":[{"internalType":"uint256","name":"experience","type":"uint256"},{"internalType":"bool","name":"is_staked","type":"bool"},{"internalType":"uint256","name":"stake_date","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"whiteListMapping","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelist_mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wl_mint_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60e06040526036608081815290620029f360a039805162000029916009916020909101906200020d565b50600a805461010161ffff199091161790556001600d55600f80546001600160a01b03199081167301e690c5d3cc89cea84f2a3c2ccb38410ce2992d1790915560108054909116731ed3486c2abe166cc10a57f54fa9e4d41f87dea417905566b1a2bc2ec5000060115567011c37937e080000601255348015620000ac57600080fd5b50604080518082018252600d81526c119858d95cc81bd98814995add609a1b6020808301918252835180850190945260038452622337a960e91b908401528151919291620000fd916002916200020d565b508051620001139060039060208401906200020d565b505060008055506200012533620001bb565b600c6020527fa6ed8e5f435cf2dee09434b2fc9bd6cf7bba099d9af57bfdb60803d8d88182947f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e85560016000527f32a9ce9fccbe0bf6a0e0b5fd4147e3690c7be43f9b95d848a2d6c15b34015c1a7fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c55620002ef565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200021b90620002b3565b90600052602060002090601f0160209004810192826200023f57600085556200028a565b82601f106200025a57805160ff19168380011785556200028a565b828001600101855582156200028a579182015b828111156200028a5782518255916020019190600101906200026d565b50620002989291506200029c565b5090565b5b808211156200029857600081556001016200029d565b600181811c90821680620002c857607f821691505b602082108103620002e957634e487b7160e01b600052602260045260246000fd5b50919050565b6126f480620002ff6000396000f3fe60806040526004361061025c5760003560e01c8063715018a611610144578063c87b56dd116100b6578063eee9a0951161007a578063eee9a0951461070c578063ef1f0ac01461071f578063ef25581e1461073f578063f1afc7731461075f578063f2fde38b146107b9578063ff8f1357146107d957600080fd5b8063c87b56dd1461064d578063cbf94a3d1461066d578063dd9acb491461068d578063e985e9c5146106a3578063ed133f8c146106ec57600080fd5b806395d89b411161010857806395d89b41146105a9578063a22cb465146105be578063aa59a2b2146105de578063b88d4fde146105f3578063c52e712114610613578063c7d272281461063357600080fd5b8063715018a61461052157806377714257146105365780637c5f39c11461055657806381ca52ad146105765780638da5cb5b1461058b57600080fd5b806323b872dd116101dd57806346f0d131116101a157806346f0d131146104555780634b89e00414610475578063536f502e146104a257806356ab561c146104c25780636352211e146104e157806370a082311461050157600080fd5b806323b872dd146103c0578063251a95c3146103e05780633b8b8a0b146104005780633ccfd60b1461042057806342842e0e1461043557600080fd5b8063095ea7b311610224578063095ea7b31461032557806318160ddd1461034757806319ac6f691461036a5780631c4df70e1461038a57806322096008146103a057600080fd5b806301ffc9a71461026157806305c888ff1461029657806306fdde03146102ce578063081812fc146102f05780630928fc2214610310575b600080fd5b34801561026d57600080fd5b5061028161027c366004611e7e565b6107f9565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b50600e546102b6906001600160a01b031681565b6040516001600160a01b03909116815260200161028d565b3480156102da57600080fd5b506102e361084b565b60405161028d9190611ef3565b3480156102fc57600080fd5b506102b661030b366004611f06565b6108dd565b34801561031c57600080fd5b506102e3610921565b34801561033157600080fd5b50610345610340366004611f3b565b6109af565b005b34801561035357600080fd5b50600154600054035b60405190815260200161028d565b34801561037657600080fd5b50610345610385366004611f77565b610a4f565b34801561039657600080fd5b5061035c60115481565b3480156103ac57600080fd5b506010546102b6906001600160a01b031681565b3480156103cc57600080fd5b506103456103db366004611f92565b610a8e565b3480156103ec57600080fd5b506103456103fb366004612039565b610c33565b34801561040c57600080fd5b5061034561041b36600461213a565b610d02565b34801561042c57600080fd5b50610345610d43565b34801561044157600080fd5b50610345610450366004611f92565b610da8565b34801561046157600080fd5b50610345610470366004612183565b610dc3565b34801561048157600080fd5b5061035c6104903660046121af565b600c6020526000908152604090205481565b3480156104ae57600080fd5b5061035c6104bd366004611f77565b610e0f565b3480156104ce57600080fd5b50600a5461028190610100900460ff1681565b3480156104ed57600080fd5b506102b66104fc366004611f06565b610e75565b34801561050d57600080fd5b5061035c61051c366004612183565b610e80565b34801561052d57600080fd5b50610345610ecf565b34801561054257600080fd5b50610345610551366004612230565b610f05565b34801561056257600080fd5b50610345610571366004611f77565b6110b0565b34801561058257600080fd5b5061034561113f565b34801561059757600080fd5b506008546001600160a01b03166102b6565b3480156105b557600080fd5b506102e361117d565b3480156105ca57600080fd5b506103456105d9366004612265565b61118c565b3480156105ea57600080fd5b50610345611221565b3480156105ff57600080fd5b5061034561060e3660046122a1565b611268565b34801561061f57600080fd5b5061034561062e36600461231d565b6112b2565b34801561063f57600080fd5b50600a546102819060ff1681565b34801561065957600080fd5b506102e3610668366004611f06565b6112f0565b34801561067957600080fd5b50610345610688366004611f77565b611374565b34801561069957600080fd5b5061035c60125481565b3480156106af57600080fd5b506102816106be366004612349565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156106f857600080fd5b50610345610707366004612373565b611419565b61034561071a36600461238f565b6114a8565b34801561072b57600080fd5b5061034561073a3660046123d4565b611720565b34801561074b57600080fd5b50600f546102b6906001600160a01b031681565b34801561076b57600080fd5b5061079e61077a366004611f06565b600b60205260009081526040902080546001820154600290920154909160ff169083565b6040805193845291151560208401529082015260600161028d565b3480156107c557600080fd5b506103456107d4366004612183565b6117ac565b3480156107e557600080fd5b506103456107f4366004611f77565b611844565b60006301ffc9a760e01b6001600160e01b03198316148061082a57506380ac58cd60e01b6001600160e01b03198316145b806108455750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461085a90612419565b80601f016020809104026020016040519081016040528092919081815260200182805461088690612419565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050905090565b60006108e88261192a565b610905576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6009805461092e90612419565b80601f016020809104026020016040519081016040528092919081815260200182805461095a90612419565b80156109a75780601f1061097c576101008083540402835291602001916109a7565b820191906000526020600020905b81548152906001019060200180831161098a57829003601f168201915b505050505081565b60006109ba82610e75565b9050336001600160a01b038216146109f3576109d681336106be565b6109f3576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610a825760405162461bcd60e51b8152600401610a7990612453565b60405180910390fd5b610a8b81611951565b50565b6000610a998261196e565b9050836001600160a01b0316816001600160a01b031614610acc5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610b1957610afc86336106be565b610b1957604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610b4057604051633a954ecd60e21b815260040160405180910390fd5b610b4d86868660016119d5565b8015610b5857600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610bea57600184016000818152600460205260408120549003610be8576000548114610be85760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600e546001600160a01b0316331480610c5657506008546001600160a01b031633145b610c965760405162461bcd60e51b81526020600482015260116024820152702737ba1030b71034b73a32b930b1ba32b960791b6044820152606401610a79565b60005b8151811015610cfd5782600b6000848481518110610cb957610cb9612488565b602002602001015161ffff1681526020019081526020016000206000016000828254610ce591906124b4565b90915550819050610cf5816124cc565b915050610c99565b505050565b6008546001600160a01b03163314610d2c5760405162461bcd60e51b8152600401610a7990612453565b8051610d3f906009906020840190611dcf565b5050565b6008546001600160a01b03163314610d6d5760405162461bcd60e51b8152600401610a7990612453565b6010546040516001600160a01b039091169081904780156108fc02916000818181858888f19350505050158015610d3f573d6000803e3d6000fd5b610cfd83838360405180602001604052806000815250611268565b6008546001600160a01b03163314610ded5760405162461bcd60e51b8152600401610a7990612453565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b61ffff81166000908152600b602052604081206001015460ff16610e465761ffff82166000908152600b6020526040902054610845565b61ffff82166000908152600b602052604090208054600290910154610e6b90426124e5565b61084591906124b4565b60006108458261196e565b60006001600160a01b038216610ea9576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610ef95760405162461bcd60e51b8152600401610a7990612453565b610f036000611a29565b565b612710610f156001546000540390565b610f209060016124b4565b10610f585760405162461bcd60e51b81526020600482015260086024820152671cdbdb19081bdd5d60c21b6044820152606401610a79565b6001600052600c60209081527fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c546040516001600160601b03193360601b1692810192909252610fc4918391906034015b60405160208183030381529060405280519060200120611a7b565b610fe05760405162461bcd60e51b8152600401610a79906124fc565b33600090815260136020526040902054600160ff909116106110445760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79206f6e652066726565206d696e7420706c65617365000000000000006044820152606401610a79565b600a5460ff16156110675760405162461bcd60e51b8152600401610a7990612525565b611072336001611a91565b33600090815260136020526040812080546001929061109590849060ff16612596565b92506101000a81548160ff021916908360ff16021790555050565b6008546001600160a01b031633146110da5760405162461bcd60e51b8152600401610a7990612453565b6127108161ffff166110ef6001546000540390565b6110f991906124b4565b106111315760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610a79565b610a8b338261ffff16611a91565b6008546001600160a01b031633146111695760405162461bcd60e51b8152600401610a7990612453565b600a805460ff19811660ff90911615179055565b60606003805461085a90612419565b336001600160a01b038316036111b55760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b0316331461124b5760405162461bcd60e51b8152600401610a7990612453565b600a805461ff001981166101009182900460ff1615909102179055565b611273848484610a8e565b6001600160a01b0383163b156112ac5761128f84848484611aab565b6112ac576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146112dc5760405162461bcd60e51b8152600401610a7990612453565b60ff166000908152600c6020526040902055565b60606112fb8261192a565b61131857604051630a14c4b560e41b815260040160405180910390fd5b6000611322611b97565b90508051600003611342576040518060200160405280600081525061136d565b8061134c84611ba6565b60405160200161135d9291906125bb565b6040516020818303038152906040525b9392505050565b3361138261ffff8316610e75565b6001600160a01b0316146113a85760405162461bcd60e51b8152600401610a79906125ea565b600d5461ffff82166000908152600b60205260409020600201546113cc90426124e5565b6113d6919061262c565b61ffff82166000908152600b6020526040812080549091906113f99084906124b4565b909155505061ffff166000908152600b6020526040902042600290910155565b600e546001600160a01b031633148061143c57506008546001600160a01b031633145b61147c5760405162461bcd60e51b81526020600482015260116024820152702737ba1030b71034b73a32b930b1ba32b960791b6044820152606401610a79565b61ffff82166000908152600b60205260408120805483929061149f9084906124b4565b90915550505050565b6127108161ffff166114bd6001546000540390565b6114c791906124b4565b106114ff5760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610a79565b600a54610100900460ff16156116d2578061ffff16601154611521919061262c565b341461152c57600080fd5b60008052600c60209081527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e8546040516001600160601b03193360601b169281019290925261158091849190603401610fa9565b61159c5760405162461bcd60e51b8152600401610a79906124fc565b600f546001600160a01b031660026115d7336001600160a01b03166000908152600560205260409081902054901c67ffffffffffffffff1690565b6115e59061ffff85166124b4565b11156116cc57336000908152600560205260409081902054611616911c67ffffffffffffffff1661ffff84166124b4565b6040516370a0823160e01b81523360048201526001600160a01b038316906370a0823190602401602060405180830381865afa15801561165a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167e919061264b565b10156116cc5760405162461bcd60e51b815260206004820152601f60248201527f43616e2774206d696e74206d6f7265206661636573207468616e2063616e7a006044820152606401610a79565b506116ef565b8061ffff166012546116e4919061262c565b34146116ef57600080fd5b600a5460ff16156117125760405162461bcd60e51b8152600401610a7990612525565b610d3f338261ffff16611a91565b6002600052600c60209081527f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd720546040516001600160601b03193360601b169281019290925261177591849190603401610fa9565b8061178a57506008546001600160a01b031633145b6117a65760405162461bcd60e51b8152600401610a79906124fc565b600d5550565b6008546001600160a01b031633146117d65760405162461bcd60e51b8152600401610a7990612453565b6001600160a01b03811661183b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a79565b610a8b81611a29565b3361185261ffff8316610e75565b6001600160a01b0316146118785760405162461bcd60e51b8152600401610a79906125ea565b61ffff81166000908152600b602052604090206001015460ff166118b75761ffff81166000908152600b60205260409020426002909101819055611902565b61ffff81166000908152600b60205260409020600201546118d890426124e5565b61ffff82166000908152600b6020526040812080549091906118fb9084906124b4565b9250508190555b5061ffff166000908152600b60205260409020600101805460ff19811660ff90911615179055565b6000805482108015610845575050600090815260046020526040902054600160e01b161590565b8061ffff1660008082825461196691906124b4565b909155505050565b6000816000548110156119bc5760008181526004602052604081205490600160e01b821690036119ba575b8060000361136d575060001901600081815260046020526040902054611999565b505b604051636f96cda160e11b815260040160405180910390fd5b6000828152600b602052604090206001015460ff16156112ac5760405162461bcd60e51b815260206004820152600f60248201526e29ba30b5b2b2103a3930b739b332b960891b6044820152606401610a79565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082611a888584611bde565b14949350505050565b610d3f828260405180602001604052806000815250611c2b565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611ae0903390899088908890600401612664565b6020604051808303816000875af1925050508015611b1b575060408051601f3d908101601f19168201909252611b18918101906126a1565b60015b611b79573d808015611b49576040519150601f19603f3d011682016040523d82523d6000602084013e611b4e565b606091505b508051600003611b71576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606009805461085a90612419565b604080516080019081905280825b600183039250600a81066030018353600a900480611bb45750819003601f19909101908152919050565b600081815b8451811015611c2357611c0f82868381518110611c0257611c02612488565b6020026020010151611c98565b915080611c1b816124cc565b915050611be3565b509392505050565b611c358383611cc4565b6001600160a01b0383163b15610cfd576000548281035b611c5f6000868380600101945086611aab565b611c7c576040516368d2bf6b60e11b815260040160405180910390fd5b818110611c4c578160005414611c9157600080fd5b5050505050565b6000818310611cb457600082815260208490526040902061136d565b5060009182526020526040902090565b6000805490829003611ce95760405163b562e8dd60e01b815260040160405180910390fd5b611cf660008483856119d5565b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611da557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611d6d565b5081600003611dc657604051622e076360e81b815260040160405180910390fd5b60005550505050565b828054611ddb90612419565b90600052602060002090601f016020900481019282611dfd5760008555611e43565b82601f10611e1657805160ff1916838001178555611e43565b82800160010185558215611e43579182015b82811115611e43578251825591602001919060010190611e28565b50611e4f929150611e53565b5090565b5b80821115611e4f5760008155600101611e54565b6001600160e01b031981168114610a8b57600080fd5b600060208284031215611e9057600080fd5b813561136d81611e68565b60005b83811015611eb6578181015183820152602001611e9e565b838111156112ac5750506000910152565b60008151808452611edf816020860160208601611e9b565b601f01601f19169290920160200192915050565b60208152600061136d6020830184611ec7565b600060208284031215611f1857600080fd5b5035919050565b80356001600160a01b0381168114611f3657600080fd5b919050565b60008060408385031215611f4e57600080fd5b611f5783611f1f565b946020939093013593505050565b803561ffff81168114611f3657600080fd5b600060208284031215611f8957600080fd5b61136d82611f65565b600080600060608486031215611fa757600080fd5b611fb084611f1f565b9250611fbe60208501611f1f565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561200d5761200d611fce565b604052919050565b600067ffffffffffffffff82111561202f5761202f611fce565b5060051b60200190565b6000806040838503121561204c57600080fd5b8235915060208084013567ffffffffffffffff81111561206b57600080fd5b8401601f8101861361207c57600080fd5b803561208f61208a82612015565b611fe4565b81815260059190911b820183019083810190888311156120ae57600080fd5b928401925b828410156120d3576120c484611f65565b825292840192908401906120b3565b80955050505050509250929050565b600067ffffffffffffffff8311156120fc576120fc611fce565b61210f601f8401601f1916602001611fe4565b905082815283838301111561212357600080fd5b828260208301376000602084830101529392505050565b60006020828403121561214c57600080fd5b813567ffffffffffffffff81111561216357600080fd5b8201601f8101841361217457600080fd5b611b8f848235602084016120e2565b60006020828403121561219557600080fd5b61136d82611f1f565b803560ff81168114611f3657600080fd5b6000602082840312156121c157600080fd5b61136d8261219e565b600082601f8301126121db57600080fd5b813560206121eb61208a83612015565b82815260059290921b8401810191818101908684111561220a57600080fd5b8286015b84811015612225578035835291830191830161220e565b509695505050505050565b60006020828403121561224257600080fd5b813567ffffffffffffffff81111561225957600080fd5b611b8f848285016121ca565b6000806040838503121561227857600080fd5b61228183611f1f565b91506020830135801515811461229657600080fd5b809150509250929050565b600080600080608085870312156122b757600080fd5b6122c085611f1f565b93506122ce60208601611f1f565b925060408501359150606085013567ffffffffffffffff8111156122f157600080fd5b8501601f8101871361230257600080fd5b612311878235602084016120e2565b91505092959194509250565b6000806040838503121561233057600080fd5b823591506123406020840161219e565b90509250929050565b6000806040838503121561235c57600080fd5b61236583611f1f565b915061234060208401611f1f565b6000806040838503121561238657600080fd5b611f5783611f65565b600080604083850312156123a257600080fd5b823567ffffffffffffffff8111156123b957600080fd5b6123c5858286016121ca565b92505061234060208401611f65565b600080604083850312156123e757600080fd5b823567ffffffffffffffff8111156123fe57600080fd5b61240a858286016121ca565b95602094909401359450505050565b600181811c9082168061242d57607f821691505b60208210810361244d57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156124c7576124c761249e565b500190565b6000600182016124de576124de61249e565b5060010190565b6000828210156124f7576124f761249e565b500390565b6020808252600f908201526e139bdd081dda1a5d195b1a5cdd1959608a1b604082015260600190565b6020808252604b908201527f3e4d494e54205041555345443c20496620796f752772652067657474696e672060408201527f74686973206d6573736167652c20736869742077656e7420646f776e2e203e4d60608201526a1253950814105554d1510f60aa1b608082015260a00190565b600060ff821660ff84168060ff038211156125b3576125b361249e565b019392505050565b600083516125cd818460208801611e9b565b8351908301906125e1818360208801611e9b565b01949350505050565b60208082526022908201527f596f75277265206e6f7420746865206f776e6572206f66207468697320746f6b60408201526132b760f11b606082015260800190565b60008160001904831182151516156126465761264661249e565b500290565b60006020828403121561265d57600080fd5b5051919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061269790830184611ec7565b9695505050505050565b6000602082840312156126b357600080fd5b815161136d81611e6856fea264697066735822122082f72e2d4858567ef0eb04f220552aa493c3b3369020674b03527266baca0d3b64736f6c634300080e0033697066733a2f2f516d504e68326d35393570576e78526253555358786e544c39314b484c51763154514567473848344855644466522f

Deployed Bytecode

0x60806040526004361061025c5760003560e01c8063715018a611610144578063c87b56dd116100b6578063eee9a0951161007a578063eee9a0951461070c578063ef1f0ac01461071f578063ef25581e1461073f578063f1afc7731461075f578063f2fde38b146107b9578063ff8f1357146107d957600080fd5b8063c87b56dd1461064d578063cbf94a3d1461066d578063dd9acb491461068d578063e985e9c5146106a3578063ed133f8c146106ec57600080fd5b806395d89b411161010857806395d89b41146105a9578063a22cb465146105be578063aa59a2b2146105de578063b88d4fde146105f3578063c52e712114610613578063c7d272281461063357600080fd5b8063715018a61461052157806377714257146105365780637c5f39c11461055657806381ca52ad146105765780638da5cb5b1461058b57600080fd5b806323b872dd116101dd57806346f0d131116101a157806346f0d131146104555780634b89e00414610475578063536f502e146104a257806356ab561c146104c25780636352211e146104e157806370a082311461050157600080fd5b806323b872dd146103c0578063251a95c3146103e05780633b8b8a0b146104005780633ccfd60b1461042057806342842e0e1461043557600080fd5b8063095ea7b311610224578063095ea7b31461032557806318160ddd1461034757806319ac6f691461036a5780631c4df70e1461038a57806322096008146103a057600080fd5b806301ffc9a71461026157806305c888ff1461029657806306fdde03146102ce578063081812fc146102f05780630928fc2214610310575b600080fd5b34801561026d57600080fd5b5061028161027c366004611e7e565b6107f9565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b50600e546102b6906001600160a01b031681565b6040516001600160a01b03909116815260200161028d565b3480156102da57600080fd5b506102e361084b565b60405161028d9190611ef3565b3480156102fc57600080fd5b506102b661030b366004611f06565b6108dd565b34801561031c57600080fd5b506102e3610921565b34801561033157600080fd5b50610345610340366004611f3b565b6109af565b005b34801561035357600080fd5b50600154600054035b60405190815260200161028d565b34801561037657600080fd5b50610345610385366004611f77565b610a4f565b34801561039657600080fd5b5061035c60115481565b3480156103ac57600080fd5b506010546102b6906001600160a01b031681565b3480156103cc57600080fd5b506103456103db366004611f92565b610a8e565b3480156103ec57600080fd5b506103456103fb366004612039565b610c33565b34801561040c57600080fd5b5061034561041b36600461213a565b610d02565b34801561042c57600080fd5b50610345610d43565b34801561044157600080fd5b50610345610450366004611f92565b610da8565b34801561046157600080fd5b50610345610470366004612183565b610dc3565b34801561048157600080fd5b5061035c6104903660046121af565b600c6020526000908152604090205481565b3480156104ae57600080fd5b5061035c6104bd366004611f77565b610e0f565b3480156104ce57600080fd5b50600a5461028190610100900460ff1681565b3480156104ed57600080fd5b506102b66104fc366004611f06565b610e75565b34801561050d57600080fd5b5061035c61051c366004612183565b610e80565b34801561052d57600080fd5b50610345610ecf565b34801561054257600080fd5b50610345610551366004612230565b610f05565b34801561056257600080fd5b50610345610571366004611f77565b6110b0565b34801561058257600080fd5b5061034561113f565b34801561059757600080fd5b506008546001600160a01b03166102b6565b3480156105b557600080fd5b506102e361117d565b3480156105ca57600080fd5b506103456105d9366004612265565b61118c565b3480156105ea57600080fd5b50610345611221565b3480156105ff57600080fd5b5061034561060e3660046122a1565b611268565b34801561061f57600080fd5b5061034561062e36600461231d565b6112b2565b34801561063f57600080fd5b50600a546102819060ff1681565b34801561065957600080fd5b506102e3610668366004611f06565b6112f0565b34801561067957600080fd5b50610345610688366004611f77565b611374565b34801561069957600080fd5b5061035c60125481565b3480156106af57600080fd5b506102816106be366004612349565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156106f857600080fd5b50610345610707366004612373565b611419565b61034561071a36600461238f565b6114a8565b34801561072b57600080fd5b5061034561073a3660046123d4565b611720565b34801561074b57600080fd5b50600f546102b6906001600160a01b031681565b34801561076b57600080fd5b5061079e61077a366004611f06565b600b60205260009081526040902080546001820154600290920154909160ff169083565b6040805193845291151560208401529082015260600161028d565b3480156107c557600080fd5b506103456107d4366004612183565b6117ac565b3480156107e557600080fd5b506103456107f4366004611f77565b611844565b60006301ffc9a760e01b6001600160e01b03198316148061082a57506380ac58cd60e01b6001600160e01b03198316145b806108455750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461085a90612419565b80601f016020809104026020016040519081016040528092919081815260200182805461088690612419565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050905090565b60006108e88261192a565b610905576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6009805461092e90612419565b80601f016020809104026020016040519081016040528092919081815260200182805461095a90612419565b80156109a75780601f1061097c576101008083540402835291602001916109a7565b820191906000526020600020905b81548152906001019060200180831161098a57829003601f168201915b505050505081565b60006109ba82610e75565b9050336001600160a01b038216146109f3576109d681336106be565b6109f3576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610a825760405162461bcd60e51b8152600401610a7990612453565b60405180910390fd5b610a8b81611951565b50565b6000610a998261196e565b9050836001600160a01b0316816001600160a01b031614610acc5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610b1957610afc86336106be565b610b1957604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610b4057604051633a954ecd60e21b815260040160405180910390fd5b610b4d86868660016119d5565b8015610b5857600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610bea57600184016000818152600460205260408120549003610be8576000548114610be85760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600e546001600160a01b0316331480610c5657506008546001600160a01b031633145b610c965760405162461bcd60e51b81526020600482015260116024820152702737ba1030b71034b73a32b930b1ba32b960791b6044820152606401610a79565b60005b8151811015610cfd5782600b6000848481518110610cb957610cb9612488565b602002602001015161ffff1681526020019081526020016000206000016000828254610ce591906124b4565b90915550819050610cf5816124cc565b915050610c99565b505050565b6008546001600160a01b03163314610d2c5760405162461bcd60e51b8152600401610a7990612453565b8051610d3f906009906020840190611dcf565b5050565b6008546001600160a01b03163314610d6d5760405162461bcd60e51b8152600401610a7990612453565b6010546040516001600160a01b039091169081904780156108fc02916000818181858888f19350505050158015610d3f573d6000803e3d6000fd5b610cfd83838360405180602001604052806000815250611268565b6008546001600160a01b03163314610ded5760405162461bcd60e51b8152600401610a7990612453565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b61ffff81166000908152600b602052604081206001015460ff16610e465761ffff82166000908152600b6020526040902054610845565b61ffff82166000908152600b602052604090208054600290910154610e6b90426124e5565b61084591906124b4565b60006108458261196e565b60006001600160a01b038216610ea9576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610ef95760405162461bcd60e51b8152600401610a7990612453565b610f036000611a29565b565b612710610f156001546000540390565b610f209060016124b4565b10610f585760405162461bcd60e51b81526020600482015260086024820152671cdbdb19081bdd5d60c21b6044820152606401610a79565b6001600052600c60209081527fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c546040516001600160601b03193360601b1692810192909252610fc4918391906034015b60405160208183030381529060405280519060200120611a7b565b610fe05760405162461bcd60e51b8152600401610a79906124fc565b33600090815260136020526040902054600160ff909116106110445760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79206f6e652066726565206d696e7420706c65617365000000000000006044820152606401610a79565b600a5460ff16156110675760405162461bcd60e51b8152600401610a7990612525565b611072336001611a91565b33600090815260136020526040812080546001929061109590849060ff16612596565b92506101000a81548160ff021916908360ff16021790555050565b6008546001600160a01b031633146110da5760405162461bcd60e51b8152600401610a7990612453565b6127108161ffff166110ef6001546000540390565b6110f991906124b4565b106111315760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610a79565b610a8b338261ffff16611a91565b6008546001600160a01b031633146111695760405162461bcd60e51b8152600401610a7990612453565b600a805460ff19811660ff90911615179055565b60606003805461085a90612419565b336001600160a01b038316036111b55760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b0316331461124b5760405162461bcd60e51b8152600401610a7990612453565b600a805461ff001981166101009182900460ff1615909102179055565b611273848484610a8e565b6001600160a01b0383163b156112ac5761128f84848484611aab565b6112ac576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146112dc5760405162461bcd60e51b8152600401610a7990612453565b60ff166000908152600c6020526040902055565b60606112fb8261192a565b61131857604051630a14c4b560e41b815260040160405180910390fd5b6000611322611b97565b90508051600003611342576040518060200160405280600081525061136d565b8061134c84611ba6565b60405160200161135d9291906125bb565b6040516020818303038152906040525b9392505050565b3361138261ffff8316610e75565b6001600160a01b0316146113a85760405162461bcd60e51b8152600401610a79906125ea565b600d5461ffff82166000908152600b60205260409020600201546113cc90426124e5565b6113d6919061262c565b61ffff82166000908152600b6020526040812080549091906113f99084906124b4565b909155505061ffff166000908152600b6020526040902042600290910155565b600e546001600160a01b031633148061143c57506008546001600160a01b031633145b61147c5760405162461bcd60e51b81526020600482015260116024820152702737ba1030b71034b73a32b930b1ba32b960791b6044820152606401610a79565b61ffff82166000908152600b60205260408120805483929061149f9084906124b4565b90915550505050565b6127108161ffff166114bd6001546000540390565b6114c791906124b4565b106114ff5760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b6044820152606401610a79565b600a54610100900460ff16156116d2578061ffff16601154611521919061262c565b341461152c57600080fd5b60008052600c60209081527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e8546040516001600160601b03193360601b169281019290925261158091849190603401610fa9565b61159c5760405162461bcd60e51b8152600401610a79906124fc565b600f546001600160a01b031660026115d7336001600160a01b03166000908152600560205260409081902054901c67ffffffffffffffff1690565b6115e59061ffff85166124b4565b11156116cc57336000908152600560205260409081902054611616911c67ffffffffffffffff1661ffff84166124b4565b6040516370a0823160e01b81523360048201526001600160a01b038316906370a0823190602401602060405180830381865afa15801561165a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167e919061264b565b10156116cc5760405162461bcd60e51b815260206004820152601f60248201527f43616e2774206d696e74206d6f7265206661636573207468616e2063616e7a006044820152606401610a79565b506116ef565b8061ffff166012546116e4919061262c565b34146116ef57600080fd5b600a5460ff16156117125760405162461bcd60e51b8152600401610a7990612525565b610d3f338261ffff16611a91565b6002600052600c60209081527f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd720546040516001600160601b03193360601b169281019290925261177591849190603401610fa9565b8061178a57506008546001600160a01b031633145b6117a65760405162461bcd60e51b8152600401610a79906124fc565b600d5550565b6008546001600160a01b031633146117d65760405162461bcd60e51b8152600401610a7990612453565b6001600160a01b03811661183b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a79565b610a8b81611a29565b3361185261ffff8316610e75565b6001600160a01b0316146118785760405162461bcd60e51b8152600401610a79906125ea565b61ffff81166000908152600b602052604090206001015460ff166118b75761ffff81166000908152600b60205260409020426002909101819055611902565b61ffff81166000908152600b60205260409020600201546118d890426124e5565b61ffff82166000908152600b6020526040812080549091906118fb9084906124b4565b9250508190555b5061ffff166000908152600b60205260409020600101805460ff19811660ff90911615179055565b6000805482108015610845575050600090815260046020526040902054600160e01b161590565b8061ffff1660008082825461196691906124b4565b909155505050565b6000816000548110156119bc5760008181526004602052604081205490600160e01b821690036119ba575b8060000361136d575060001901600081815260046020526040902054611999565b505b604051636f96cda160e11b815260040160405180910390fd5b6000828152600b602052604090206001015460ff16156112ac5760405162461bcd60e51b815260206004820152600f60248201526e29ba30b5b2b2103a3930b739b332b960891b6044820152606401610a79565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082611a888584611bde565b14949350505050565b610d3f828260405180602001604052806000815250611c2b565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611ae0903390899088908890600401612664565b6020604051808303816000875af1925050508015611b1b575060408051601f3d908101601f19168201909252611b18918101906126a1565b60015b611b79573d808015611b49576040519150601f19603f3d011682016040523d82523d6000602084013e611b4e565b606091505b508051600003611b71576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606009805461085a90612419565b604080516080019081905280825b600183039250600a81066030018353600a900480611bb45750819003601f19909101908152919050565b600081815b8451811015611c2357611c0f82868381518110611c0257611c02612488565b6020026020010151611c98565b915080611c1b816124cc565b915050611be3565b509392505050565b611c358383611cc4565b6001600160a01b0383163b15610cfd576000548281035b611c5f6000868380600101945086611aab565b611c7c576040516368d2bf6b60e11b815260040160405180910390fd5b818110611c4c578160005414611c9157600080fd5b5050505050565b6000818310611cb457600082815260208490526040902061136d565b5060009182526020526040902090565b6000805490829003611ce95760405163b562e8dd60e01b815260040160405180910390fd5b611cf660008483856119d5565b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611da557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611d6d565b5081600003611dc657604051622e076360e81b815260040160405180910390fd5b60005550505050565b828054611ddb90612419565b90600052602060002090601f016020900481019282611dfd5760008555611e43565b82601f10611e1657805160ff1916838001178555611e43565b82800160010185558215611e43579182015b82811115611e43578251825591602001919060010190611e28565b50611e4f929150611e53565b5090565b5b80821115611e4f5760008155600101611e54565b6001600160e01b031981168114610a8b57600080fd5b600060208284031215611e9057600080fd5b813561136d81611e68565b60005b83811015611eb6578181015183820152602001611e9e565b838111156112ac5750506000910152565b60008151808452611edf816020860160208601611e9b565b601f01601f19169290920160200192915050565b60208152600061136d6020830184611ec7565b600060208284031215611f1857600080fd5b5035919050565b80356001600160a01b0381168114611f3657600080fd5b919050565b60008060408385031215611f4e57600080fd5b611f5783611f1f565b946020939093013593505050565b803561ffff81168114611f3657600080fd5b600060208284031215611f8957600080fd5b61136d82611f65565b600080600060608486031215611fa757600080fd5b611fb084611f1f565b9250611fbe60208501611f1f565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561200d5761200d611fce565b604052919050565b600067ffffffffffffffff82111561202f5761202f611fce565b5060051b60200190565b6000806040838503121561204c57600080fd5b8235915060208084013567ffffffffffffffff81111561206b57600080fd5b8401601f8101861361207c57600080fd5b803561208f61208a82612015565b611fe4565b81815260059190911b820183019083810190888311156120ae57600080fd5b928401925b828410156120d3576120c484611f65565b825292840192908401906120b3565b80955050505050509250929050565b600067ffffffffffffffff8311156120fc576120fc611fce565b61210f601f8401601f1916602001611fe4565b905082815283838301111561212357600080fd5b828260208301376000602084830101529392505050565b60006020828403121561214c57600080fd5b813567ffffffffffffffff81111561216357600080fd5b8201601f8101841361217457600080fd5b611b8f848235602084016120e2565b60006020828403121561219557600080fd5b61136d82611f1f565b803560ff81168114611f3657600080fd5b6000602082840312156121c157600080fd5b61136d8261219e565b600082601f8301126121db57600080fd5b813560206121eb61208a83612015565b82815260059290921b8401810191818101908684111561220a57600080fd5b8286015b84811015612225578035835291830191830161220e565b509695505050505050565b60006020828403121561224257600080fd5b813567ffffffffffffffff81111561225957600080fd5b611b8f848285016121ca565b6000806040838503121561227857600080fd5b61228183611f1f565b91506020830135801515811461229657600080fd5b809150509250929050565b600080600080608085870312156122b757600080fd5b6122c085611f1f565b93506122ce60208601611f1f565b925060408501359150606085013567ffffffffffffffff8111156122f157600080fd5b8501601f8101871361230257600080fd5b612311878235602084016120e2565b91505092959194509250565b6000806040838503121561233057600080fd5b823591506123406020840161219e565b90509250929050565b6000806040838503121561235c57600080fd5b61236583611f1f565b915061234060208401611f1f565b6000806040838503121561238657600080fd5b611f5783611f65565b600080604083850312156123a257600080fd5b823567ffffffffffffffff8111156123b957600080fd5b6123c5858286016121ca565b92505061234060208401611f65565b600080604083850312156123e757600080fd5b823567ffffffffffffffff8111156123fe57600080fd5b61240a858286016121ca565b95602094909401359450505050565b600181811c9082168061242d57607f821691505b60208210810361244d57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156124c7576124c761249e565b500190565b6000600182016124de576124de61249e565b5060010190565b6000828210156124f7576124f761249e565b500390565b6020808252600f908201526e139bdd081dda1a5d195b1a5cdd1959608a1b604082015260600190565b6020808252604b908201527f3e4d494e54205041555345443c20496620796f752772652067657474696e672060408201527f74686973206d6573736167652c20736869742077656e7420646f776e2e203e4d60608201526a1253950814105554d1510f60aa1b608082015260a00190565b600060ff821660ff84168060ff038211156125b3576125b361249e565b019392505050565b600083516125cd818460208801611e9b565b8351908301906125e1818360208801611e9b565b01949350505050565b60208082526022908201527f596f75277265206e6f7420746865206f776e6572206f66207468697320746f6b60408201526132b760f11b606082015260800190565b60008160001904831182151516156126465761264661249e565b500290565b60006020828403121561265d57600080fd5b5051919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061269790830184611ec7565b9695505050505050565b6000602082840312156126b357600080fd5b815161136d81611e6856fea264697066735822122082f72e2d4858567ef0eb04f220552aa493c3b3369020674b03527266baca0d3b64736f6c634300080e0033

Deployed Bytecode Sourcemap

42867:7641:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27919:227;;;;;;;;;;-1:-1:-1;27919:227:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27919:227:0;;;;;;;;43528:33;;;;;;;;;;-1:-1:-1;43528:33:0;;;;-1:-1:-1;;;;;43528:33:0;;;;;;-1:-1:-1;;;;;756:32:1;;;738:51;;726:2;711:18;43528:33:0;592:203:1;28156:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31370:209::-;;;;;;;;;;-1:-1:-1;31370:209:0;;;;;:::i;:::-;;:::i;42960:89::-;;;;;;;;;;;;;:::i;30962:400::-;;;;;;;;;;-1:-1:-1;30962:400:0;;;;;:::i;:::-;;:::i;:::-;;26258:166;;;;;;;;;;-1:-1:-1;26379:12:0;;26319:7;26363:13;:28;26258:166;;;2319:25:1;;;2307:2;2292:18;26258:166:0;2173:177:1;44650:104:0;;;;;;;;;;-1:-1:-1;44650:104:0;;;;;:::i;:::-;;:::i;43744:38::-;;;;;;;;;;;;;;;;43659:76;;;;;;;;;;-1:-1:-1;43659:76:0;;;;-1:-1:-1;;;;;43659:76:0;;;33100:1567;;;;;;;;;;-1:-1:-1;33100:1567:0;;;;;:::i;:::-;;:::i;45050:338::-;;;;;;;;;;-1:-1:-1;45050:338:0;;;;;:::i;:::-;;:::i;44171:113::-;;;;;;;;;;-1:-1:-1;44171:113:0;;;;;:::i;:::-;;:::i;49381:305::-;;;;;;;;;;;;;:::i;34675:185::-;;;;;;;;;;-1:-1:-1;34675:185:0;;;;;:::i;:::-;;:::i;44292:120::-;;;;;;;;;;-1:-1:-1;44292:120:0;;;;;:::i;:::-;;:::i;43436:49::-;;;;;;;;;;-1:-1:-1;43436:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;48404:463;;;;;;;;;;-1:-1:-1;48404:463:0;;;;;:::i;:::-;;:::i;43227:33::-;;;;;;;;;;-1:-1:-1;43227:33:0;;;;;;;;;;;28806:152;;;;;;;;;;-1:-1:-1;28806:152:0;;;;;:::i;:::-;;:::i;26812:233::-;;;;;;;;;;-1:-1:-1;26812:233:0;;;;;:::i;:::-;;:::i;17790:103::-;;;;;;;;;;;;;:::i;49912:591::-;;;;;;;;;;-1:-1:-1;49912:591:0;;;;;:::i;:::-;;:::i;49694:210::-;;;;;;;;;;-1:-1:-1;49694:210:0;;;;;:::i;:::-;;:::i;44420:99::-;;;;;;;;;;;;;:::i;17567:87::-;;;;;;;;;;-1:-1:-1;17640:6:0;;-1:-1:-1;;;;;17640:6:0;17567:87;;28264:104;;;;;;;;;;;;;:::i;31587:308::-;;;;;;;;;;-1:-1:-1;31587:308:0;;;;;:::i;:::-;;:::i;44527:115::-;;;;;;;;;;;;;:::i;34868:399::-;;;;;;;;;;-1:-1:-1;34868:399:0;;;;;:::i;:::-;;:::i;44891:149::-;;;;;;;;;;-1:-1:-1;44891:149:0;;;;;:::i;:::-;;:::i;43125:30::-;;;;;;;;;;-1:-1:-1;43125:30:0;;;;;;;;28376:318;;;;;;;;;;-1:-1:-1;28376:318:0;;;;;:::i;:::-;;:::i;47039:691::-;;;;;;;;;;-1:-1:-1;47039:691:0;;;;;:::i;:::-;;:::i;43791:43::-;;;;;;;;;;;;;;;;31903:164;;;;;;;;;;-1:-1:-1;31903:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;32024:25:0;;;32000:4;32024:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31903:164;45396:228;;;;;;;;;;-1:-1:-1;45396:228:0;;;;;:::i;:::-;;:::i;45974:1057::-;;;;;;:::i;:::-;;:::i;45632:334::-;;;;;;;;;;-1:-1:-1;45632:334:0;;;;;:::i;:::-;;:::i;43570:80::-;;;;;;;;;;-1:-1:-1;43570:80:0;;;;-1:-1:-1;;;;;43570:80:0;;;43382:45;;;;;;;;;;-1:-1:-1;43382:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10058:25:1;;;10126:14;;10119:22;10114:2;10099:18;;10092:50;10158:18;;;10151:34;10046:2;10031:18;43382:45:0;9862:329:1;17901:201:0;;;;;;;;;;-1:-1:-1;17901:201:0;;;;;:::i;:::-;;:::i;47738:658::-;;;;;;;;;;-1:-1:-1;47738:658:0;;;;;:::i;:::-;;:::i;27919:227::-;28004:4;-1:-1:-1;;;;;;;;;28037:25:0;;;;:63;;-1:-1:-1;;;;;;;;;;28075:25:0;;;28037:63;:101;;;-1:-1:-1;;;;;;;;;;28113:25:0;;;28037:101;28021:117;27919:227;-1:-1:-1;;27919:227:0:o;28156:100::-;28210:13;28243:5;28236:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28156:100;:::o;31370:209::-;31437:7;31462:16;31470:7;31462;:16::i;:::-;31457:64;;31487:34;;-1:-1:-1;;;31487:34:0;;;;;;;;;;;31457:64;-1:-1:-1;31541:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;31541:30:0;;31370:209::o;42960:89::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30962:400::-;31043:13;31059:16;31067:7;31059;:16::i;:::-;31043:32;-1:-1:-1;41985:10:0;-1:-1:-1;;;;;31092:28:0;;;31088:175;;31140:44;31157:5;41985:10;31903:164;:::i;31140:44::-;31135:128;;31212:35;;-1:-1:-1;;;31212:35:0;;;;;;;;;;;31135:128;31275:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;31275:35:0;-1:-1:-1;;;;;31275:35:0;;;;;;;;;31326:28;;31275:24;;31326:28;;;;;;;31032:330;30962:400;;:::o;44650:104::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;;;;;;;;;44713:31:::1;44737:6;44713:23;:31::i;:::-;44650:104:::0;:::o;33100:1567::-;33234:27;33264;33283:7;33264:18;:27::i;:::-;33234:57;;33349:4;-1:-1:-1;;;;;33308:45:0;33324:19;-1:-1:-1;;;;;33308:45:0;;33304:86;;33362:28;;-1:-1:-1;;;33362:28:0;;;;;;;;;;;33304:86;33404:27;32913:24;;;:15;:24;;;;;33046:26;;41985:10;32655:30;;;-1:-1:-1;;;;;32519:28:0;;32633:20;;;32630:56;33508:180;;33601:43;33618:4;41985:10;31903:164;:::i;33601:43::-;33596:92;;33653:35;;-1:-1:-1;;;33653:35:0;;;;;;;;;;;33596:92;-1:-1:-1;;;;;33705:16:0;;33701:52;;33730:23;;-1:-1:-1;;;33730:23:0;;;;;;;;;;;33701:52;33766:43;33788:4;33794:2;33798:7;33807:1;33766:21;:43::i;:::-;33849:15;33846:83;;;33912:1;33891:19;33884:30;33846:83;-1:-1:-1;;;;;33971:24:0;;;;;;;:18;:24;;;;;;33969:26;;-1:-1:-1;;33969:26:0;;;34008:22;;;;;;;;;34006:24;;-1:-1:-1;34006:24:0;;;30710:11;30685:23;30681:41;30668:63;-1:-1:-1;;;30668:63:0;34043:26;;;;:17;:26;;;;;:163;;;;-1:-1:-1;;;34223:47:0;;:52;;34219:336;;34324:1;34314:11;;34292:19;34344:30;;;:17;:30;;;;;;:35;;34340:204;;34419:13;;34404:11;:28;34400:129;;34457:30;;;;:17;:30;;;;;:52;;;34400:129;34277:278;34219:336;34598:7;34594:2;-1:-1:-1;;;;;34579:27:0;34588:4;-1:-1:-1;;;;;34579:27:0;;;;;;;;;;;33223:1444;;;33100:1567;;;:::o;45050:338::-;45162:18;;-1:-1:-1;;;;;45162:18:0;45148:10;:32;;:57;;-1:-1:-1;17640:6:0;;-1:-1:-1;;;;;17640:6:0;45184:10;:21;45148:57;45140:87;;;;-1:-1:-1;;;45140:87:0;;11144:2:1;45140:87:0;;;11126:21:1;11183:2;11163:18;;;11156:30;-1:-1:-1;;;11202:18:1;;;11195:47;11259:18;;45140:87:0;10942:341:1;45140:87:0;45245:10;45240:139;45269:8;:15;45261:5;:23;45240:139;;;45356:9;45312:12;:29;45325:8;45334:5;45325:15;;;;;;;;:::i;:::-;;;;;;;45312:29;;;;;;;;;;;;;:40;;;:53;;;;;;;:::i;:::-;;;;-1:-1:-1;45286:7:0;;-1:-1:-1;45286:7:0;;;:::i;:::-;;;;45240:139;;;;45050:338;;:::o;44171:113::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;44249:27;;::::1;::::0;:16:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;:::-;;44171:113:::0;:::o;49381:305::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;49502:16:::1;::::0;49569:34:::1;::::0;-1:-1:-1;;;;;49502:16:0;;::::1;::::0;;;49581:21:::1;49569:34:::0;::::1;;;::::0;49473:18:::1;49569:34:::0;49473:18;49569:34;49581:21;49502:16;49569:34;::::1;;;;;;;;;;;;;::::0;::::1;;;;34675:185:::0;34813:39;34830:4;34836:2;34840:7;34813:39;;;;;;;;;;;;:16;:39::i;44292:120::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;44370:20:::1;:34:::0;;-1:-1:-1;;;;;;44370:34:0::1;-1:-1:-1::0;;;;;44370:34:0;;;::::1;::::0;;;::::1;::::0;;44292:120::o;48404:463::-;48561:21;;;48464:7;48561:21;;;:12;:21;;;;;:31;;;;;:254;;48783:21;;;;;;;:12;:21;;;;;:32;48561:254;;;48673:21;;;;;;;:12;:21;;;;;:32;;48638;;;;;48620:50;;:15;:50;:::i;:::-;:85;;;;:::i;28806:152::-;28878:7;28921:27;28940:7;28921:18;:27::i;26812:233::-;26884:7;-1:-1:-1;;;;;26908:19:0;;26904:60;;26936:28;;-1:-1:-1;;;26936:28:0;;;;;;;;;;;26904:60;-1:-1:-1;;;;;;26982:25:0;;;;;:18;:25;;;;;;24529:13;26982:55;;26812:233::o;17790:103::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;17855:30:::1;17882:1;17855:18;:30::i;:::-;17790:103::o:0;49912:591::-;50008:5;49988:13;26379:12;;26319:7;26363:13;:28;;26258:166;49988:13;:17;;50004:1;49988:17;:::i;:::-;:25;49980:46;;;;-1:-1:-1;;;49980:46:0;;12157:2:1;49980:46:0;;;12139:21:1;12196:1;12176:18;;;12169:29;-1:-1:-1;;;12214:18:1;;;12207:38;12262:18;;49980:46:0;11955:331:1;49980:46:0;50123:1;50106:19;;:16;:19;;;;;;;50154:28;-1:-1:-1;;;;;;50171:10:0;12440:2:1;12436:15;12432:53;50154:28:0;;;12420:66:1;;;;50045:139:0;;50082:5;;50106:19;12502:12:1;;50154:28:0;;;;;;;;;;;;;50144:39;;;;;;50045:18;:139::i;:::-;50037:167;;;;-1:-1:-1;;;50037:167:0;;;;;;;:::i;:::-;50248:10;50223:36;;;;:24;:36;;;;;;50262:1;50223:36;;;;:40;50215:78;;;;-1:-1:-1;;;50215:78:0;;13071:2:1;50215:78:0;;;13053:21:1;13110:2;13090:18;;;13083:30;13149:27;13129:18;;;13122:55;13194:18;;50215:78:0;12869:349:1;50215:78:0;50313:11;;;;50312:12;50304:100;;;;-1:-1:-1;;;50304:100:0;;;;;;;:::i;:::-;50417:24;50427:10;50439:1;50417:9;:24::i;:::-;50477:10;50452:36;;;;:24;:36;;;;;:41;;50492:1;;50452:36;:41;;50492:1;;50452:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49912:591;:::o;49694:210::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;49836:5:::1;49824:8;49808:24;;:13;26379:12:::0;;26319:7;26363:13;:28;;26258:166;49808:13:::1;:24;;;;:::i;:::-;49807:34;49799:55;;;::::0;-1:-1:-1;;;49799:55:0;;14118:2:1;49799:55:0::1;::::0;::::1;14100:21:1::0;14157:1;14137:18;;;14130:29;-1:-1:-1;;;14175:18:1;;;14168:38;14223:18;;49799:55:0::1;13916:331:1::0;49799:55:0::1;49865:31;49875:10;49887:8;49865:31;;:9;:31::i;44420:99::-:0;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;44498:11:::1;::::0;;-1:-1:-1;;44483:26:0;::::1;44498:11;::::0;;::::1;44497:12;44483:26;::::0;;44420:99::o;28264:104::-;28320:13;28353:7;28346:14;;;;;:::i;31587:308::-;41985:10;-1:-1:-1;;;;;31686:31:0;;;31682:61;;31726:17;;-1:-1:-1;;;31726:17:0;;;;;;;;;;;31682:61;41985:10;31756:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;31756:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;31756:60:0;;;;;;;;;;31832:55;;540:41:1;;;31756:49:0;;41985:10;31832:55;;513:18:1;31832:55:0;;;;;;;31587:308;;:::o;44527:115::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;44618:14:::1;::::0;;-1:-1:-1;;44600:32:0;::::1;44618:14;::::0;;;::::1;;;44617:15;44600:32:::0;;::::1;;::::0;;44527:115::o;34868:399::-;35035:31;35048:4;35054:2;35058:7;35035:12;:31::i;:::-;-1:-1:-1;;;;;35081:14:0;;;:19;35077:183;;35120:56;35151:4;35157:2;35161:7;35170:5;35120:30;:56::i;:::-;35115:145;;35204:40;;-1:-1:-1;;;35204:40:0;;;;;;;;;;;35115:145;34868:399;;;;:::o;44891:149::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;44992:21:::1;;;::::0;;;:16:::1;:21;::::0;;;;:38;44891:149::o;28376:318::-;28449:13;28480:16;28488:7;28480;:16::i;:::-;28475:59;;28505:29;;-1:-1:-1;;;28505:29:0;;;;;;;;;;;28475:59;28547:21;28571:10;:8;:10::i;:::-;28547:34;;28605:7;28599:21;28624:1;28599:26;:87;;;;;;;;;;;;;;;;;28652:7;28661:18;28671:7;28661:9;:18::i;:::-;28635:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28599:87;28592:94;28376:318;-1:-1:-1;;;28376:318:0:o;47039:691::-;47207:10;47187:16;;;;:7;:16::i;:::-;-1:-1:-1;;;;;47187:30:0;;47179:77;;;;-1:-1:-1;;;47179:77:0;;;;;;;:::i;:::-;47406:13;;47370:21;;;;;;;:12;:21;;;;;:32;;;47352:50;;:15;:50;:::i;:::-;47351:68;;;;:::i;:::-;47315:21;;;;;;;:12;:21;;;;;:104;;:21;;;:104;;;;;:::i;:::-;;;;-1:-1:-1;;47473:21:0;;;;;;:12;:21;;;;;47508:15;47473:32;;;;:50;47039:691::o;45396:228::-;45493:18;;-1:-1:-1;;;;;45493:18:0;45479:10;:32;;:57;;-1:-1:-1;17640:6:0;;-1:-1:-1;;;;;17640:6:0;45515:10;:21;45479:57;45471:87;;;;-1:-1:-1;;;45471:87:0;;11144:2:1;45471:87:0;;;11126:21:1;11183:2;11163:18;;;11156:30;-1:-1:-1;;;11202:18:1;;;11195:47;11259:18;;45471:87:0;10942:341:1;45471:87:0;45569:21;;;;;;;:12;:21;;;;;:45;;45605:9;;45569:21;:45;;45605:9;;45569:45;:::i;:::-;;;;-1:-1:-1;;;;45396:228:0:o;45974:1057::-;46099:5;46087:8;46071:24;;:13;26379:12;;26319:7;26363:13;:28;;26258:166;46071:13;:24;;;;:::i;:::-;46070:34;46062:55;;;;-1:-1:-1;;;46062:55:0;;14118:2:1;46062:55:0;;;14100:21:1;14157:1;14137:18;;;14130:29;-1:-1:-1;;;14175:18:1;;;14168:38;14223:18;;46062:55:0;13916:331:1;46062:55:0;46134:14;;;;;;;46130:731;;;46205:8;46189:24;;:13;;:24;;;;:::i;:::-;46175:9;:39;46167:48;;;;;;46309:19;;;:16;:19;;;;;;;46361:28;-1:-1:-1;;;;;;46378:10:0;12440:2:1;12436:15;12432:53;46361:28:0;;;12420:66:1;;;;46240:151:0;;46281:5;;46309:19;12502:12:1;;46361:28:0;12291:229:1;46240:151:0;46232:179;;;;-1:-1:-1;;;46232:179:0;;;;;;;:::i;:::-;46466:20;;-1:-1:-1;;;;;46466:20:0;46546:1;46518:25;46532:10;-1:-1:-1;;;;;27142:25:0;27114:7;27142:25;;;:18;:25;;24600:2;27142:25;;;;;:50;;24529:13;27141:82;;27053:178;46518:25;46507:36;;;;;;:::i;:::-;:40;46504:259;;;46679:10;27114:7;27142:25;;;:18;:25;;24600:2;27142:25;;;;;46654:36;;27142:50;24529:13;27141:82;46654:36;;;;:::i;:::-;46598:31;;-1:-1:-1;;;46598:31:0;;46618:10;46598:31;;;738:51:1;-1:-1:-1;;;;;46598:19:0;;;;;711:18:1;;46598:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:92;;46568:179;;;;-1:-1:-1;;;46568:179:0;;15694:2:1;46568:179:0;;;15676:21:1;15733:2;15713:18;;;15706:30;15772:33;15752:18;;;15745:61;15823:18;;46568:179:0;15492:355:1;46568:179:0;46150:626;46130:731;;;46839:8;46819:28;;:17;;:28;;;;:::i;:::-;46805:9;:43;46797:52;;;;;;46882:11;;;;46881:12;46873:100;;;;-1:-1:-1;;;46873:100:0;;;;;;;:::i;:::-;46990:31;47000:10;47012:8;46990:31;;:9;:31::i;45632:334::-;45813:1;45796:19;;:16;:19;;;;;;;45840:28;-1:-1:-1;;;;;;45857:10:0;12440:2:1;12436:15;12432:53;45840:28:0;;;12420:66:1;;;;45743:127:0;;45776:5;;45796:19;12502:12:1;;45840:28:0;12291:229:1;45743:127:0;:152;;;-1:-1:-1;17640:6:0;;-1:-1:-1;;;;;17640:6:0;45874:10;:21;45743:152;45735:180;;;;-1:-1:-1;;;45735:180:0;;;;;;;:::i;:::-;45928:13;:30;-1:-1:-1;45632:334:0:o;17901:201::-;17640:6;;-1:-1:-1;;;;;17640:6:0;41985:10;17702:23;17694:68;;;;-1:-1:-1;;;17694:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17990:22:0;::::1;17982:73;;;::::0;-1:-1:-1;;;17982:73:0;;16054:2:1;17982:73:0::1;::::0;::::1;16036:21:1::0;16093:2;16073:18;;;16066:30;16132:34;16112:18;;;16105:62;-1:-1:-1;;;16183:18:1;;;16176:36;16229:19;;17982:73:0::1;15852:402:1::0;17982:73:0::1;18066:28;18085:8;18066:18;:28::i;47738:658::-:0;47868:10;47848:16;;;;:7;:16::i;:::-;-1:-1:-1;;;;;47848:30:0;;47840:77;;;;-1:-1:-1;;;47840:77:0;;;;;;;:::i;:::-;47998:21;;;;;;;:12;:21;;;;;:31;;;;;:243;;48191:21;;;;;;;:12;:21;;;;;48226:15;48191:32;;;;:50;;;47998:243;;;48122:21;;;;;;;:12;:21;;;;;:32;;;48104:50;;:15;:50;:::i;:::-;48067:21;;;;;;;:12;:21;;;;;:88;;:21;;;:88;;;;;:::i;:::-;;;;;;;47998:243;-1:-1:-1;48320:21:0;;;;;;:12;:21;;;;;:31;;;;-1:-1:-1;;48285:66:0;;48320:31;;;;48319:32;48285:66;;;47738:658::o;32075:230::-;32140:4;32222:13;;32212:7;:23;32173:124;;;;-1:-1:-1;;32248:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;32248:44:0;:49;;32075:230::o;26432:107::-;26525:6;26508:23;;:13;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;;26432:107:0:o;29513:581::-;29580:7;29615;29705:13;;29698:4;:20;29694:337;;;29739:14;29756:23;;;:17;:23;;;;;;;-1:-1:-1;;;29802:24:0;;:29;;29798:218;;29856:105;29863:6;29873:1;29863:11;29856:105;;-1:-1:-1;;;29930:6:0;29912:25;;;;:17;:25;;;;;;29856:105;;29798:218;29720:311;29694:337;30055:31;;-1:-1:-1;;;30055:31:0;;;;;;;;;;;48875:498;49063:26;;;;:12;:26;;;;;:36;;;;;49062:37;49054:65;;;;-1:-1:-1;;;49054:65:0;;16461:2:1;49054:65:0;;;16443:21:1;16500:2;16480:18;;;16473:30;-1:-1:-1;;;16519:18:1;;;16512:45;16574:18;;49054:65:0;16259:339:1;18110:191:0;18203:6;;;-1:-1:-1;;;;;18220:17:0;;;-1:-1:-1;;;;;;18220:17:0;;;;;;;18253:40;;18203:6;;;18220:17;18203:6;;18253:40;;18184:16;;18253:40;18173:128;18110:191;:::o;7222:190::-;7347:4;7400;7371:25;7384:5;7391:4;7371:12;:25::i;:::-;:33;;7222:190;-1:-1:-1;;;;7222:190:0:o;39157:112::-;39234:27;39244:2;39248:8;39234:27;;;;;;;;;;;;:9;:27::i;35608:716::-;35792:88;;-1:-1:-1;;;35792:88:0;;35771:4;;-1:-1:-1;;;;;35792:45:0;;;;;:88;;41985:10;;35859:4;;35865:7;;35874:5;;35792:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35792:88:0;;;;;;;;-1:-1:-1;;35792:88:0;;;;;;;;;;;;:::i;:::-;;;35788:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36075:6;:13;36092:1;36075:18;36071:235;;36121:40;;-1:-1:-1;;;36121:40:0;;;;;;;;;;;36071:235;36264:6;36258:13;36249:6;36245:2;36241:15;36234:38;35788:529;-1:-1:-1;;;;;;35951:64:0;-1:-1:-1;;;35951:64:0;;-1:-1:-1;35788:529:0;35608:716;;;;;;:::o;44762:121::-;44822:13;44857:16;44850:23;;;;;:::i;42011:573::-;42147:4;42141:11;;42154:4;42137:22;42173:17;;;;42137:22;42254:5;42236:219;42302:1;42297:3;42293:11;42286:18;;42353:2;42347:4;42343:13;42339:2;42335:22;42330:3;42322:36;42394:2;42384:13;;42415:25;42236:219;42415:25;-1:-1:-1;42485:13:0;;;-1:-1:-1;;42519:14:0;;;42547:19;;;42519:14;42011:573;-1:-1:-1;42011:573:0:o;7632:296::-;7715:7;7758:4;7715:7;7773:118;7797:5;:12;7793:1;:16;7773:118;;;7846:33;7856:12;7870:5;7876:1;7870:8;;;;;;;;:::i;:::-;;;;;;;7846:9;:33::i;:::-;7831:48;-1:-1:-1;7811:3:0;;;;:::i;:::-;;;;7773:118;;;-1:-1:-1;7908:12:0;7632:296;-1:-1:-1;;;7632:296:0:o;38551:598::-;38682:19;38688:2;38692:8;38682:5;:19::i;:::-;-1:-1:-1;;;;;38735:14:0;;;:19;38731:404;;38771:11;38785:13;38829:14;;;38858:217;38885:62;38924:1;38928:2;38932:7;;;;;;38941:5;38885:30;:62::i;:::-;38880:159;;38979:40;;-1:-1:-1;;;38979:40:0;;;;;;;;;;;38880:159;39070:3;39062:5;:11;38858:217;;39110:3;39093:13;;:20;39089:34;;39115:8;;;39089:34;38756:379;;38551:598;;;:::o;10960:149::-;11023:7;11054:1;11050;:5;:51;;11185:13;11237:15;;;11273:4;11266:15;;;11320:4;11304:21;;11050:51;;;-1:-1:-1;11185:13:0;11237:15;;;11273:4;11266:15;11320:4;11304:21;;;10960:149::o;36334:1288::-;36407:20;36430:13;;;36458;;;36454:44;;36480:18;;-1:-1:-1;;;36480:18:0;;;;;;;;;;;36454:44;36511:61;36541:1;36545:2;36549:12;36563:8;36511:21;:61::i;:::-;-1:-1:-1;;;;;36602:22:0;;;;;;:18;:22;;;;24600:2;36602:22;;;:71;;36640:32;36628:45;;36602:71;;;36686:31;;;:17;:31;;;;;-1:-1:-1;30918:15:0;;30892:24;30888:46;30710:11;30685:23;30681:41;30678:52;30668:63;;36686:161;;36901:23;;;;36686:31;;36602:22;;37063:25;36602:22;;37012:157;37241:1;37227:12;37223:20;37185:253;37278:3;37269:7;37266:16;37185:253;;37415:7;37405:8;37402:1;37375:25;37372:1;37369;37364:59;37327:1;37314:15;37185:253;;;37189:69;37463:8;37475:1;37463:13;37459:45;;37485:19;;-1:-1:-1;;;37485:19:0;;;;;;;;;;;37459:45;37517:13;:19;-1:-1:-1;45240:139:0;45050:338;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;800:258::-;872:1;882:113;896:6;893:1;890:13;882:113;;;972:11;;;966:18;953:11;;;946:39;918:2;911:10;882:113;;;1013:6;1010:1;1007:13;1004:48;;;-1:-1:-1;;1048:1:1;1030:16;;1023:27;800:258::o;1063:::-;1105:3;1143:5;1137:12;1170:6;1165:3;1158:19;1186:63;1242:6;1235:4;1230:3;1226:14;1219:4;1212:5;1208:16;1186:63;:::i;:::-;1303:2;1282:15;-1:-1:-1;;1278:29:1;1269:39;;;;1310:4;1265:50;;1063:258;-1:-1:-1;;1063:258:1:o;1326:220::-;1475:2;1464:9;1457:21;1438:4;1495:45;1536:2;1525:9;1521:18;1513:6;1495:45;:::i;1551:180::-;1610:6;1663:2;1651:9;1642:7;1638:23;1634:32;1631:52;;;1679:1;1676;1669:12;1631:52;-1:-1:-1;1702:23:1;;1551:180;-1:-1:-1;1551:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:159::-;2422:20;;2482:6;2471:18;;2461:29;;2451:57;;2504:1;2501;2494:12;2519:184;2577:6;2630:2;2618:9;2609:7;2605:23;2601:32;2598:52;;;2646:1;2643;2636:12;2598:52;2669:28;2687:9;2669:28;:::i;2708:328::-;2785:6;2793;2801;2854:2;2842:9;2833:7;2829:23;2825:32;2822:52;;;2870:1;2867;2860:12;2822:52;2893:29;2912:9;2893:29;:::i;:::-;2883:39;;2941:38;2975:2;2964:9;2960:18;2941:38;:::i;:::-;2931:48;;3026:2;3015:9;3011:18;2998:32;2988:42;;2708:328;;;;;:::o;3041:127::-;3102:10;3097:3;3093:20;3090:1;3083:31;3133:4;3130:1;3123:15;3157:4;3154:1;3147:15;3173:275;3244:2;3238:9;3309:2;3290:13;;-1:-1:-1;;3286:27:1;3274:40;;3344:18;3329:34;;3365:22;;;3326:62;3323:88;;;3391:18;;:::i;:::-;3427:2;3420:22;3173:275;;-1:-1:-1;3173:275:1:o;3453:182::-;3512:4;3545:18;3537:6;3534:30;3531:56;;;3567:18;;:::i;:::-;-1:-1:-1;3612:1:1;3608:14;3624:4;3604:25;;3453:182::o;3640:962::-;3732:6;3740;3793:2;3781:9;3772:7;3768:23;3764:32;3761:52;;;3809:1;3806;3799:12;3761:52;3845:9;3832:23;3822:33;;3874:2;3927;3916:9;3912:18;3899:32;3954:18;3946:6;3943:30;3940:50;;;3986:1;3983;3976:12;3940:50;4009:22;;4062:4;4054:13;;4050:27;-1:-1:-1;4040:55:1;;4091:1;4088;4081:12;4040:55;4127:2;4114:16;4150:59;4166:42;4205:2;4166:42;:::i;:::-;4150:59;:::i;:::-;4243:15;;;4325:1;4321:10;;;;4313:19;;4309:28;;;4274:12;;;;4349:19;;;4346:39;;;4381:1;4378;4371:12;4346:39;4405:11;;;;4425:147;4441:6;4436:3;4433:15;4425:147;;;4507:22;4525:3;4507:22;:::i;:::-;4495:35;;4458:12;;;;4550;;;;4425:147;;;4591:5;4581:15;;;;;;;3640:962;;;;;:::o;4607:407::-;4672:5;4706:18;4698:6;4695:30;4692:56;;;4728:18;;:::i;:::-;4766:57;4811:2;4790:15;;-1:-1:-1;;4786:29:1;4817:4;4782:40;4766:57;:::i;:::-;4757:66;;4846:6;4839:5;4832:21;4886:3;4877:6;4872:3;4868:16;4865:25;4862:45;;;4903:1;4900;4893:12;4862:45;4952:6;4947:3;4940:4;4933:5;4929:16;4916:43;5006:1;4999:4;4990:6;4983:5;4979:18;4975:29;4968:40;4607:407;;;;;:::o;5019:451::-;5088:6;5141:2;5129:9;5120:7;5116:23;5112:32;5109:52;;;5157:1;5154;5147:12;5109:52;5197:9;5184:23;5230:18;5222:6;5219:30;5216:50;;;5262:1;5259;5252:12;5216:50;5285:22;;5338:4;5330:13;;5326:27;-1:-1:-1;5316:55:1;;5367:1;5364;5357:12;5316:55;5390:74;5456:7;5451:2;5438:16;5433:2;5429;5425:11;5390:74;:::i;5475:186::-;5534:6;5587:2;5575:9;5566:7;5562:23;5558:32;5555:52;;;5603:1;5600;5593:12;5555:52;5626:29;5645:9;5626:29;:::i;5666:156::-;5732:20;;5792:4;5781:16;;5771:27;;5761:55;;5812:1;5809;5802:12;5827:182;5884:6;5937:2;5925:9;5916:7;5912:23;5908:32;5905:52;;;5953:1;5950;5943:12;5905:52;5976:27;5993:9;5976:27;:::i;6196:661::-;6250:5;6303:3;6296:4;6288:6;6284:17;6280:27;6270:55;;6321:1;6318;6311:12;6270:55;6357:6;6344:20;6383:4;6407:59;6423:42;6462:2;6423:42;:::i;6407:59::-;6500:15;;;6586:1;6582:10;;;;6570:23;;6566:32;;;6531:12;;;;6610:15;;;6607:35;;;6638:1;6635;6628:12;6607:35;6674:2;6666:6;6662:15;6686:142;6702:6;6697:3;6694:15;6686:142;;;6768:17;;6756:30;;6806:12;;;;6719;;6686:142;;;-1:-1:-1;6846:5:1;6196:661;-1:-1:-1;;;;;;6196:661:1:o;6862:348::-;6946:6;6999:2;6987:9;6978:7;6974:23;6970:32;6967:52;;;7015:1;7012;7005:12;6967:52;7055:9;7042:23;7088:18;7080:6;7077:30;7074:50;;;7120:1;7117;7110:12;7074:50;7143:61;7196:7;7187:6;7176:9;7172:22;7143:61;:::i;7215:347::-;7280:6;7288;7341:2;7329:9;7320:7;7316:23;7312:32;7309:52;;;7357:1;7354;7347:12;7309:52;7380:29;7399:9;7380:29;:::i;:::-;7370:39;;7459:2;7448:9;7444:18;7431:32;7506:5;7499:13;7492:21;7485:5;7482:32;7472:60;;7528:1;7525;7518:12;7472:60;7551:5;7541:15;;;7215:347;;;;;:::o;7567:667::-;7662:6;7670;7678;7686;7739:3;7727:9;7718:7;7714:23;7710:33;7707:53;;;7756:1;7753;7746:12;7707:53;7779:29;7798:9;7779:29;:::i;:::-;7769:39;;7827:38;7861:2;7850:9;7846:18;7827:38;:::i;:::-;7817:48;;7912:2;7901:9;7897:18;7884:32;7874:42;;7967:2;7956:9;7952:18;7939:32;7994:18;7986:6;7983:30;7980:50;;;8026:1;8023;8016:12;7980:50;8049:22;;8102:4;8094:13;;8090:27;-1:-1:-1;8080:55:1;;8131:1;8128;8121:12;8080:55;8154:74;8220:7;8215:2;8202:16;8197:2;8193;8189:11;8154:74;:::i;:::-;8144:84;;;7567:667;;;;;;;:::o;8239:250::-;8305:6;8313;8366:2;8354:9;8345:7;8341:23;8337:32;8334:52;;;8382:1;8379;8372:12;8334:52;8418:9;8405:23;8395:33;;8447:36;8479:2;8468:9;8464:18;8447:36;:::i;:::-;8437:46;;8239:250;;;;;:::o;8494:260::-;8562:6;8570;8623:2;8611:9;8602:7;8598:23;8594:32;8591:52;;;8639:1;8636;8629:12;8591:52;8662:29;8681:9;8662:29;:::i;:::-;8652:39;;8710:38;8744:2;8733:9;8729:18;8710:38;:::i;8759:252::-;8826:6;8834;8887:2;8875:9;8866:7;8862:23;8858:32;8855:52;;;8903:1;8900;8893:12;8855:52;8926:28;8944:9;8926:28;:::i;9016:420::-;9108:6;9116;9169:2;9157:9;9148:7;9144:23;9140:32;9137:52;;;9185:1;9182;9175:12;9137:52;9225:9;9212:23;9258:18;9250:6;9247:30;9244:50;;;9290:1;9287;9280:12;9244:50;9313:61;9366:7;9357:6;9346:9;9342:22;9313:61;:::i;:::-;9303:71;;;9393:37;9426:2;9415:9;9411:18;9393:37;:::i;9441:416::-;9534:6;9542;9595:2;9583:9;9574:7;9570:23;9566:32;9563:52;;;9611:1;9608;9601:12;9563:52;9651:9;9638:23;9684:18;9676:6;9673:30;9670:50;;;9716:1;9713;9706:12;9670:50;9739:61;9792:7;9783:6;9772:9;9768:22;9739:61;:::i;:::-;9729:71;9847:2;9832:18;;;;9819:32;;-1:-1:-1;;;;9441:416:1:o;10196:380::-;10275:1;10271:12;;;;10318;;;10339:61;;10393:4;10385:6;10381:17;10371:27;;10339:61;10446:2;10438:6;10435:14;10415:18;10412:38;10409:161;;10492:10;10487:3;10483:20;10480:1;10473:31;10527:4;10524:1;10517:15;10555:4;10552:1;10545:15;10409:161;;10196:380;;;:::o;10581:356::-;10783:2;10765:21;;;10802:18;;;10795:30;10861:34;10856:2;10841:18;;10834:62;10928:2;10913:18;;10581:356::o;11288:127::-;11349:10;11344:3;11340:20;11337:1;11330:31;11380:4;11377:1;11370:15;11404:4;11401:1;11394:15;11420:127;11481:10;11476:3;11472:20;11469:1;11462:31;11512:4;11509:1;11502:15;11536:4;11533:1;11526:15;11552:128;11592:3;11623:1;11619:6;11616:1;11613:13;11610:39;;;11629:18;;:::i;:::-;-1:-1:-1;11665:9:1;;11552:128::o;11685:135::-;11724:3;11745:17;;;11742:43;;11765:18;;:::i;:::-;-1:-1:-1;11812:1:1;11801:13;;11685:135::o;11825:125::-;11865:4;11893:1;11890;11887:8;11884:34;;;11898:18;;:::i;:::-;-1:-1:-1;11935:9:1;;11825:125::o;12525:339::-;12727:2;12709:21;;;12766:2;12746:18;;;12739:30;-1:-1:-1;;;12800:2:1;12785:18;;12778:45;12855:2;12840:18;;12525:339::o;13223:479::-;13425:2;13407:21;;;13464:2;13444:18;;;13437:30;13503:34;13498:2;13483:18;;13476:62;13574:34;13569:2;13554:18;;13547:62;-1:-1:-1;;;13640:3:1;13625:19;;13618:42;13692:3;13677:19;;13223:479::o;13707:204::-;13745:3;13781:4;13778:1;13774:12;13813:4;13810:1;13806:12;13848:3;13842:4;13838:14;13833:3;13830:23;13827:49;;;13856:18;;:::i;:::-;13892:13;;13707:204;-1:-1:-1;;;13707:204:1:o;14252:470::-;14431:3;14469:6;14463:13;14485:53;14531:6;14526:3;14519:4;14511:6;14507:17;14485:53;:::i;:::-;14601:13;;14560:16;;;;14623:57;14601:13;14560:16;14657:4;14645:17;;14623:57;:::i;:::-;14696:20;;14252:470;-1:-1:-1;;;;14252:470:1:o;14727:398::-;14929:2;14911:21;;;14968:2;14948:18;;;14941:30;15007:34;15002:2;14987:18;;14980:62;-1:-1:-1;;;15073:2:1;15058:18;;15051:32;15115:3;15100:19;;14727:398::o;15130:168::-;15170:7;15236:1;15232;15228:6;15224:14;15221:1;15218:21;15213:1;15206:9;15199:17;15195:45;15192:71;;;15243:18;;:::i;:::-;-1:-1:-1;15283:9:1;;15130:168::o;15303:184::-;15373:6;15426:2;15414:9;15405:7;15401:23;15397:32;15394:52;;;15442:1;15439;15432:12;15394:52;-1:-1:-1;15465:16:1;;15303:184;-1:-1:-1;15303:184:1:o;16603:489::-;-1:-1:-1;;;;;16872:15:1;;;16854:34;;16924:15;;16919:2;16904:18;;16897:43;16971:2;16956:18;;16949:34;;;17019:3;17014:2;16999:18;;16992:31;;;16797:4;;17040:46;;17066:19;;17058:6;17040:46;:::i;:::-;17032:54;16603:489;-1:-1:-1;;;;;;16603:489:1:o;17097:249::-;17166:6;17219:2;17207:9;17198:7;17194:23;17190:32;17187:52;;;17235:1;17232;17225:12;17187:52;17267:9;17261:16;17286:30;17310:5;17286:30;:::i

Swarm Source

ipfs://82f72e2d4858567ef0eb04f220552aa493c3b3369020674b03527266baca0d3b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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