ETH Price: $3,109.91 (+1.57%)
Gas: 4 Gwei

Token

Bone Fnatics (BF)
 

Overview

Max Total Supply

1,028 BF

Holders

220

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
success1001.eth
Balance
1 BF
0x1976118727654b2904ea113f330ee33f1798282a
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:
BoneFnatics

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-06
*/

// File: contracts/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

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

// File: contracts/OperatorFilterer.sol


pragma solidity ^0.8.13;


abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !(
                    operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)
                        && operatorFilterRegistry.isOperatorAllowed(address(this), from)
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}

// File: contracts/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

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

// File: contracts/IERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            IERC165
    // ==============================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    // ==============================
    //        IERC721Metadata
    // ==============================

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

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

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


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

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

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (_addressToUint256(owner) == 0) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    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;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

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

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

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 0) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 0) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        address approvedAddress = _tokenApprovals[tokenId];

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            approvedAddress == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (_addressToUint256(to) == 0) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));
        address approvedAddress = _tokenApprovals[tokenId];

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                approvedAddress == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _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))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: contracts/BoneFnatics.sol


pragma solidity ^0.8.13;






contract BoneFnatics is ERC721A, Ownable, DefaultOperatorFilterer {

    using Strings for uint;

    enum Step {
        GetReady,
        WhitelistSale,
        PublicSale,
        SoldOut,
        Reveal
    }

    Step public step;

    string public baseURI;
    string public notRevealedURI;

    uint public MaxSupply = 3333;
    uint public MaxForTeam= 333;
    uint public MaxPerTx = 5;

    bool private isRevealed = true;

    uint public wl_price = 0.005 ether;
    uint public pb_price = 0.007 ether;

    uint public saleStartTime = 1670338800;

    bytes32 public merkleRoot;
    mapping(address => uint) public MaxPerWallet;

    constructor(string memory _baseURI, bytes32 _merkleRoot) ERC721A("Bone Fnatics", "BF")
    {
        baseURI = _baseURI;
        merkleRoot = _merkleRoot;
    }

    modifier isNotContract() {
        require(tx.origin == msg.sender, "Reentrancy Guard is watching");
        _;
    }

    function getStep() public view returns(Step actualStep) {
        if(block.timestamp < saleStartTime) {
            return Step.GetReady;
        }
        if(block.timestamp >= saleStartTime
        &&block.timestamp < saleStartTime + 30 minutes) {
            return Step.WhitelistSale;
        }
        if(block.timestamp >= saleStartTime + 30 minutes) {
            return Step.PublicSale;
        }
    }

    function teamMint(address _to, uint _quantity) external payable onlyOwner {
        require(totalSupply() + _quantity <= MaxForTeam, "NFT can't be minted anymore");
        _safeMint(_to,  _quantity);
    }


    function whitelistMint(address _account, uint _quantity, bytes32[] calldata _proof) external payable isNotContract {
        require(getStep() == Step.WhitelistSale, "Whitelist Mint is not yet LIVE");
        require(isWhiteListed(msg.sender, _proof), "You are not whitelisted");
        require(totalSupply() + _quantity <= MaxSupply, "Bone Fnatics is SOLD OUT. You can get your fanatic through Opensea.");
        require(_quantity <= MaxPerTx, "You can only mint 5 per transaction");
        require(msg.value >= wl_price * _quantity, "Your wallet lacks ETH in order to mint");
        require(MaxPerWallet[msg.sender] + _quantity <= 5, "You can only mint 5 per wallet");
		MaxPerWallet[msg.sender] += _quantity;
        _safeMint(_account, _quantity);
    }

    function publicSaleMint(address _account, uint _quantity) external payable isNotContract {
        require(getStep() == Step.PublicSale, "Public Mint is not yet LIVE");
        require(totalSupply() + _quantity <= MaxSupply, "Bone Fnatics is SOLD OUT. You can get your fanatic through Opensea.");
        require(_quantity <= MaxPerTx, "You can only mint 5 per transaction");
        require(msg.value >= pb_price * _quantity, "Your wallet lacks ETH in order to mint");
        require(MaxPerWallet[msg.sender] + _quantity <= 5, "You can only mint 5 per wallet");
		MaxPerWallet[msg.sender] += _quantity;
        _safeMint(_account, _quantity);
    }

    function setBaseUri(string memory _newBaseURI) external onlyOwner {
        baseURI = _newBaseURI;
    }

    function setSaleStartTime(uint _newSaleStartTime) external onlyOwner {
        saleStartTime = _newSaleStartTime;
    }

    function setMaxSupply(uint _newMaxSupply) external onlyOwner {
        MaxSupply = _newMaxSupply;
    }

    function setMintPrice(uint _newMint_Price) external onlyOwner {
        pb_price = _newMint_Price;
    }

    function tokenURI(uint _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "URI query for nonexistent token");
        if(isRevealed == true) {
            return string(abi.encodePacked(baseURI, _tokenId.toString(), ".json"));
        }
        else {
            return string(abi.encodePacked(baseURI, notRevealedURI));
        }
    }

   function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function isWhiteListed(address _account, bytes32[] calldata _proof) internal view returns(bool) {
        return _verify(leaf(_account), _proof);
    }

    function leaf(address _account) internal pure returns(bytes32) {
        return keccak256(abi.encodePacked(_account));
    }

    function _verify(bytes32 _leaf, bytes32[] memory _proof) internal view returns(bool) {
        return MerkleProof.verify(_proof, merkleRoot, _leaf);
    }

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

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

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

    function withdraw(uint amount) public onlyOwner {
        payable(msg.sender).transfer(amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MaxForTeam","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"MaxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStep","outputs":[{"internalType":"enum BoneFnatics.Step","name":"actualStep","type":"uint8"}],"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":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedURI","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":"pb_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","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":[],"name":"saleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMint_Price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSaleStartTime","type":"uint256"}],"name":"setSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"step","outputs":[{"internalType":"enum BoneFnatics.Step","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wl_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052610d05600b5561014d600c556005600d556001600e60006101000a81548160ff0219169083151502179055506611c37937e08000600f556618de76816d800060105563638f58f06011553480156200005b57600080fd5b506040516200513738038062005137833981810160405281019062000081919062000619565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600c81526020017f426f6e6520466e617469637300000000000000000000000000000000000000008152506040518060400160405280600281526020017f42460000000000000000000000000000000000000000000000000000000000008152508160029081620001159190620008ca565b508060039081620001279190620008ca565b50620001386200037860201b60201c565b600081905550505062000160620001546200037d60201b60201c565b6200038560201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003555780156200021b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001e1929190620009f6565b600060405180830381600087803b158015620001fc57600080fd5b505af115801562000211573d6000803e3d6000fd5b5050505062000354565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002d5576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200029b929190620009f6565b600060405180830381600087803b158015620002b657600080fd5b505af1158015620002cb573d6000803e3d6000fd5b5050505062000353565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200031e919062000a23565b600060405180830381600087803b1580156200033957600080fd5b505af11580156200034e573d6000803e3d6000fd5b505050505b5b5b50508160099081620003689190620008ca565b5080601281905550505062000a40565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004b48262000469565b810181811067ffffffffffffffff82111715620004d657620004d56200047a565b5b80604052505050565b6000620004eb6200044b565b9050620004f98282620004a9565b919050565b600067ffffffffffffffff8211156200051c576200051b6200047a565b5b620005278262000469565b9050602081019050919050565b60005b838110156200055457808201518184015260208101905062000537565b60008484015250505050565b6000620005776200057184620004fe565b620004df565b90508281526020810184848401111562000596576200059562000464565b5b620005a384828562000534565b509392505050565b600082601f830112620005c357620005c26200045f565b5b8151620005d584826020860162000560565b91505092915050565b6000819050919050565b620005f381620005de565b8114620005ff57600080fd5b50565b6000815190506200061381620005e8565b92915050565b6000806040838503121562000633576200063262000455565b5b600083015167ffffffffffffffff8111156200065457620006536200045a565b5b6200066285828601620005ab565b9250506020620006758582860162000602565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006d257607f821691505b602082108103620006e857620006e76200068a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000713565b6200075e868362000713565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620007ab620007a56200079f8462000776565b62000780565b62000776565b9050919050565b6000819050919050565b620007c7836200078a565b620007df620007d682620007b2565b84845462000720565b825550505050565b600090565b620007f6620007e7565b62000803818484620007bc565b505050565b5b818110156200082b576200081f600082620007ec565b60018101905062000809565b5050565b601f8211156200087a576200084481620006ee565b6200084f8462000703565b810160208510156200085f578190505b620008776200086e8562000703565b83018262000808565b50505b505050565b600082821c905092915050565b60006200089f600019846008026200087f565b1980831691505092915050565b6000620008ba83836200088c565b9150826002028217905092915050565b620008d5826200067f565b67ffffffffffffffff811115620008f157620008f06200047a565b5b620008fd8254620006b9565b6200090a8282856200082f565b600060209050601f8311600181146200094257600084156200092d578287015190505b620009398582620008ac565b865550620009a9565b601f1984166200095286620006ee565b60005b828110156200097c5784890151825560018201915060208501945060208101905062000955565b868310156200099c578489015162000998601f8916826200088c565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009de82620009b1565b9050919050565b620009f081620009d1565b82525050565b600060408201905062000a0d6000830185620009e5565b62000a1c6020830184620009e5565b9392505050565b600060208201905062000a3a6000830184620009e5565b92915050565b6146e78062000a506000396000f3fe6080604052600436106102255760003560e01c80637225038011610123578063b36c1284116100ab578063c87b56dd1161006f578063c87b56dd146107ba578063e25fe175146107f7578063e985e9c514610822578063f2fde38b1461085f578063f4a0a5281461088857610225565b8063b36c1284146106d3578063b88b77d2146106fe578063b88d4fde1461073b578063b8df407c14610764578063bfe2a08a1461078f57610225565b80639e5288a0116100f25780639e5288a01461061e578063a0bcfc7f14610649578063a22cb46514610672578063ac5ae11b1461069b578063add5a4fa146106b757610225565b806372250380146105745780637cb647591461059f5780638da5cb5b146105c857806395d89b41146105f357610225565b806342842e0e116101b15780636566571c116101755780636566571c146104a15780636c0360eb146104cc5780636f8b44b0146104f757806370a0823114610520578063715018a61461055d57610225565b806342842e0e146103cb5780634b11faaf146103f4578063525f8a5c146104105780635d25f4ec146104395780636352211e1461046457610225565b806318160ddd116101f857806318160ddd146102f85780631cbaee2d1461032357806323b872dd1461034e5780632e1a7d4d146103775780632eb4a7ab146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906130ea565b6108b1565b60405161025e9190613132565b60405180910390f35b34801561027357600080fd5b5061027c610943565b60405161028991906131dd565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613235565b6109d5565b6040516102c691906132a3565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906132ea565b610a51565b005b34801561030457600080fd5b5061030d610bf7565b60405161031a9190613339565b60405180910390f35b34801561032f57600080fd5b50610338610c0e565b6040516103459190613339565b60405180910390f35b34801561035a57600080fd5b5061037560048036038101906103709190613354565b610c14565b005b34801561038357600080fd5b5061039e60048036038101906103999190613235565b610df6565b005b3480156103ac57600080fd5b506103b5610ebc565b6040516103c291906133c0565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190613354565b610ec2565b005b61040e60048036038101906104099190613440565b6110a4565b005b34801561041c57600080fd5b5061043760048036038101906104329190613235565b6113aa565b005b34801561044557600080fd5b5061044e611430565b60405161045b9190613339565b60405180910390f35b34801561047057600080fd5b5061048b60048036038101906104869190613235565b611436565b60405161049891906132a3565b60405180910390f35b3480156104ad57600080fd5b506104b6611448565b6040516104c39190613339565b60405180910390f35b3480156104d857600080fd5b506104e161144e565b6040516104ee91906131dd565b60405180910390f35b34801561050357600080fd5b5061051e60048036038101906105199190613235565b6114dc565b005b34801561052c57600080fd5b50610547600480360381019061054291906134b4565b611562565b6040516105549190613339565b60405180910390f35b34801561056957600080fd5b506105726115f6565b005b34801561058057600080fd5b5061058961167e565b60405161059691906131dd565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c1919061350d565b61170c565b005b3480156105d457600080fd5b506105dd611792565b6040516105ea91906132a3565b60405180910390f35b3480156105ff57600080fd5b506106086117bc565b60405161061591906131dd565b60405180910390f35b34801561062a57600080fd5b5061063361184e565b60405161064091906135b1565b60405180910390f35b34801561065557600080fd5b50610670600480360381019061066b91906136fc565b6118b4565b005b34801561067e57600080fd5b5061069960048036038101906106949190613771565b611943565b005b6106b560048036038101906106b091906132ea565b611aba565b005b6106d160048036038101906106cc91906132ea565b611d74565b005b3480156106df57600080fd5b506106e8611e55565b6040516106f59190613339565b60405180910390f35b34801561070a57600080fd5b50610725600480360381019061072091906134b4565b611e5b565b6040516107329190613339565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d9190613852565b611e73565b005b34801561077057600080fd5b50610779612058565b6040516107869190613339565b60405180910390f35b34801561079b57600080fd5b506107a461205e565b6040516107b19190613339565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc9190613235565b612064565b6040516107ee91906131dd565b60405180910390f35b34801561080357600080fd5b5061080c612127565b60405161081991906135b1565b60405180910390f35b34801561082e57600080fd5b50610849600480360381019061084491906138d5565b61213a565b6040516108569190613132565b60405180910390f35b34801561086b57600080fd5b50610886600480360381019061088191906134b4565b6121ce565b005b34801561089457600080fd5b506108af60048036038101906108aa9190613235565b6122c5565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061093c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461095290613944565b80601f016020809104026020016040519081016040528092919081815260200182805461097e90613944565b80156109cb5780601f106109a0576101008083540402835291602001916109cb565b820191906000526020600020905b8154815290600101906020018083116109ae57829003601f168201915b5050505050905090565b60006109e08261234b565b610a16576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a5c826123aa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ac3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ae2612476565b73ffffffffffffffffffffffffffffffffffffffff1614610b4557610b0e81610b09612476565b61213a565b610b44576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c0161247e565b6001546000540303905090565b60115481565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610de4573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c8657610c81848484612483565b610df0565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610ccf929190613975565b602060405180830381865afa158015610cec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1091906139b3565b8015610da257506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610d60929190613975565b602060405180830381865afa158015610d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da191906139b3565b5b610de357336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610dda91906132a3565b60405180910390fd5b5b610def848484612483565b5b50505050565b610dfe612493565b73ffffffffffffffffffffffffffffffffffffffff16610e1c611792565b73ffffffffffffffffffffffffffffffffffffffff1614610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6990613a2c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610eb8573d6000803e3d6000fd5b5050565b60125481565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611092573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3457610f2f84848461249b565b61109e565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f7d929190613975565b602060405180830381865afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe91906139b3565b801561105057506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161100e929190613975565b602060405180830381865afa15801561102b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104f91906139b3565b5b61109157336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161108891906132a3565b60405180910390fd5b5b61109d84848461249b565b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110990613a98565b60405180910390fd5b600160048111156111265761112561353a565b5b61112e61184e565b60048111156111405761113f61353a565b5b14611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790613b04565b60405180910390fd5b61118b3383836124bb565b6111ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c190613b70565b60405180910390fd5b600b54836111d6610bf7565b6111e09190613bbf565b1115611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121890613c8b565b60405180910390fd5b600d54831115611266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125d90613d1d565b60405180910390fd5b82600f546112749190613d3d565b3410156112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad90613df1565b60405180910390fd5b600583601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113039190613bbf565b1115611344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133b90613e5d565b60405180910390fd5b82601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113939190613bbf565b925050819055506113a48484612519565b50505050565b6113b2612493565b73ffffffffffffffffffffffffffffffffffffffff166113d0611792565b73ffffffffffffffffffffffffffffffffffffffff1614611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d90613a2c565b60405180910390fd5b8060118190555050565b600d5481565b6000611441826123aa565b9050919050565b600c5481565b6009805461145b90613944565b80601f016020809104026020016040519081016040528092919081815260200182805461148790613944565b80156114d45780601f106114a9576101008083540402835291602001916114d4565b820191906000526020600020905b8154815290600101906020018083116114b757829003601f168201915b505050505081565b6114e4612493565b73ffffffffffffffffffffffffffffffffffffffff16611502611792565b73ffffffffffffffffffffffffffffffffffffffff1614611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154f90613a2c565b60405180910390fd5b80600b8190555050565b60008061156e83612537565b036115a5576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6115fe612493565b73ffffffffffffffffffffffffffffffffffffffff1661161c611792565b73ffffffffffffffffffffffffffffffffffffffff1614611672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166990613a2c565b60405180910390fd5b61167c6000612541565b565b600a805461168b90613944565b80601f01602080910402602001604051908101604052809291908181526020018280546116b790613944565b80156117045780601f106116d957610100808354040283529160200191611704565b820191906000526020600020905b8154815290600101906020018083116116e757829003601f168201915b505050505081565b611714612493565b73ffffffffffffffffffffffffffffffffffffffff16611732611792565b73ffffffffffffffffffffffffffffffffffffffff1614611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f90613a2c565b60405180910390fd5b8060128190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546117cb90613944565b80601f01602080910402602001604051908101604052809291908181526020018280546117f790613944565b80156118445780601f1061181957610100808354040283529160200191611844565b820191906000526020600020905b81548152906001019060200180831161182757829003601f168201915b5050505050905090565b600060115442101561186357600090506118b1565b601154421015801561188357506107086011546118809190613bbf565b42105b1561189157600190506118b1565b6107086011546118a19190613bbf565b42106118b057600290506118b1565b5b90565b6118bc612493565b73ffffffffffffffffffffffffffffffffffffffff166118da611792565b73ffffffffffffffffffffffffffffffffffffffff1614611930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192790613a2c565b60405180910390fd5b806009908161193f9190614029565b5050565b61194b612476565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119af576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006119bc612476565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a69612476565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611aae9190613132565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1f90613a98565b60405180910390fd5b60026004811115611b3c57611b3b61353a565b5b611b4461184e565b6004811115611b5657611b5561353a565b5b14611b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8d90614147565b60405180910390fd5b600b5481611ba2610bf7565b611bac9190613bbf565b1115611bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be490613c8b565b60405180910390fd5b600d54811115611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2990613d1d565b60405180910390fd5b80601054611c409190613d3d565b341015611c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7990613df1565b60405180910390fd5b600581601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ccf9190613bbf565b1115611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0790613e5d565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d5f9190613bbf565b92505081905550611d708282612519565b5050565b611d7c612493565b73ffffffffffffffffffffffffffffffffffffffff16611d9a611792565b73ffffffffffffffffffffffffffffffffffffffff1614611df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de790613a2c565b60405180910390fd5b600c5481611dfc610bf7565b611e069190613bbf565b1115611e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3e906141b3565b60405180910390fd5b611e518282612519565b5050565b600b5481565b60136020528060005260406000206000915090505481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612044573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ee657611ee185858585612607565b612051565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611f2f929190613975565b602060405180830381865afa158015611f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7091906139b3565b801561200257506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611fc0929190613975565b602060405180830381865afa158015611fdd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200191906139b3565b5b61204357336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161203a91906132a3565b60405180910390fd5b5b61205085858585612607565b5b5050505050565b60105481565b600f5481565b606061206f8261234b565b6120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a59061421f565b60405180910390fd5b60011515600e60009054906101000a900460ff161515036120fb5760096120d48361267a565b6040516020016120e592919061434a565b6040516020818303038152906040529050612122565b6009600a604051602001612110929190614379565b60405160208183030381529060405290505b919050565b600860149054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121d6612493565b73ffffffffffffffffffffffffffffffffffffffff166121f4611792565b73ffffffffffffffffffffffffffffffffffffffff161461224a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224190613a2c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036122b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b09061440f565b60405180910390fd5b6122c281612541565b50565b6122cd612493565b73ffffffffffffffffffffffffffffffffffffffff166122eb611792565b73ffffffffffffffffffffffffffffffffffffffff1614612341576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233890613a2c565b60405180910390fd5b8060108190555050565b60008161235661247e565b11158015612365575060005482105b80156123a3575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806123b961247e565b1161243f5760005481101561243e5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361243c575b60008103612432576004600083600190039350838152602001908152602001600020549050612408565b8092505050612471565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b61248e8383836127da565b505050565b600033905090565b6124b683838360405180602001604052806000815250611e73565b505050565b60006125106124c985612b9f565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612bcf565b90509392505050565b612533828260405180602001604052806000815250612be6565b5050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126128484846127da565b60008373ffffffffffffffffffffffffffffffffffffffff163b146126745761263d84848484612e75565b612673576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600082036126c1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127d5565b600082905060005b600082146126f35780806126dc9061442f565b915050600a826126ec91906144a6565b91506126c9565b60008167ffffffffffffffff81111561270f5761270e6135d1565b5b6040519080825280601f01601f1916602001820160405280156127415781602001600182028036833780820191505090505b5090505b600085146127ce5760018261275a91906144d7565b9150600a85612769919061450b565b60306127759190613bbf565b60f81b81838151811061278b5761278a61453c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127c791906144a6565b9450612745565b8093505050505b919050565b60006127e5826123aa565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461284c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff166128a5612476565b73ffffffffffffffffffffffffffffffffffffffff1614806128d457506128d3866128ce612476565b61213a565b5b8061291157506128e2612476565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b90508061294a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061295586612537565b0361298c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129998686866001612fc5565b60006129a483612537565b146129e0576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612aa787612537565b1717600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612b2f5760006001850190506000600460008381526020019081526020016000205403612b2d576000548114612b2c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b978686866001612fcb565b505050505050565b600081604051602001612bb291906145b3565b604051602081830303815290604052805190602001209050919050565b6000612bde8260125485612fd1565b905092915050565b6000805490506000612bf785612537565b03612c2e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612c68576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c756000858386612fc5565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612cda60018514612fe8565b901b60a042901b612cea86612537565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612dee575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d9e6000878480600101955087612e75565b612dd4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612d2f578260005414612de957600080fd5b612e59565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612def575b816000819055505050612e6f6000858386612fcb565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e9b612476565b8786866040518563ffffffff1660e01b8152600401612ebd9493929190614623565b6020604051808303816000875af1925050508015612ef957506040513d601f19601f82011682018060405250810190612ef69190614684565b60015b612f72573d8060008114612f29576040519150601f19603f3d011682016040523d82523d6000602084013e612f2e565b606091505b506000815103612f6a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b600082612fde8584612ff2565b1490509392505050565b6000819050919050565b60008082905060005b845181101561305c5760008582815181106130195761301861453c565b5b6020026020010151905080831161303b576130348382613067565b9250613048565b6130458184613067565b92505b5080806130549061442f565b915050612ffb565b508091505092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130c781613092565b81146130d257600080fd5b50565b6000813590506130e4816130be565b92915050565b600060208284031215613100576130ff613088565b5b600061310e848285016130d5565b91505092915050565b60008115159050919050565b61312c81613117565b82525050565b60006020820190506131476000830184613123565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561318757808201518184015260208101905061316c565b60008484015250505050565b6000601f19601f8301169050919050565b60006131af8261314d565b6131b98185613158565b93506131c9818560208601613169565b6131d281613193565b840191505092915050565b600060208201905081810360008301526131f781846131a4565b905092915050565b6000819050919050565b613212816131ff565b811461321d57600080fd5b50565b60008135905061322f81613209565b92915050565b60006020828403121561324b5761324a613088565b5b600061325984828501613220565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061328d82613262565b9050919050565b61329d81613282565b82525050565b60006020820190506132b86000830184613294565b92915050565b6132c781613282565b81146132d257600080fd5b50565b6000813590506132e4816132be565b92915050565b6000806040838503121561330157613300613088565b5b600061330f858286016132d5565b925050602061332085828601613220565b9150509250929050565b613333816131ff565b82525050565b600060208201905061334e600083018461332a565b92915050565b60008060006060848603121561336d5761336c613088565b5b600061337b868287016132d5565b935050602061338c868287016132d5565b925050604061339d86828701613220565b9150509250925092565b6000819050919050565b6133ba816133a7565b82525050565b60006020820190506133d560008301846133b1565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613400576133ff6133db565b5b8235905067ffffffffffffffff81111561341d5761341c6133e0565b5b602083019150836020820283011115613439576134386133e5565b5b9250929050565b6000806000806060858703121561345a57613459613088565b5b6000613468878288016132d5565b945050602061347987828801613220565b935050604085013567ffffffffffffffff81111561349a5761349961308d565b5b6134a6878288016133ea565b925092505092959194509250565b6000602082840312156134ca576134c9613088565b5b60006134d8848285016132d5565b91505092915050565b6134ea816133a7565b81146134f557600080fd5b50565b600081359050613507816134e1565b92915050565b60006020828403121561352357613522613088565b5b6000613531848285016134f8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6005811061357a5761357961353a565b5b50565b600081905061358b82613569565b919050565b600061359b8261357d565b9050919050565b6135ab81613590565b82525050565b60006020820190506135c660008301846135a2565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61360982613193565b810181811067ffffffffffffffff82111715613628576136276135d1565b5b80604052505050565b600061363b61307e565b90506136478282613600565b919050565b600067ffffffffffffffff821115613667576136666135d1565b5b61367082613193565b9050602081019050919050565b82818337600083830152505050565b600061369f61369a8461364c565b613631565b9050828152602081018484840111156136bb576136ba6135cc565b5b6136c684828561367d565b509392505050565b600082601f8301126136e3576136e26133db565b5b81356136f384826020860161368c565b91505092915050565b60006020828403121561371257613711613088565b5b600082013567ffffffffffffffff8111156137305761372f61308d565b5b61373c848285016136ce565b91505092915050565b61374e81613117565b811461375957600080fd5b50565b60008135905061376b81613745565b92915050565b6000806040838503121561378857613787613088565b5b6000613796858286016132d5565b92505060206137a78582860161375c565b9150509250929050565b600067ffffffffffffffff8211156137cc576137cb6135d1565b5b6137d582613193565b9050602081019050919050565b60006137f56137f0846137b1565b613631565b905082815260208101848484011115613811576138106135cc565b5b61381c84828561367d565b509392505050565b600082601f830112613839576138386133db565b5b81356138498482602086016137e2565b91505092915050565b6000806000806080858703121561386c5761386b613088565b5b600061387a878288016132d5565b945050602061388b878288016132d5565b935050604061389c87828801613220565b925050606085013567ffffffffffffffff8111156138bd576138bc61308d565b5b6138c987828801613824565b91505092959194509250565b600080604083850312156138ec576138eb613088565b5b60006138fa858286016132d5565b925050602061390b858286016132d5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061395c57607f821691505b60208210810361396f5761396e613915565b5b50919050565b600060408201905061398a6000830185613294565b6139976020830184613294565b9392505050565b6000815190506139ad81613745565b92915050565b6000602082840312156139c9576139c8613088565b5b60006139d78482850161399e565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a16602083613158565b9150613a21826139e0565b602082019050919050565b60006020820190508181036000830152613a4581613a09565b9050919050565b7f5265656e7472616e6379204775617264206973207761746368696e6700000000600082015250565b6000613a82601c83613158565b9150613a8d82613a4c565b602082019050919050565b60006020820190508181036000830152613ab181613a75565b9050919050565b7f57686974656c697374204d696e74206973206e6f7420796574204c4956450000600082015250565b6000613aee601e83613158565b9150613af982613ab8565b602082019050919050565b60006020820190508181036000830152613b1d81613ae1565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b6000613b5a601783613158565b9150613b6582613b24565b602082019050919050565b60006020820190508181036000830152613b8981613b4d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613bca826131ff565b9150613bd5836131ff565b9250828201905080821115613bed57613bec613b90565b5b92915050565b7f426f6e6520466e617469637320697320534f4c44204f55542e20596f7520636160008201527f6e2067657420796f75722066616e61746963207468726f756768204f70656e7360208201527f65612e0000000000000000000000000000000000000000000000000000000000604082015250565b6000613c75604383613158565b9150613c8082613bf3565b606082019050919050565b60006020820190508181036000830152613ca481613c68565b9050919050565b7f596f752063616e206f6e6c79206d696e74203520706572207472616e7361637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b6000613d07602383613158565b9150613d1282613cab565b604082019050919050565b60006020820190508181036000830152613d3681613cfa565b9050919050565b6000613d48826131ff565b9150613d53836131ff565b9250828202613d61816131ff565b91508282048414831517613d7857613d77613b90565b5b5092915050565b7f596f75722077616c6c6574206c61636b732045544820696e206f72646572207460008201527f6f206d696e740000000000000000000000000000000000000000000000000000602082015250565b6000613ddb602683613158565b9150613de682613d7f565b604082019050919050565b60006020820190508181036000830152613e0a81613dce565b9050919050565b7f596f752063616e206f6e6c79206d696e742035207065722077616c6c65740000600082015250565b6000613e47601e83613158565b9150613e5282613e11565b602082019050919050565b60006020820190508181036000830152613e7681613e3a565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613edf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ea2565b613ee98683613ea2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613f26613f21613f1c846131ff565b613f01565b6131ff565b9050919050565b6000819050919050565b613f4083613f0b565b613f54613f4c82613f2d565b848454613eaf565b825550505050565b600090565b613f69613f5c565b613f74818484613f37565b505050565b5b81811015613f9857613f8d600082613f61565b600181019050613f7a565b5050565b601f821115613fdd57613fae81613e7d565b613fb784613e92565b81016020851015613fc6578190505b613fda613fd285613e92565b830182613f79565b50505b505050565b600082821c905092915050565b600061400060001984600802613fe2565b1980831691505092915050565b60006140198383613fef565b9150826002028217905092915050565b6140328261314d565b67ffffffffffffffff81111561404b5761404a6135d1565b5b6140558254613944565b614060828285613f9c565b600060209050601f8311600181146140935760008415614081578287015190505b61408b858261400d565b8655506140f3565b601f1984166140a186613e7d565b60005b828110156140c9578489015182556001820191506020850194506020810190506140a4565b868310156140e657848901516140e2601f891682613fef565b8355505b6001600288020188555050505b505050505050565b7f5075626c6963204d696e74206973206e6f7420796574204c4956450000000000600082015250565b6000614131601b83613158565b915061413c826140fb565b602082019050919050565b6000602082019050818103600083015261416081614124565b9050919050565b7f4e46542063616e2774206265206d696e74656420616e796d6f72650000000000600082015250565b600061419d601b83613158565b91506141a882614167565b602082019050919050565b600060208201905081810360008301526141cc81614190565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b6000614209601f83613158565b9150614214826141d3565b602082019050919050565b60006020820190508181036000830152614238816141fc565b9050919050565b600081905092915050565b6000815461425781613944565b614261818661423f565b9450600182166000811461427c5760018114614291576142c4565b60ff19831686528115158202860193506142c4565b61429a85613e7d565b60005b838110156142bc5781548189015260018201915060208101905061429d565b838801955050505b50505092915050565b60006142d88261314d565b6142e2818561423f565b93506142f2818560208601613169565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061433460058361423f565b915061433f826142fe565b600582019050919050565b6000614356828561424a565b915061436282846142cd565b915061436d82614327565b91508190509392505050565b6000614385828561424a565b9150614391828461424a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143f9602683613158565b91506144048261439d565b604082019050919050565b60006020820190508181036000830152614428816143ec565b9050919050565b600061443a826131ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361446c5761446b613b90565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144b1826131ff565b91506144bc836131ff565b9250826144cc576144cb614477565b5b828204905092915050565b60006144e2826131ff565b91506144ed836131ff565b925082820390508181111561450557614504613b90565b5b92915050565b6000614516826131ff565b9150614521836131ff565b92508261453157614530614477565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008160601b9050919050565b60006145838261456b565b9050919050565b600061459582614578565b9050919050565b6145ad6145a882613282565b61458a565b82525050565b60006145bf828461459c565b60148201915081905092915050565b600081519050919050565b600082825260208201905092915050565b60006145f5826145ce565b6145ff81856145d9565b935061460f818560208601613169565b61461881613193565b840191505092915050565b60006080820190506146386000830187613294565b6146456020830186613294565b614652604083018561332a565b818103606083015261466481846145ea565b905095945050505050565b60008151905061467e816130be565b92915050565b60006020828403121561469a57614699613088565b5b60006146a88482850161466f565b9150509291505056fea264697066735822122039ebe8b552d91c75304862f77dd70b7f0e6c26bf0de856ca4b70ae0a5818227464736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000400d8d290a579cf27ee9ff559c0c00bff6425a8a40a25aeb5eabc7030671d7dd450000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d4e75354c6a766b50426e3762685a46624e34364d596f69324a3941734b4861586b777a4a676b354a725039632f00000000000000000000

Deployed Bytecode

0x6080604052600436106102255760003560e01c80637225038011610123578063b36c1284116100ab578063c87b56dd1161006f578063c87b56dd146107ba578063e25fe175146107f7578063e985e9c514610822578063f2fde38b1461085f578063f4a0a5281461088857610225565b8063b36c1284146106d3578063b88b77d2146106fe578063b88d4fde1461073b578063b8df407c14610764578063bfe2a08a1461078f57610225565b80639e5288a0116100f25780639e5288a01461061e578063a0bcfc7f14610649578063a22cb46514610672578063ac5ae11b1461069b578063add5a4fa146106b757610225565b806372250380146105745780637cb647591461059f5780638da5cb5b146105c857806395d89b41146105f357610225565b806342842e0e116101b15780636566571c116101755780636566571c146104a15780636c0360eb146104cc5780636f8b44b0146104f757806370a0823114610520578063715018a61461055d57610225565b806342842e0e146103cb5780634b11faaf146103f4578063525f8a5c146104105780635d25f4ec146104395780636352211e1461046457610225565b806318160ddd116101f857806318160ddd146102f85780631cbaee2d1461032357806323b872dd1461034e5780632e1a7d4d146103775780632eb4a7ab146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906130ea565b6108b1565b60405161025e9190613132565b60405180910390f35b34801561027357600080fd5b5061027c610943565b60405161028991906131dd565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613235565b6109d5565b6040516102c691906132a3565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906132ea565b610a51565b005b34801561030457600080fd5b5061030d610bf7565b60405161031a9190613339565b60405180910390f35b34801561032f57600080fd5b50610338610c0e565b6040516103459190613339565b60405180910390f35b34801561035a57600080fd5b5061037560048036038101906103709190613354565b610c14565b005b34801561038357600080fd5b5061039e60048036038101906103999190613235565b610df6565b005b3480156103ac57600080fd5b506103b5610ebc565b6040516103c291906133c0565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190613354565b610ec2565b005b61040e60048036038101906104099190613440565b6110a4565b005b34801561041c57600080fd5b5061043760048036038101906104329190613235565b6113aa565b005b34801561044557600080fd5b5061044e611430565b60405161045b9190613339565b60405180910390f35b34801561047057600080fd5b5061048b60048036038101906104869190613235565b611436565b60405161049891906132a3565b60405180910390f35b3480156104ad57600080fd5b506104b6611448565b6040516104c39190613339565b60405180910390f35b3480156104d857600080fd5b506104e161144e565b6040516104ee91906131dd565b60405180910390f35b34801561050357600080fd5b5061051e60048036038101906105199190613235565b6114dc565b005b34801561052c57600080fd5b50610547600480360381019061054291906134b4565b611562565b6040516105549190613339565b60405180910390f35b34801561056957600080fd5b506105726115f6565b005b34801561058057600080fd5b5061058961167e565b60405161059691906131dd565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c1919061350d565b61170c565b005b3480156105d457600080fd5b506105dd611792565b6040516105ea91906132a3565b60405180910390f35b3480156105ff57600080fd5b506106086117bc565b60405161061591906131dd565b60405180910390f35b34801561062a57600080fd5b5061063361184e565b60405161064091906135b1565b60405180910390f35b34801561065557600080fd5b50610670600480360381019061066b91906136fc565b6118b4565b005b34801561067e57600080fd5b5061069960048036038101906106949190613771565b611943565b005b6106b560048036038101906106b091906132ea565b611aba565b005b6106d160048036038101906106cc91906132ea565b611d74565b005b3480156106df57600080fd5b506106e8611e55565b6040516106f59190613339565b60405180910390f35b34801561070a57600080fd5b50610725600480360381019061072091906134b4565b611e5b565b6040516107329190613339565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d9190613852565b611e73565b005b34801561077057600080fd5b50610779612058565b6040516107869190613339565b60405180910390f35b34801561079b57600080fd5b506107a461205e565b6040516107b19190613339565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc9190613235565b612064565b6040516107ee91906131dd565b60405180910390f35b34801561080357600080fd5b5061080c612127565b60405161081991906135b1565b60405180910390f35b34801561082e57600080fd5b50610849600480360381019061084491906138d5565b61213a565b6040516108569190613132565b60405180910390f35b34801561086b57600080fd5b50610886600480360381019061088191906134b4565b6121ce565b005b34801561089457600080fd5b506108af60048036038101906108aa9190613235565b6122c5565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061093c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461095290613944565b80601f016020809104026020016040519081016040528092919081815260200182805461097e90613944565b80156109cb5780601f106109a0576101008083540402835291602001916109cb565b820191906000526020600020905b8154815290600101906020018083116109ae57829003601f168201915b5050505050905090565b60006109e08261234b565b610a16576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a5c826123aa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ac3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ae2612476565b73ffffffffffffffffffffffffffffffffffffffff1614610b4557610b0e81610b09612476565b61213a565b610b44576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c0161247e565b6001546000540303905090565b60115481565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610de4573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c8657610c81848484612483565b610df0565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610ccf929190613975565b602060405180830381865afa158015610cec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1091906139b3565b8015610da257506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610d60929190613975565b602060405180830381865afa158015610d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da191906139b3565b5b610de357336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610dda91906132a3565b60405180910390fd5b5b610def848484612483565b5b50505050565b610dfe612493565b73ffffffffffffffffffffffffffffffffffffffff16610e1c611792565b73ffffffffffffffffffffffffffffffffffffffff1614610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6990613a2c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610eb8573d6000803e3d6000fd5b5050565b60125481565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611092573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f3457610f2f84848461249b565b61109e565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f7d929190613975565b602060405180830381865afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe91906139b3565b801561105057506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161100e929190613975565b602060405180830381865afa15801561102b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104f91906139b3565b5b61109157336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161108891906132a3565b60405180910390fd5b5b61109d84848461249b565b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110990613a98565b60405180910390fd5b600160048111156111265761112561353a565b5b61112e61184e565b60048111156111405761113f61353a565b5b14611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790613b04565b60405180910390fd5b61118b3383836124bb565b6111ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c190613b70565b60405180910390fd5b600b54836111d6610bf7565b6111e09190613bbf565b1115611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121890613c8b565b60405180910390fd5b600d54831115611266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125d90613d1d565b60405180910390fd5b82600f546112749190613d3d565b3410156112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad90613df1565b60405180910390fd5b600583601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113039190613bbf565b1115611344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133b90613e5d565b60405180910390fd5b82601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113939190613bbf565b925050819055506113a48484612519565b50505050565b6113b2612493565b73ffffffffffffffffffffffffffffffffffffffff166113d0611792565b73ffffffffffffffffffffffffffffffffffffffff1614611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d90613a2c565b60405180910390fd5b8060118190555050565b600d5481565b6000611441826123aa565b9050919050565b600c5481565b6009805461145b90613944565b80601f016020809104026020016040519081016040528092919081815260200182805461148790613944565b80156114d45780601f106114a9576101008083540402835291602001916114d4565b820191906000526020600020905b8154815290600101906020018083116114b757829003601f168201915b505050505081565b6114e4612493565b73ffffffffffffffffffffffffffffffffffffffff16611502611792565b73ffffffffffffffffffffffffffffffffffffffff1614611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154f90613a2c565b60405180910390fd5b80600b8190555050565b60008061156e83612537565b036115a5576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6115fe612493565b73ffffffffffffffffffffffffffffffffffffffff1661161c611792565b73ffffffffffffffffffffffffffffffffffffffff1614611672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166990613a2c565b60405180910390fd5b61167c6000612541565b565b600a805461168b90613944565b80601f01602080910402602001604051908101604052809291908181526020018280546116b790613944565b80156117045780601f106116d957610100808354040283529160200191611704565b820191906000526020600020905b8154815290600101906020018083116116e757829003601f168201915b505050505081565b611714612493565b73ffffffffffffffffffffffffffffffffffffffff16611732611792565b73ffffffffffffffffffffffffffffffffffffffff1614611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f90613a2c565b60405180910390fd5b8060128190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546117cb90613944565b80601f01602080910402602001604051908101604052809291908181526020018280546117f790613944565b80156118445780601f1061181957610100808354040283529160200191611844565b820191906000526020600020905b81548152906001019060200180831161182757829003601f168201915b5050505050905090565b600060115442101561186357600090506118b1565b601154421015801561188357506107086011546118809190613bbf565b42105b1561189157600190506118b1565b6107086011546118a19190613bbf565b42106118b057600290506118b1565b5b90565b6118bc612493565b73ffffffffffffffffffffffffffffffffffffffff166118da611792565b73ffffffffffffffffffffffffffffffffffffffff1614611930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192790613a2c565b60405180910390fd5b806009908161193f9190614029565b5050565b61194b612476565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119af576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006119bc612476565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a69612476565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611aae9190613132565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1f90613a98565b60405180910390fd5b60026004811115611b3c57611b3b61353a565b5b611b4461184e565b6004811115611b5657611b5561353a565b5b14611b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8d90614147565b60405180910390fd5b600b5481611ba2610bf7565b611bac9190613bbf565b1115611bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be490613c8b565b60405180910390fd5b600d54811115611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2990613d1d565b60405180910390fd5b80601054611c409190613d3d565b341015611c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7990613df1565b60405180910390fd5b600581601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ccf9190613bbf565b1115611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0790613e5d565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d5f9190613bbf565b92505081905550611d708282612519565b5050565b611d7c612493565b73ffffffffffffffffffffffffffffffffffffffff16611d9a611792565b73ffffffffffffffffffffffffffffffffffffffff1614611df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de790613a2c565b60405180910390fd5b600c5481611dfc610bf7565b611e069190613bbf565b1115611e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3e906141b3565b60405180910390fd5b611e518282612519565b5050565b600b5481565b60136020528060005260406000206000915090505481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612044573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ee657611ee185858585612607565b612051565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611f2f929190613975565b602060405180830381865afa158015611f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7091906139b3565b801561200257506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611fc0929190613975565b602060405180830381865afa158015611fdd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200191906139b3565b5b61204357336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161203a91906132a3565b60405180910390fd5b5b61205085858585612607565b5b5050505050565b60105481565b600f5481565b606061206f8261234b565b6120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a59061421f565b60405180910390fd5b60011515600e60009054906101000a900460ff161515036120fb5760096120d48361267a565b6040516020016120e592919061434a565b6040516020818303038152906040529050612122565b6009600a604051602001612110929190614379565b60405160208183030381529060405290505b919050565b600860149054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121d6612493565b73ffffffffffffffffffffffffffffffffffffffff166121f4611792565b73ffffffffffffffffffffffffffffffffffffffff161461224a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224190613a2c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036122b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b09061440f565b60405180910390fd5b6122c281612541565b50565b6122cd612493565b73ffffffffffffffffffffffffffffffffffffffff166122eb611792565b73ffffffffffffffffffffffffffffffffffffffff1614612341576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233890613a2c565b60405180910390fd5b8060108190555050565b60008161235661247e565b11158015612365575060005482105b80156123a3575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806123b961247e565b1161243f5760005481101561243e5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361243c575b60008103612432576004600083600190039350838152602001908152602001600020549050612408565b8092505050612471565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b61248e8383836127da565b505050565b600033905090565b6124b683838360405180602001604052806000815250611e73565b505050565b60006125106124c985612b9f565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612bcf565b90509392505050565b612533828260405180602001604052806000815250612be6565b5050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126128484846127da565b60008373ffffffffffffffffffffffffffffffffffffffff163b146126745761263d84848484612e75565b612673576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600082036126c1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127d5565b600082905060005b600082146126f35780806126dc9061442f565b915050600a826126ec91906144a6565b91506126c9565b60008167ffffffffffffffff81111561270f5761270e6135d1565b5b6040519080825280601f01601f1916602001820160405280156127415781602001600182028036833780820191505090505b5090505b600085146127ce5760018261275a91906144d7565b9150600a85612769919061450b565b60306127759190613bbf565b60f81b81838151811061278b5761278a61453c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127c791906144a6565b9450612745565b8093505050505b919050565b60006127e5826123aa565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461284c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff166128a5612476565b73ffffffffffffffffffffffffffffffffffffffff1614806128d457506128d3866128ce612476565b61213a565b5b8061291157506128e2612476565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b90508061294a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061295586612537565b0361298c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129998686866001612fc5565b60006129a483612537565b146129e0576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612aa787612537565b1717600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612b2f5760006001850190506000600460008381526020019081526020016000205403612b2d576000548114612b2c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b978686866001612fcb565b505050505050565b600081604051602001612bb291906145b3565b604051602081830303815290604052805190602001209050919050565b6000612bde8260125485612fd1565b905092915050565b6000805490506000612bf785612537565b03612c2e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612c68576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c756000858386612fc5565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612cda60018514612fe8565b901b60a042901b612cea86612537565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612dee575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d9e6000878480600101955087612e75565b612dd4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612d2f578260005414612de957600080fd5b612e59565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612def575b816000819055505050612e6f6000858386612fcb565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e9b612476565b8786866040518563ffffffff1660e01b8152600401612ebd9493929190614623565b6020604051808303816000875af1925050508015612ef957506040513d601f19601f82011682018060405250810190612ef69190614684565b60015b612f72573d8060008114612f29576040519150601f19603f3d011682016040523d82523d6000602084013e612f2e565b606091505b506000815103612f6a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b600082612fde8584612ff2565b1490509392505050565b6000819050919050565b60008082905060005b845181101561305c5760008582815181106130195761301861453c565b5b6020026020010151905080831161303b576130348382613067565b9250613048565b6130458184613067565b92505b5080806130549061442f565b915050612ffb565b508091505092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130c781613092565b81146130d257600080fd5b50565b6000813590506130e4816130be565b92915050565b600060208284031215613100576130ff613088565b5b600061310e848285016130d5565b91505092915050565b60008115159050919050565b61312c81613117565b82525050565b60006020820190506131476000830184613123565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561318757808201518184015260208101905061316c565b60008484015250505050565b6000601f19601f8301169050919050565b60006131af8261314d565b6131b98185613158565b93506131c9818560208601613169565b6131d281613193565b840191505092915050565b600060208201905081810360008301526131f781846131a4565b905092915050565b6000819050919050565b613212816131ff565b811461321d57600080fd5b50565b60008135905061322f81613209565b92915050565b60006020828403121561324b5761324a613088565b5b600061325984828501613220565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061328d82613262565b9050919050565b61329d81613282565b82525050565b60006020820190506132b86000830184613294565b92915050565b6132c781613282565b81146132d257600080fd5b50565b6000813590506132e4816132be565b92915050565b6000806040838503121561330157613300613088565b5b600061330f858286016132d5565b925050602061332085828601613220565b9150509250929050565b613333816131ff565b82525050565b600060208201905061334e600083018461332a565b92915050565b60008060006060848603121561336d5761336c613088565b5b600061337b868287016132d5565b935050602061338c868287016132d5565b925050604061339d86828701613220565b9150509250925092565b6000819050919050565b6133ba816133a7565b82525050565b60006020820190506133d560008301846133b1565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613400576133ff6133db565b5b8235905067ffffffffffffffff81111561341d5761341c6133e0565b5b602083019150836020820283011115613439576134386133e5565b5b9250929050565b6000806000806060858703121561345a57613459613088565b5b6000613468878288016132d5565b945050602061347987828801613220565b935050604085013567ffffffffffffffff81111561349a5761349961308d565b5b6134a6878288016133ea565b925092505092959194509250565b6000602082840312156134ca576134c9613088565b5b60006134d8848285016132d5565b91505092915050565b6134ea816133a7565b81146134f557600080fd5b50565b600081359050613507816134e1565b92915050565b60006020828403121561352357613522613088565b5b6000613531848285016134f8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6005811061357a5761357961353a565b5b50565b600081905061358b82613569565b919050565b600061359b8261357d565b9050919050565b6135ab81613590565b82525050565b60006020820190506135c660008301846135a2565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61360982613193565b810181811067ffffffffffffffff82111715613628576136276135d1565b5b80604052505050565b600061363b61307e565b90506136478282613600565b919050565b600067ffffffffffffffff821115613667576136666135d1565b5b61367082613193565b9050602081019050919050565b82818337600083830152505050565b600061369f61369a8461364c565b613631565b9050828152602081018484840111156136bb576136ba6135cc565b5b6136c684828561367d565b509392505050565b600082601f8301126136e3576136e26133db565b5b81356136f384826020860161368c565b91505092915050565b60006020828403121561371257613711613088565b5b600082013567ffffffffffffffff8111156137305761372f61308d565b5b61373c848285016136ce565b91505092915050565b61374e81613117565b811461375957600080fd5b50565b60008135905061376b81613745565b92915050565b6000806040838503121561378857613787613088565b5b6000613796858286016132d5565b92505060206137a78582860161375c565b9150509250929050565b600067ffffffffffffffff8211156137cc576137cb6135d1565b5b6137d582613193565b9050602081019050919050565b60006137f56137f0846137b1565b613631565b905082815260208101848484011115613811576138106135cc565b5b61381c84828561367d565b509392505050565b600082601f830112613839576138386133db565b5b81356138498482602086016137e2565b91505092915050565b6000806000806080858703121561386c5761386b613088565b5b600061387a878288016132d5565b945050602061388b878288016132d5565b935050604061389c87828801613220565b925050606085013567ffffffffffffffff8111156138bd576138bc61308d565b5b6138c987828801613824565b91505092959194509250565b600080604083850312156138ec576138eb613088565b5b60006138fa858286016132d5565b925050602061390b858286016132d5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061395c57607f821691505b60208210810361396f5761396e613915565b5b50919050565b600060408201905061398a6000830185613294565b6139976020830184613294565b9392505050565b6000815190506139ad81613745565b92915050565b6000602082840312156139c9576139c8613088565b5b60006139d78482850161399e565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a16602083613158565b9150613a21826139e0565b602082019050919050565b60006020820190508181036000830152613a4581613a09565b9050919050565b7f5265656e7472616e6379204775617264206973207761746368696e6700000000600082015250565b6000613a82601c83613158565b9150613a8d82613a4c565b602082019050919050565b60006020820190508181036000830152613ab181613a75565b9050919050565b7f57686974656c697374204d696e74206973206e6f7420796574204c4956450000600082015250565b6000613aee601e83613158565b9150613af982613ab8565b602082019050919050565b60006020820190508181036000830152613b1d81613ae1565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b6000613b5a601783613158565b9150613b6582613b24565b602082019050919050565b60006020820190508181036000830152613b8981613b4d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613bca826131ff565b9150613bd5836131ff565b9250828201905080821115613bed57613bec613b90565b5b92915050565b7f426f6e6520466e617469637320697320534f4c44204f55542e20596f7520636160008201527f6e2067657420796f75722066616e61746963207468726f756768204f70656e7360208201527f65612e0000000000000000000000000000000000000000000000000000000000604082015250565b6000613c75604383613158565b9150613c8082613bf3565b606082019050919050565b60006020820190508181036000830152613ca481613c68565b9050919050565b7f596f752063616e206f6e6c79206d696e74203520706572207472616e7361637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b6000613d07602383613158565b9150613d1282613cab565b604082019050919050565b60006020820190508181036000830152613d3681613cfa565b9050919050565b6000613d48826131ff565b9150613d53836131ff565b9250828202613d61816131ff565b91508282048414831517613d7857613d77613b90565b5b5092915050565b7f596f75722077616c6c6574206c61636b732045544820696e206f72646572207460008201527f6f206d696e740000000000000000000000000000000000000000000000000000602082015250565b6000613ddb602683613158565b9150613de682613d7f565b604082019050919050565b60006020820190508181036000830152613e0a81613dce565b9050919050565b7f596f752063616e206f6e6c79206d696e742035207065722077616c6c65740000600082015250565b6000613e47601e83613158565b9150613e5282613e11565b602082019050919050565b60006020820190508181036000830152613e7681613e3a565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613edf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ea2565b613ee98683613ea2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613f26613f21613f1c846131ff565b613f01565b6131ff565b9050919050565b6000819050919050565b613f4083613f0b565b613f54613f4c82613f2d565b848454613eaf565b825550505050565b600090565b613f69613f5c565b613f74818484613f37565b505050565b5b81811015613f9857613f8d600082613f61565b600181019050613f7a565b5050565b601f821115613fdd57613fae81613e7d565b613fb784613e92565b81016020851015613fc6578190505b613fda613fd285613e92565b830182613f79565b50505b505050565b600082821c905092915050565b600061400060001984600802613fe2565b1980831691505092915050565b60006140198383613fef565b9150826002028217905092915050565b6140328261314d565b67ffffffffffffffff81111561404b5761404a6135d1565b5b6140558254613944565b614060828285613f9c565b600060209050601f8311600181146140935760008415614081578287015190505b61408b858261400d565b8655506140f3565b601f1984166140a186613e7d565b60005b828110156140c9578489015182556001820191506020850194506020810190506140a4565b868310156140e657848901516140e2601f891682613fef565b8355505b6001600288020188555050505b505050505050565b7f5075626c6963204d696e74206973206e6f7420796574204c4956450000000000600082015250565b6000614131601b83613158565b915061413c826140fb565b602082019050919050565b6000602082019050818103600083015261416081614124565b9050919050565b7f4e46542063616e2774206265206d696e74656420616e796d6f72650000000000600082015250565b600061419d601b83613158565b91506141a882614167565b602082019050919050565b600060208201905081810360008301526141cc81614190565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b6000614209601f83613158565b9150614214826141d3565b602082019050919050565b60006020820190508181036000830152614238816141fc565b9050919050565b600081905092915050565b6000815461425781613944565b614261818661423f565b9450600182166000811461427c5760018114614291576142c4565b60ff19831686528115158202860193506142c4565b61429a85613e7d565b60005b838110156142bc5781548189015260018201915060208101905061429d565b838801955050505b50505092915050565b60006142d88261314d565b6142e2818561423f565b93506142f2818560208601613169565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061433460058361423f565b915061433f826142fe565b600582019050919050565b6000614356828561424a565b915061436282846142cd565b915061436d82614327565b91508190509392505050565b6000614385828561424a565b9150614391828461424a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143f9602683613158565b91506144048261439d565b604082019050919050565b60006020820190508181036000830152614428816143ec565b9050919050565b600061443a826131ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361446c5761446b613b90565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144b1826131ff565b91506144bc836131ff565b9250826144cc576144cb614477565b5b828204905092915050565b60006144e2826131ff565b91506144ed836131ff565b925082820390508181111561450557614504613b90565b5b92915050565b6000614516826131ff565b9150614521836131ff565b92508261453157614530614477565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008160601b9050919050565b60006145838261456b565b9050919050565b600061459582614578565b9050919050565b6145ad6145a882613282565b61458a565b82525050565b60006145bf828461459c565b60148201915081905092915050565b600081519050919050565b600082825260208201905092915050565b60006145f5826145ce565b6145ff81856145d9565b935061460f818560208601613169565b61461881613193565b840191505092915050565b60006080820190506146386000830187613294565b6146456020830186613294565b614652604083018561332a565b818103606083015261466481846145ea565b905095945050505050565b60008151905061467e816130be565b92915050565b60006020828403121561469a57614699613088565b5b60006146a88482850161466f565b9150509291505056fea264697066735822122039ebe8b552d91c75304862f77dd70b7f0e6c26bf0de856ca4b70ae0a5818227464736f6c63430008110033

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

00000000000000000000000000000000000000000000000000000000000000400d8d290a579cf27ee9ff559c0c00bff6425a8a40a25aeb5eabc7030671d7dd450000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d4e75354c6a766b50426e3762685a46624e34364d596f69324a3941734b4861586b777a4a676b354a725039632f00000000000000000000

-----Decoded View---------------
Arg [0] : _baseURI (string): ipfs://QmNu5LjvkPBn7bhZFbN46MYoi2J9AsKHaXkwzJgk5JrP9c/
Arg [1] : _merkleRoot (bytes32): 0x0d8d290a579cf27ee9ff559c0c00bff6425a8a40a25aeb5eabc7030671d7dd45

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0d8d290a579cf27ee9ff559c0c00bff6425a8a40a25aeb5eabc7030671d7dd45
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d4e75354c6a766b50426e3762685a46624e34364d596f69
Arg [4] : 324a3941734b4861586b777a4a676b354a725039632f00000000000000000000


Deployed Bytecode Sourcemap

51496:5205:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17635:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22658:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24726:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24186:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16689:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52041:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56009:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56595:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52088:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56180:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53121:770;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54679:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51885:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22447:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51851:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51751:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54808:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18314:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47916:103;;;;;;;;;;;;;:::i;:::-;;51779:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55436:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47265:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22827:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52473:421;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54565:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25002:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53899:658;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52902:209;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51816:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52120:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56359:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51998:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51957;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55035:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51726:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25381:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48174:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54921:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17635:615;17720:4;18035:10;18020:25;;:11;:25;;;;:102;;;;18112:10;18097:25;;:11;:25;;;;18020:102;:179;;;;18189:10;18174:25;;:11;:25;;;;18020:179;18000:199;;17635:615;;;:::o;22658:100::-;22712:13;22745:5;22738:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22658:100;:::o;24726:204::-;24794:7;24819:16;24827:7;24819;:16::i;:::-;24814:64;;24844:34;;;;;;;;;;;;;;24814:64;24898:15;:24;24914:7;24898:24;;;;;;;;;;;;;;;;;;;;;24891:31;;24726:204;;;:::o;24186:474::-;24259:13;24291:27;24310:7;24291:18;:27::i;:::-;24259:61;;24341:5;24335:11;;:2;:11;;;24331:48;;24355:24;;;;;;;;;;;;;;24331:48;24419:5;24396:28;;:19;:17;:19::i;:::-;:28;;;24392:175;;24444:44;24461:5;24468:19;:17;:19::i;:::-;24444:16;:44::i;:::-;24439:128;;24516:35;;;;;;;;;;;;;;24439:128;24392:175;24606:2;24579:15;:24;24595:7;24579:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;24644:7;24640:2;24624:28;;24633:5;24624:28;;;;;;;;;;;;24248:412;24186:474;;:::o;16689:315::-;16742:7;16970:15;:13;:15::i;:::-;16955:12;;16939:13;;:28;:46;16932:53;;16689:315;:::o;52041:38::-;;;;:::o;56009:163::-;56110:4;3592:1;2406:42;3546:43;;;:47;3542:699;;;3833:10;3825:18;;:4;:18;;;3821:85;;56127:37:::1;56146:4;56152:2;56156:7;56127:18;:37::i;:::-;3884:7:::0;;3821:85;2406:42;3966:40;;;4015:4;4022:10;3966:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2406:42;4062:40;;;4111:4;4118;4062:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3966:157;3920:310;;4203:10;4184:30;;;;;;;;;;;:::i;:::-;;;;;;;;3920:310;3542:699;56127:37:::1;56146:4;56152:2;56156:7;56127:18;:37::i;:::-;56009:163:::0;;;;;:::o;56595:103::-;47496:12;:10;:12::i;:::-;47485:23;;:7;:5;:7::i;:::-;:23;;;47477:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56662:10:::1;56654:28;;:36;56683:6;56654:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;56595:103:::0;:::o;52088:25::-;;;;:::o;56180:171::-;56285:4;3592:1;2406:42;3546:43;;;:47;3542:699;;;3833:10;3825:18;;:4;:18;;;3821:85;;56302:41:::1;56325:4;56331:2;56335:7;56302:22;:41::i;:::-;3884:7:::0;;3821:85;2406:42;3966:40;;;4015:4;4022:10;3966:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2406:42;4062:40;;;4111:4;4118;4062:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3966:157;3920:310;;4203:10;4184:30;;;;;;;;;;;:::i;:::-;;;;;;;;3920:310;3542:699;56302:41:::1;56325:4;56331:2;56335:7;56302:22;:41::i;:::-;56180:171:::0;;;;;:::o;53121:770::-;52402:10;52389:23;;:9;:23;;;52381:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;53268:18:::1;53255:31;;;;;;;;:::i;:::-;;:9;:7;:9::i;:::-;:31;;;;;;;;:::i;:::-;;;53247:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;53340:33;53354:10;53366:6;;53340:13;:33::i;:::-;53332:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53449:9;;53436;53420:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;;53412:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;53562:8;;53549:9;:21;;53541:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53653:9;53642:8;;:20;;;;:::i;:::-;53629:9;:33;;53621:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;53764:1;53751:9;53724:12;:24;53737:10;53724:24;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:41;;53716:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;53833:9;53805:12;:24;53818:10;53805:24;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;53853:30;53863:8;53873:9;53853;:30::i;:::-;53121:770:::0;;;;:::o;54679:121::-;47496:12;:10;:12::i;:::-;47485:23;;:7;:5;:7::i;:::-;:23;;;47477:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54775:17:::1;54759:13;:33;;;;54679:121:::0;:::o;51885:24::-;;;;:::o;22447:144::-;22511:7;22554:27;22573:7;22554:18;:27::i;:::-;22531:52;;22447:144;;;:::o;51851:27::-;;;;:::o;51751:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54808:105::-;47496:12;:10;:12::i;:::-;47485:23;;:7;:5;:7::i;:::-;:23;;;47477:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54892:13:::1;54880:9;:25;;;;54808:105:::0;:::o;18314:234::-;18378:7;18430:1;18402:24;18420:5;18402:17;:24::i;:::-;:29;18398:70;;18440:28;;;;;;;;;;;;;;18398:70;13659:13;18486:18;:25;18505:5;18486:25;;;;;;;;;;;;;;;;:54;18479:61;;18314:234;;;:::o;47916:103::-;47496:12;:10;:12::i;:::-;47485:23;;:7;:5;:7::i;:::-;:23;;;47477:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47981:30:::1;48008:1;47981:18;:30::i;:::-;47916:103::o:0;51779:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55436:106::-;47496:12;:10;:12::i;:::-;47485:23;;:7;:5;:7::i;:::-;:23;;;47477:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55523:11:::1;55510:10;:24;;;;55436:106:::0;:::o;47265:87::-;47311:7;47338:6;;;;;;;;;;;47331:13;;47265:87;:::o;22827:104::-;22883:13;22916:7;22909:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22827:104;:::o;52473:421::-;52512:15;52561:13;;52543:15;:31;52540:83;;;52598:13;52591:20;;;;52540:83;52655:13;;52636:15;:32;;:88;;;;;52714:10;52698:13;;:26;;;;:::i;:::-;52680:15;:44;52636:88;52633:145;;;52748:18;52741:25;;;;52633:145;52826:10;52810:13;;:26;;;;:::i;:::-;52791:15;:45;52788:99;;52860:15;52853:22;;;;52788:99;52473:421;;:::o;54565:106::-;47496:12;:10;:12::i;:::-;47485:23;;:7;:5;:7::i;:::-;:23;;;47477:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54652:11:::1;54642:7;:21;;;;;;:::i;:::-;;54565:106:::0;:::o;25002:308::-;25113:19;:17;:19::i;:::-;25101:31;;:8;:31;;;25097:61;;25141:17;;;;;;;;;;;;;;25097:61;25223:8;25171:18;:39;25190:19;:17;:19::i;:::-;25171:39;;;;;;;;;;;;;;;:49;25211:8;25171:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;25283:8;25247:55;;25262:19;:17;:19::i;:::-;25247:55;;;25293:8;25247:55;;;;;;:::i;:::-;;;;;;;;25002:308;;:::o;53899:658::-;52402:10;52389:23;;:9;:23;;;52381:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;54020:15:::1;54007:28;;;;;;;;:::i;:::-;;:9;:7;:9::i;:::-;:28;;;;;;;;:::i;:::-;;;53999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54115:9;;54102;54086:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;;54078:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;54228:8;;54215:9;:21;;54207:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54319:9;54308:8;;:20;;;;:::i;:::-;54295:9;:33;;54287:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;54430:1;54417:9;54390:12;:24;54403:10;54390:24;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:41;;54382:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;54499:9;54471:12;:24;54484:10;54471:24;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;54519:30;54529:8;54539:9;54519;:30::i;:::-;53899:658:::0;;:::o;52902:209::-;47496:12;:10;:12::i;:::-;47485:23;;:7;:5;:7::i;:::-;:23;;;47477:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53024:10:::1;;53011:9;52995:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;52987:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;53077:26;53087:3;53093:9;53077;:26::i;:::-;52902:209:::0;;:::o;51816:28::-;;;;:::o;52120:44::-;;;;;;;;;;;;;;;;;:::o;56359:228::-;56510:4;3592:1;2406:42;3546:43;;;:47;3542:699;;;3833:10;3825:18;;:4;:18;;;3821:85;;56532:47:::1;56555:4;56561:2;56565:7;56574:4;56532:22;:47::i;:::-;3884:7:::0;;3821:85;2406:42;3966:40;;;4015:4;4022:10;3966:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2406:42;4062:40;;;4111:4;4118;4062:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3966:157;3920:310;;4203:10;4184:30;;;;;;;;;;;:::i;:::-;;;;;;;;3920:310;3542:699;56532:47:::1;56555:4;56561:2;56565:7;56574:4;56532:22;:47::i;:::-;56359:228:::0;;;;;;:::o;51998:34::-;;;;:::o;51957:::-;;;;:::o;55035:394::-;55106:13;55140:17;55148:8;55140:7;:17::i;:::-;55132:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;55221:4;55207:18;;:10;;;;;;;;;;;:18;;;55204:218;;55273:7;55282:19;:8;:17;:19::i;:::-;55256:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55242:70;;;;55204:218;55385:7;55394:14;55368:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55354:56;;55035:394;;;;:::o;51726:16::-;;;;;;;;;;;;;:::o;25381:164::-;25478:4;25502:18;:25;25521:5;25502:25;;;;;;;;;;;;;;;:35;25528:8;25502:35;;;;;;;;;;;;;;;;;;;;;;;;;25495:42;;25381:164;;;;:::o;48174:201::-;47496:12;:10;:12::i;:::-;47485:23;;:7;:5;:7::i;:::-;:23;;;47477:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48283:1:::1;48263:22;;:8;:22;;::::0;48255:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;48339:28;48358:8;48339:18;:28::i;:::-;48174:201:::0;:::o;54921:106::-;47496:12;:10;:12::i;:::-;47485:23;;:7;:5;:7::i;:::-;:23;;;47477:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55005:14:::1;54994:8;:25;;;;54921:106:::0;:::o;26760:273::-;26817:4;26873:7;26854:15;:13;:15::i;:::-;:26;;:66;;;;;26907:13;;26897:7;:23;26854:66;:152;;;;;27005:1;14429:8;26958:17;:26;26976:7;26958:26;;;;;;;;;;;;:43;:48;26854:152;26834:172;;26760:273;;;:::o;19962:1129::-;20029:7;20049:12;20064:7;20049:22;;20132:4;20113:15;:13;:15::i;:::-;:23;20109:915;;20166:13;;20159:4;:20;20155:869;;;20204:14;20221:17;:23;20239:4;20221:23;;;;;;;;;;;;20204:40;;20337:1;14429:8;20310:6;:23;:28;20306:699;;20829:113;20846:1;20836:6;:11;20829:113;;20889:17;:25;20907:6;;;;;;;20889:25;;;;;;;;;;;;20880:34;;20829:113;;;20975:6;20968:13;;;;;;20306:699;20181:843;20155:869;20109:915;21052:31;;;;;;;;;;;;;;19962:1129;;;;:::o;41027:105::-;41087:7;41114:10;41107:17;;41027:105;:::o;16213:92::-;16269:7;16213:92;:::o;25612:170::-;25746:28;25756:4;25762:2;25766:7;25746:9;:28::i;:::-;25612:170;;;:::o;45989:98::-;46042:7;46069:10;46062:17;;45989:98;:::o;25853:185::-;25991:39;26008:4;26014:2;26018:7;25991:39;;;;;;;;;;;;:16;:39::i;:::-;25853:185;;;:::o;55550:153::-;55640:4;55664:31;55672:14;55677:8;55672:4;:14::i;:::-;55688:6;;55664:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:31::i;:::-;55657:38;;55550:153;;;;;:::o;27117:104::-;27186:27;27196:2;27200:8;27186:27;;;;;;;;;;;;:9;:27::i;:::-;27117:104;;:::o;23747:148::-;23811:14;23872:5;23862:15;;23747:148;;;:::o;48535:191::-;48609:16;48628:6;;;;;;;;;;;48609:25;;48654:8;48645:6;;:17;;;;;;;;;;;;;;;;;;48709:8;48678:40;;48699:8;48678:40;;;;;;;;;;;;48598:128;48535:191;:::o;26109:396::-;26276:28;26286:4;26292:2;26296:7;26276:9;:28::i;:::-;26337:1;26319:2;:14;;;:19;26315:183;;26358:56;26389:4;26395:2;26399:7;26408:5;26358:30;:56::i;:::-;26353:145;;26442:40;;;;;;;;;;;;;;26353:145;26315:183;26109:396;;;;:::o;43551:723::-;43607:13;43837:1;43828:5;:10;43824:53;;43855:10;;;;;;;;;;;;;;;;;;;;;43824:53;43887:12;43902:5;43887:20;;43918:14;43943:78;43958:1;43950:4;:9;43943:78;;43976:8;;;;;:::i;:::-;;;;44007:2;43999:10;;;;;:::i;:::-;;;43943:78;;;44031:19;44063:6;44053:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44031:39;;44081:154;44097:1;44088:5;:10;44081:154;;44125:1;44115:11;;;;;:::i;:::-;;;44192:2;44184:5;:10;;;;:::i;:::-;44171:2;:24;;;;:::i;:::-;44158:39;;44141:6;44148;44141:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;44221:2;44212:11;;;;;:::i;:::-;;;44081:154;;;44259:6;44245:21;;;;;43551:723;;;;:::o;32019:2654::-;32134:27;32164;32183:7;32164:18;:27::i;:::-;32134:57;;32249:4;32208:45;;32224:19;32208:45;;;32204:86;;32262:28;;;;;;;;;;;;;;32204:86;32303:23;32329:15;:24;32345:7;32329:24;;;;;;;;;;;;;;;;;;;;;32303:50;;32366:22;32415:4;32392:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;32436:43;32453:4;32459:19;:17;:19::i;:::-;32436:16;:43::i;:::-;32392:87;:142;;;;32515:19;:17;:19::i;:::-;32496:38;;:15;:38;;;32392:142;32366:169;;32553:17;32548:66;;32579:35;;;;;;;;;;;;;;32548:66;32654:1;32629:21;32647:2;32629:17;:21::i;:::-;:26;32625:62;;32664:23;;;;;;;;;;;;;;32625:62;32700:43;32722:4;32728:2;32732:7;32741:1;32700:21;:43::i;:::-;32851:1;32813:34;32831:15;32813:17;:34::i;:::-;:39;32809:103;;32876:15;:24;32892:7;32876:24;;;;;;;;;;;;32869:31;;;;;;;;;;;32809:103;33279:18;:24;33298:4;33279:24;;;;;;;;;;;;;;;;33277:26;;;;;;;;;;;;33348:18;:22;33367:2;33348:22;;;;;;;;;;;;;;;;33346:24;;;;;;;;;;;14707:8;14313:3;33729:15;:41;;33687:21;33705:2;33687:17;:21::i;:::-;:84;:128;33641:17;:26;33659:7;33641:26;;;;;;;;;;;:174;;;;33985:1;14707:8;33935:19;:46;:51;33931:626;;34007:19;34039:1;34029:7;:11;34007:33;;34196:1;34162:17;:30;34180:11;34162:30;;;;;;;;;;;;:35;34158:384;;34300:13;;34285:11;:28;34281:242;;34480:19;34447:17;:30;34465:11;34447:30;;;;;;;;;;;:52;;;;34281:242;34158:384;33988:569;33931:626;34604:7;34600:2;34585:27;;34594:4;34585:27;;;;;;;;;;;;34623:42;34644:4;34650:2;34654:7;34663:1;34623:20;:42::i;:::-;32123:2550;;;32019:2654;;;:::o;55711:126::-;55765:7;55819:8;55802:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;55792:37;;;;;;55785:44;;55711:126;;;:::o;55845:156::-;55924:4;55948:45;55967:6;55975:10;;55987:5;55948:18;:45::i;:::-;55941:52;;55845:156;;;;:::o;27594:2246::-;27717:20;27740:13;;27717:36;;27793:1;27768:21;27786:2;27768:17;:21::i;:::-;:26;27764:58;;27803:19;;;;;;;;;;;;;;27764:58;27849:1;27837:8;:13;27833:44;;27859:18;;;;;;;;;;;;;;27833:44;27890:61;27920:1;27924:2;27928:12;27942:8;27890:21;:61::i;:::-;28494:1;13796:2;28465:1;:25;;28464:31;28452:8;:44;28426:18;:22;28445:2;28426:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;14572:3;28895:29;28922:1;28910:8;:13;28895:14;:29::i;:::-;:56;;14313:3;28832:15;:41;;28790:21;28808:2;28790:17;:21::i;:::-;:84;:162;28739:17;:31;28757:12;28739:31;;;;;;;;;;;:213;;;;28969:20;28992:12;28969:35;;29019:11;29048:8;29033:12;:23;29019:37;;29095:1;29077:2;:14;;;:19;29073:635;;29117:313;29173:12;29169:2;29148:38;;29165:1;29148:38;;;;;;;;;;;;29214:69;29253:1;29257:2;29261:14;;;;;;29277:5;29214:30;:69::i;:::-;29209:174;;29319:40;;;;;;;;;;;;;;29209:174;29425:3;29410:12;:18;29117:313;;29511:12;29494:13;;:29;29490:43;;29525:8;;;29490:43;29073:635;;;29574:119;29630:14;;;;;;29626:2;29605:40;;29622:1;29605:40;;;;;;;;;;;;29688:3;29673:12;:18;29574:119;;29073:635;29738:12;29722:13;:28;;;;28203:1559;;29772:60;29801:1;29805:2;29809:12;29823:8;29772:20;:60::i;:::-;27706:2134;27594:2246;;;:::o;38496:716::-;38659:4;38705:2;38680:45;;;38726:19;:17;:19::i;:::-;38747:4;38753:7;38762:5;38680:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38676:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38980:1;38963:6;:13;:18;38959:235;;39009:40;;;;;;;;;;;;;;38959:235;39152:6;39146:13;39137:6;39133:2;39129:15;39122:38;38676:529;38849:54;;;38839:64;;;:6;:64;;;;38832:71;;;38496:716;;;;;;:::o;39860:159::-;;;;;:::o;40678:158::-;;;;;:::o;49953:190::-;50078:4;50131;50102:25;50115:5;50122:4;50102:12;:25::i;:::-;:33;50095:40;;49953:190;;;;;:::o;23982:142::-;24040:14;24101:5;24091:15;;23982:142;;;:::o;50504:675::-;50587:7;50607:20;50630:4;50607:27;;50650:9;50645:497;50669:5;:12;50665:1;:16;50645:497;;;50703:20;50726:5;50732:1;50726:8;;;;;;;;:::i;:::-;;;;;;;;50703:31;;50769:12;50753;:28;50749:382;;50896:42;50911:12;50925;50896:14;:42::i;:::-;50881:57;;50749:382;;;51073:42;51088:12;51102;51073:14;:42::i;:::-;51058:57;;50749:382;50688:454;50683:3;;;;;:::i;:::-;;;;50645:497;;;;51159:12;51152:19;;;50504:675;;;;:::o;51187:224::-;51255:13;51318:1;51312:4;51305:15;51347:1;51341:4;51334:15;51388:4;51382;51372:21;51363:30;;51187:224;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:77::-;5904:7;5933:5;5922:16;;5867:77;;;:::o;5950:118::-;6037:24;6055:5;6037:24;:::i;:::-;6032:3;6025:37;5950:118;;:::o;6074:222::-;6167:4;6205:2;6194:9;6190:18;6182:26;;6218:71;6286:1;6275:9;6271:17;6262:6;6218:71;:::i;:::-;6074:222;;;;:::o;6302:117::-;6411:1;6408;6401:12;6425:117;6534:1;6531;6524:12;6548:117;6657:1;6654;6647:12;6688:568;6761:8;6771:6;6821:3;6814:4;6806:6;6802:17;6798:27;6788:122;;6829:79;;:::i;:::-;6788:122;6942:6;6929:20;6919:30;;6972:18;6964:6;6961:30;6958:117;;;6994:79;;:::i;:::-;6958:117;7108:4;7100:6;7096:17;7084:29;;7162:3;7154:4;7146:6;7142:17;7132:8;7128:32;7125:41;7122:128;;;7169:79;;:::i;:::-;7122:128;6688:568;;;;;:::o;7262:849::-;7366:6;7374;7382;7390;7439:2;7427:9;7418:7;7414:23;7410:32;7407:119;;;7445:79;;:::i;:::-;7407:119;7565:1;7590:53;7635:7;7626:6;7615:9;7611:22;7590:53;:::i;:::-;7580:63;;7536:117;7692:2;7718:53;7763:7;7754:6;7743:9;7739:22;7718:53;:::i;:::-;7708:63;;7663:118;7848:2;7837:9;7833:18;7820:32;7879:18;7871:6;7868:30;7865:117;;;7901:79;;:::i;:::-;7865:117;8014:80;8086:7;8077:6;8066:9;8062:22;8014:80;:::i;:::-;7996:98;;;;7791:313;7262:849;;;;;;;:::o;8117:329::-;8176:6;8225:2;8213:9;8204:7;8200:23;8196:32;8193:119;;;8231:79;;:::i;:::-;8193:119;8351:1;8376:53;8421:7;8412:6;8401:9;8397:22;8376:53;:::i;:::-;8366:63;;8322:117;8117:329;;;;:::o;8452:122::-;8525:24;8543:5;8525:24;:::i;:::-;8518:5;8515:35;8505:63;;8564:1;8561;8554:12;8505:63;8452:122;:::o;8580:139::-;8626:5;8664:6;8651:20;8642:29;;8680:33;8707:5;8680:33;:::i;:::-;8580:139;;;;:::o;8725:329::-;8784:6;8833:2;8821:9;8812:7;8808:23;8804:32;8801:119;;;8839:79;;:::i;:::-;8801:119;8959:1;8984:53;9029:7;9020:6;9009:9;9005:22;8984:53;:::i;:::-;8974:63;;8930:117;8725:329;;;;:::o;9060:180::-;9108:77;9105:1;9098:88;9205:4;9202:1;9195:15;9229:4;9226:1;9219:15;9246:114;9328:1;9321:5;9318:12;9308:46;;9334:18;;:::i;:::-;9308:46;9246:114;:::o;9366:129::-;9412:7;9441:5;9430:16;;9447:42;9483:5;9447:42;:::i;:::-;9366:129;;;:::o;9501:::-;9558:9;9591:33;9618:5;9591:33;:::i;:::-;9578:46;;9501:129;;;:::o;9636:145::-;9730:44;9768:5;9730:44;:::i;:::-;9725:3;9718:57;9636:145;;:::o;9787:236::-;9887:4;9925:2;9914:9;9910:18;9902:26;;9938:78;10013:1;10002:9;9998:17;9989:6;9938:78;:::i;:::-;9787:236;;;;:::o;10029:117::-;10138:1;10135;10128:12;10152:180;10200:77;10197:1;10190:88;10297:4;10294:1;10287:15;10321:4;10318:1;10311:15;10338:281;10421:27;10443:4;10421:27;:::i;:::-;10413:6;10409:40;10551:6;10539:10;10536:22;10515:18;10503:10;10500:34;10497:62;10494:88;;;10562:18;;:::i;:::-;10494:88;10602:10;10598:2;10591:22;10381:238;10338:281;;:::o;10625:129::-;10659:6;10686:20;;:::i;:::-;10676:30;;10715:33;10743:4;10735:6;10715:33;:::i;:::-;10625:129;;;:::o;10760:308::-;10822:4;10912:18;10904:6;10901:30;10898:56;;;10934:18;;:::i;:::-;10898:56;10972:29;10994:6;10972:29;:::i;:::-;10964:37;;11056:4;11050;11046:15;11038:23;;10760:308;;;:::o;11074:146::-;11171:6;11166:3;11161;11148:30;11212:1;11203:6;11198:3;11194:16;11187:27;11074:146;;;:::o;11226:425::-;11304:5;11329:66;11345:49;11387:6;11345:49;:::i;:::-;11329:66;:::i;:::-;11320:75;;11418:6;11411:5;11404:21;11456:4;11449:5;11445:16;11494:3;11485:6;11480:3;11476:16;11473:25;11470:112;;;11501:79;;:::i;:::-;11470:112;11591:54;11638:6;11633:3;11628;11591:54;:::i;:::-;11310:341;11226:425;;;;;:::o;11671:340::-;11727:5;11776:3;11769:4;11761:6;11757:17;11753:27;11743:122;;11784:79;;:::i;:::-;11743:122;11901:6;11888:20;11926:79;12001:3;11993:6;11986:4;11978:6;11974:17;11926:79;:::i;:::-;11917:88;;11733:278;11671:340;;;;:::o;12017:509::-;12086:6;12135:2;12123:9;12114:7;12110:23;12106:32;12103:119;;;12141:79;;:::i;:::-;12103:119;12289:1;12278:9;12274:17;12261:31;12319:18;12311:6;12308:30;12305:117;;;12341:79;;:::i;:::-;12305:117;12446:63;12501:7;12492:6;12481:9;12477:22;12446:63;:::i;:::-;12436:73;;12232:287;12017:509;;;;:::o;12532:116::-;12602:21;12617:5;12602:21;:::i;:::-;12595:5;12592:32;12582:60;;12638:1;12635;12628:12;12582:60;12532:116;:::o;12654:133::-;12697:5;12735:6;12722:20;12713:29;;12751:30;12775:5;12751:30;:::i;:::-;12654:133;;;;:::o;12793:468::-;12858:6;12866;12915:2;12903:9;12894:7;12890:23;12886:32;12883:119;;;12921:79;;:::i;:::-;12883:119;13041:1;13066:53;13111:7;13102:6;13091:9;13087:22;13066:53;:::i;:::-;13056:63;;13012:117;13168:2;13194:50;13236:7;13227:6;13216:9;13212:22;13194:50;:::i;:::-;13184:60;;13139:115;12793:468;;;;;:::o;13267:307::-;13328:4;13418:18;13410:6;13407:30;13404:56;;;13440:18;;:::i;:::-;13404:56;13478:29;13500:6;13478:29;:::i;:::-;13470:37;;13562:4;13556;13552:15;13544:23;;13267:307;;;:::o;13580:423::-;13657:5;13682:65;13698:48;13739:6;13698:48;:::i;:::-;13682:65;:::i;:::-;13673:74;;13770:6;13763:5;13756:21;13808:4;13801:5;13797:16;13846:3;13837:6;13832:3;13828:16;13825:25;13822:112;;;13853:79;;:::i;:::-;13822:112;13943:54;13990:6;13985:3;13980;13943:54;:::i;:::-;13663:340;13580:423;;;;;:::o;14022:338::-;14077:5;14126:3;14119:4;14111:6;14107:17;14103:27;14093:122;;14134:79;;:::i;:::-;14093:122;14251:6;14238:20;14276:78;14350:3;14342:6;14335:4;14327:6;14323:17;14276:78;:::i;:::-;14267:87;;14083:277;14022:338;;;;:::o;14366:943::-;14461:6;14469;14477;14485;14534:3;14522:9;14513:7;14509:23;14505:33;14502:120;;;14541:79;;:::i;:::-;14502:120;14661:1;14686:53;14731:7;14722:6;14711:9;14707:22;14686:53;:::i;:::-;14676:63;;14632:117;14788:2;14814:53;14859:7;14850:6;14839:9;14835:22;14814:53;:::i;:::-;14804:63;;14759:118;14916:2;14942:53;14987:7;14978:6;14967:9;14963:22;14942:53;:::i;:::-;14932:63;;14887:118;15072:2;15061:9;15057:18;15044:32;15103:18;15095:6;15092:30;15089:117;;;15125:79;;:::i;:::-;15089:117;15230:62;15284:7;15275:6;15264:9;15260:22;15230:62;:::i;:::-;15220:72;;15015:287;14366:943;;;;;;;:::o;15315:474::-;15383:6;15391;15440:2;15428:9;15419:7;15415:23;15411:32;15408:119;;;15446:79;;:::i;:::-;15408:119;15566:1;15591:53;15636:7;15627:6;15616:9;15612:22;15591:53;:::i;:::-;15581:63;;15537:117;15693:2;15719:53;15764:7;15755:6;15744:9;15740:22;15719:53;:::i;:::-;15709:63;;15664:118;15315:474;;;;;:::o;15795:180::-;15843:77;15840:1;15833:88;15940:4;15937:1;15930:15;15964:4;15961:1;15954:15;15981:320;16025:6;16062:1;16056:4;16052:12;16042:22;;16109:1;16103:4;16099:12;16130:18;16120:81;;16186:4;16178:6;16174:17;16164:27;;16120:81;16248:2;16240:6;16237:14;16217:18;16214:38;16211:84;;16267:18;;:::i;:::-;16211:84;16032:269;15981:320;;;:::o;16307:332::-;16428:4;16466:2;16455:9;16451:18;16443:26;;16479:71;16547:1;16536:9;16532:17;16523:6;16479:71;:::i;:::-;16560:72;16628:2;16617:9;16613:18;16604:6;16560:72;:::i;:::-;16307:332;;;;;:::o;16645:137::-;16699:5;16730:6;16724:13;16715:22;;16746:30;16770:5;16746:30;:::i;:::-;16645:137;;;;:::o;16788:345::-;16855:6;16904:2;16892:9;16883:7;16879:23;16875:32;16872:119;;;16910:79;;:::i;:::-;16872:119;17030:1;17055:61;17108:7;17099:6;17088:9;17084:22;17055:61;:::i;:::-;17045:71;;17001:125;16788:345;;;;:::o;17139:182::-;17279:34;17275:1;17267:6;17263:14;17256:58;17139:182;:::o;17327:366::-;17469:3;17490:67;17554:2;17549:3;17490:67;:::i;:::-;17483:74;;17566:93;17655:3;17566:93;:::i;:::-;17684:2;17679:3;17675:12;17668:19;;17327:366;;;:::o;17699:419::-;17865:4;17903:2;17892:9;17888:18;17880:26;;17952:9;17946:4;17942:20;17938:1;17927:9;17923:17;17916:47;17980:131;18106:4;17980:131;:::i;:::-;17972:139;;17699:419;;;:::o;18124:178::-;18264:30;18260:1;18252:6;18248:14;18241:54;18124:178;:::o;18308:366::-;18450:3;18471:67;18535:2;18530:3;18471:67;:::i;:::-;18464:74;;18547:93;18636:3;18547:93;:::i;:::-;18665:2;18660:3;18656:12;18649:19;;18308:366;;;:::o;18680:419::-;18846:4;18884:2;18873:9;18869:18;18861:26;;18933:9;18927:4;18923:20;18919:1;18908:9;18904:17;18897:47;18961:131;19087:4;18961:131;:::i;:::-;18953:139;;18680:419;;;:::o;19105:180::-;19245:32;19241:1;19233:6;19229:14;19222:56;19105:180;:::o;19291:366::-;19433:3;19454:67;19518:2;19513:3;19454:67;:::i;:::-;19447:74;;19530:93;19619:3;19530:93;:::i;:::-;19648:2;19643:3;19639:12;19632:19;;19291:366;;;:::o;19663:419::-;19829:4;19867:2;19856:9;19852:18;19844:26;;19916:9;19910:4;19906:20;19902:1;19891:9;19887:17;19880:47;19944:131;20070:4;19944:131;:::i;:::-;19936:139;;19663:419;;;:::o;20088:173::-;20228:25;20224:1;20216:6;20212:14;20205:49;20088:173;:::o;20267:366::-;20409:3;20430:67;20494:2;20489:3;20430:67;:::i;:::-;20423:74;;20506:93;20595:3;20506:93;:::i;:::-;20624:2;20619:3;20615:12;20608:19;;20267:366;;;:::o;20639:419::-;20805:4;20843:2;20832:9;20828:18;20820:26;;20892:9;20886:4;20882:20;20878:1;20867:9;20863:17;20856:47;20920:131;21046:4;20920:131;:::i;:::-;20912:139;;20639:419;;;:::o;21064:180::-;21112:77;21109:1;21102:88;21209:4;21206:1;21199:15;21233:4;21230:1;21223:15;21250:191;21290:3;21309:20;21327:1;21309:20;:::i;:::-;21304:25;;21343:20;21361:1;21343:20;:::i;:::-;21338:25;;21386:1;21383;21379:9;21372:16;;21407:3;21404:1;21401:10;21398:36;;;21414:18;;:::i;:::-;21398:36;21250:191;;;;:::o;21447:291::-;21587:34;21583:1;21575:6;21571:14;21564:58;21656:34;21651:2;21643:6;21639:15;21632:59;21725:5;21720:2;21712:6;21708:15;21701:30;21447:291;:::o;21744:366::-;21886:3;21907:67;21971:2;21966:3;21907:67;:::i;:::-;21900:74;;21983:93;22072:3;21983:93;:::i;:::-;22101:2;22096:3;22092:12;22085:19;;21744:366;;;:::o;22116:419::-;22282:4;22320:2;22309:9;22305:18;22297:26;;22369:9;22363:4;22359:20;22355:1;22344:9;22340:17;22333:47;22397:131;22523:4;22397:131;:::i;:::-;22389:139;;22116:419;;;:::o;22541:222::-;22681:34;22677:1;22669:6;22665:14;22658:58;22750:5;22745:2;22737:6;22733:15;22726:30;22541:222;:::o;22769:366::-;22911:3;22932:67;22996:2;22991:3;22932:67;:::i;:::-;22925:74;;23008:93;23097:3;23008:93;:::i;:::-;23126:2;23121:3;23117:12;23110:19;;22769:366;;;:::o;23141:419::-;23307:4;23345:2;23334:9;23330:18;23322:26;;23394:9;23388:4;23384:20;23380:1;23369:9;23365:17;23358:47;23422:131;23548:4;23422:131;:::i;:::-;23414:139;;23141:419;;;:::o;23566:410::-;23606:7;23629:20;23647:1;23629:20;:::i;:::-;23624:25;;23663:20;23681:1;23663:20;:::i;:::-;23658:25;;23718:1;23715;23711:9;23740:30;23758:11;23740:30;:::i;:::-;23729:41;;23919:1;23910:7;23906:15;23903:1;23900:22;23880:1;23873:9;23853:83;23830:139;;23949:18;;:::i;:::-;23830:139;23614:362;23566:410;;;;:::o;23982:225::-;24122:34;24118:1;24110:6;24106:14;24099:58;24191:8;24186:2;24178:6;24174:15;24167:33;23982:225;:::o;24213:366::-;24355:3;24376:67;24440:2;24435:3;24376:67;:::i;:::-;24369:74;;24452:93;24541:3;24452:93;:::i;:::-;24570:2;24565:3;24561:12;24554:19;;24213:366;;;:::o;24585:419::-;24751:4;24789:2;24778:9;24774:18;24766:26;;24838:9;24832:4;24828:20;24824:1;24813:9;24809:17;24802:47;24866:131;24992:4;24866:131;:::i;:::-;24858:139;;24585:419;;;:::o;25010:180::-;25150:32;25146:1;25138:6;25134:14;25127:56;25010:180;:::o;25196:366::-;25338:3;25359:67;25423:2;25418:3;25359:67;:::i;:::-;25352:74;;25435:93;25524:3;25435:93;:::i;:::-;25553:2;25548:3;25544:12;25537:19;;25196:366;;;:::o;25568:419::-;25734:4;25772:2;25761:9;25757:18;25749:26;;25821:9;25815:4;25811:20;25807:1;25796:9;25792:17;25785:47;25849:131;25975:4;25849:131;:::i;:::-;25841:139;;25568:419;;;:::o;25993:141::-;26042:4;26065:3;26057:11;;26088:3;26085:1;26078:14;26122:4;26119:1;26109:18;26101:26;;25993:141;;;:::o;26140:93::-;26177:6;26224:2;26219;26212:5;26208:14;26204:23;26194:33;;26140:93;;;:::o;26239:107::-;26283:8;26333:5;26327:4;26323:16;26302:37;;26239:107;;;;:::o;26352:393::-;26421:6;26471:1;26459:10;26455:18;26494:97;26524:66;26513:9;26494:97;:::i;:::-;26612:39;26642:8;26631:9;26612:39;:::i;:::-;26600:51;;26684:4;26680:9;26673:5;26669:21;26660:30;;26733:4;26723:8;26719:19;26712:5;26709:30;26699:40;;26428:317;;26352:393;;;;;:::o;26751:60::-;26779:3;26800:5;26793:12;;26751:60;;;:::o;26817:142::-;26867:9;26900:53;26918:34;26927:24;26945:5;26927:24;:::i;:::-;26918:34;:::i;:::-;26900:53;:::i;:::-;26887:66;;26817:142;;;:::o;26965:75::-;27008:3;27029:5;27022:12;;26965:75;;;:::o;27046:269::-;27156:39;27187:7;27156:39;:::i;:::-;27217:91;27266:41;27290:16;27266:41;:::i;:::-;27258:6;27251:4;27245:11;27217:91;:::i;:::-;27211:4;27204:105;27122:193;27046:269;;;:::o;27321:73::-;27366:3;27321:73;:::o;27400:189::-;27477:32;;:::i;:::-;27518:65;27576:6;27568;27562:4;27518:65;:::i;:::-;27453:136;27400:189;;:::o;27595:186::-;27655:120;27672:3;27665:5;27662:14;27655:120;;;27726:39;27763:1;27756:5;27726:39;:::i;:::-;27699:1;27692:5;27688:13;27679:22;;27655:120;;;27595:186;;:::o;27787:543::-;27888:2;27883:3;27880:11;27877:446;;;27922:38;27954:5;27922:38;:::i;:::-;28006:29;28024:10;28006:29;:::i;:::-;27996:8;27992:44;28189:2;28177:10;28174:18;28171:49;;;28210:8;28195:23;;28171:49;28233:80;28289:22;28307:3;28289:22;:::i;:::-;28279:8;28275:37;28262:11;28233:80;:::i;:::-;27892:431;;27877:446;27787:543;;;:::o;28336:117::-;28390:8;28440:5;28434:4;28430:16;28409:37;;28336:117;;;;:::o;28459:169::-;28503:6;28536:51;28584:1;28580:6;28572:5;28569:1;28565:13;28536:51;:::i;:::-;28532:56;28617:4;28611;28607:15;28597:25;;28510:118;28459:169;;;;:::o;28633:295::-;28709:4;28855:29;28880:3;28874:4;28855:29;:::i;:::-;28847:37;;28917:3;28914:1;28910:11;28904:4;28901:21;28893:29;;28633:295;;;;:::o;28933:1395::-;29050:37;29083:3;29050:37;:::i;:::-;29152:18;29144:6;29141:30;29138:56;;;29174:18;;:::i;:::-;29138:56;29218:38;29250:4;29244:11;29218:38;:::i;:::-;29303:67;29363:6;29355;29349:4;29303:67;:::i;:::-;29397:1;29421:4;29408:17;;29453:2;29445:6;29442:14;29470:1;29465:618;;;;30127:1;30144:6;30141:77;;;30193:9;30188:3;30184:19;30178:26;30169:35;;30141:77;30244:67;30304:6;30297:5;30244:67;:::i;:::-;30238:4;30231:81;30100:222;29435:887;;29465:618;29517:4;29513:9;29505:6;29501:22;29551:37;29583:4;29551:37;:::i;:::-;29610:1;29624:208;29638:7;29635:1;29632:14;29624:208;;;29717:9;29712:3;29708:19;29702:26;29694:6;29687:42;29768:1;29760:6;29756:14;29746:24;;29815:2;29804:9;29800:18;29787:31;;29661:4;29658:1;29654:12;29649:17;;29624:208;;;29860:6;29851:7;29848:19;29845:179;;;29918:9;29913:3;29909:19;29903:26;29961:48;30003:4;29995:6;29991:17;29980:9;29961:48;:::i;:::-;29953:6;29946:64;29868:156;29845:179;30070:1;30066;30058:6;30054:14;30050:22;30044:4;30037:36;29472:611;;;29435:887;;29025:1303;;;28933:1395;;:::o;30334:177::-;30474:29;30470:1;30462:6;30458:14;30451:53;30334:177;:::o;30517:366::-;30659:3;30680:67;30744:2;30739:3;30680:67;:::i;:::-;30673:74;;30756:93;30845:3;30756:93;:::i;:::-;30874:2;30869:3;30865:12;30858:19;;30517:366;;;:::o;30889:419::-;31055:4;31093:2;31082:9;31078:18;31070:26;;31142:9;31136:4;31132:20;31128:1;31117:9;31113:17;31106:47;31170:131;31296:4;31170:131;:::i;:::-;31162:139;;30889:419;;;:::o;31314:177::-;31454:29;31450:1;31442:6;31438:14;31431:53;31314:177;:::o;31497:366::-;31639:3;31660:67;31724:2;31719:3;31660:67;:::i;:::-;31653:74;;31736:93;31825:3;31736:93;:::i;:::-;31854:2;31849:3;31845:12;31838:19;;31497:366;;;:::o;31869:419::-;32035:4;32073:2;32062:9;32058:18;32050:26;;32122:9;32116:4;32112:20;32108:1;32097:9;32093:17;32086:47;32150:131;32276:4;32150:131;:::i;:::-;32142:139;;31869:419;;;:::o;32294:181::-;32434:33;32430:1;32422:6;32418:14;32411:57;32294:181;:::o;32481:366::-;32623:3;32644:67;32708:2;32703:3;32644:67;:::i;:::-;32637:74;;32720:93;32809:3;32720:93;:::i;:::-;32838:2;32833:3;32829:12;32822:19;;32481:366;;;:::o;32853:419::-;33019:4;33057:2;33046:9;33042:18;33034:26;;33106:9;33100:4;33096:20;33092:1;33081:9;33077:17;33070:47;33134:131;33260:4;33134:131;:::i;:::-;33126:139;;32853:419;;;:::o;33278:148::-;33380:11;33417:3;33402:18;;33278:148;;;;:::o;33456:874::-;33559:3;33596:5;33590:12;33625:36;33651:9;33625:36;:::i;:::-;33677:89;33759:6;33754:3;33677:89;:::i;:::-;33670:96;;33797:1;33786:9;33782:17;33813:1;33808:166;;;;33988:1;33983:341;;;;33775:549;;33808:166;33892:4;33888:9;33877;33873:25;33868:3;33861:38;33954:6;33947:14;33940:22;33932:6;33928:35;33923:3;33919:45;33912:52;;33808:166;;33983:341;34050:38;34082:5;34050:38;:::i;:::-;34110:1;34124:154;34138:6;34135:1;34132:13;34124:154;;;34212:7;34206:14;34202:1;34197:3;34193:11;34186:35;34262:1;34253:7;34249:15;34238:26;;34160:4;34157:1;34153:12;34148:17;;34124:154;;;34307:6;34302:3;34298:16;34291:23;;33990:334;;33775:549;;33563:767;;33456:874;;;;:::o;34336:390::-;34442:3;34470:39;34503:5;34470:39;:::i;:::-;34525:89;34607:6;34602:3;34525:89;:::i;:::-;34518:96;;34623:65;34681:6;34676:3;34669:4;34662:5;34658:16;34623:65;:::i;:::-;34713:6;34708:3;34704:16;34697:23;;34446:280;34336:390;;;;:::o;34732:155::-;34872:7;34868:1;34860:6;34856:14;34849:31;34732:155;:::o;34893:400::-;35053:3;35074:84;35156:1;35151:3;35074:84;:::i;:::-;35067:91;;35167:93;35256:3;35167:93;:::i;:::-;35285:1;35280:3;35276:11;35269:18;;34893:400;;;:::o;35299:695::-;35577:3;35599:92;35687:3;35678:6;35599:92;:::i;:::-;35592:99;;35708:95;35799:3;35790:6;35708:95;:::i;:::-;35701:102;;35820:148;35964:3;35820:148;:::i;:::-;35813:155;;35985:3;35978:10;;35299:695;;;;;:::o;36000:423::-;36174:3;36196:92;36284:3;36275:6;36196:92;:::i;:::-;36189:99;;36305:92;36393:3;36384:6;36305:92;:::i;:::-;36298:99;;36414:3;36407:10;;36000:423;;;;;:::o;36429:225::-;36569:34;36565:1;36557:6;36553:14;36546:58;36638:8;36633:2;36625:6;36621:15;36614:33;36429:225;:::o;36660:366::-;36802:3;36823:67;36887:2;36882:3;36823:67;:::i;:::-;36816:74;;36899:93;36988:3;36899:93;:::i;:::-;37017:2;37012:3;37008:12;37001:19;;36660:366;;;:::o;37032:419::-;37198:4;37236:2;37225:9;37221:18;37213:26;;37285:9;37279:4;37275:20;37271:1;37260:9;37256:17;37249:47;37313:131;37439:4;37313:131;:::i;:::-;37305:139;;37032:419;;;:::o;37457:233::-;37496:3;37519:24;37537:5;37519:24;:::i;:::-;37510:33;;37565:66;37558:5;37555:77;37552:103;;37635:18;;:::i;:::-;37552:103;37682:1;37675:5;37671:13;37664:20;;37457:233;;;:::o;37696:180::-;37744:77;37741:1;37734:88;37841:4;37838:1;37831:15;37865:4;37862:1;37855:15;37882:185;37922:1;37939:20;37957:1;37939:20;:::i;:::-;37934:25;;37973:20;37991:1;37973:20;:::i;:::-;37968:25;;38012:1;38002:35;;38017:18;;:::i;:::-;38002:35;38059:1;38056;38052:9;38047:14;;37882:185;;;;:::o;38073:194::-;38113:4;38133:20;38151:1;38133:20;:::i;:::-;38128:25;;38167:20;38185:1;38167:20;:::i;:::-;38162:25;;38211:1;38208;38204:9;38196:17;;38235:1;38229:4;38226:11;38223:37;;;38240:18;;:::i;:::-;38223:37;38073:194;;;;:::o;38273:176::-;38305:1;38322:20;38340:1;38322:20;:::i;:::-;38317:25;;38356:20;38374:1;38356:20;:::i;:::-;38351:25;;38395:1;38385:35;;38400:18;;:::i;:::-;38385:35;38441:1;38438;38434:9;38429:14;;38273:176;;;;:::o;38455:180::-;38503:77;38500:1;38493:88;38600:4;38597:1;38590:15;38624:4;38621:1;38614:15;38641:94;38674:8;38722:5;38718:2;38714:14;38693:35;;38641:94;;;:::o;38741:::-;38780:7;38809:20;38823:5;38809:20;:::i;:::-;38798:31;;38741:94;;;:::o;38841:100::-;38880:7;38909:26;38929:5;38909:26;:::i;:::-;38898:37;;38841:100;;;:::o;38947:157::-;39052:45;39072:24;39090:5;39072:24;:::i;:::-;39052:45;:::i;:::-;39047:3;39040:58;38947:157;;:::o;39110:256::-;39222:3;39237:75;39308:3;39299:6;39237:75;:::i;:::-;39337:2;39332:3;39328:12;39321:19;;39357:3;39350:10;;39110:256;;;;:::o;39372:98::-;39423:6;39457:5;39451:12;39441:22;;39372:98;;;:::o;39476:168::-;39559:11;39593:6;39588:3;39581:19;39633:4;39628:3;39624:14;39609:29;;39476:168;;;;:::o;39650:373::-;39736:3;39764:38;39796:5;39764:38;:::i;:::-;39818:70;39881:6;39876:3;39818:70;:::i;:::-;39811:77;;39897:65;39955:6;39950:3;39943:4;39936:5;39932:16;39897:65;:::i;:::-;39987:29;40009:6;39987:29;:::i;:::-;39982:3;39978:39;39971:46;;39740:283;39650:373;;;;:::o;40029:640::-;40224:4;40262:3;40251:9;40247:19;40239:27;;40276:71;40344:1;40333:9;40329:17;40320:6;40276:71;:::i;:::-;40357:72;40425:2;40414:9;40410:18;40401:6;40357:72;:::i;:::-;40439;40507:2;40496:9;40492:18;40483:6;40439:72;:::i;:::-;40558:9;40552:4;40548:20;40543:2;40532:9;40528:18;40521:48;40586:76;40657:4;40648:6;40586:76;:::i;:::-;40578:84;;40029:640;;;;;;;:::o;40675:141::-;40731:5;40762:6;40756:13;40747:22;;40778:32;40804:5;40778:32;:::i;:::-;40675:141;;;;:::o;40822:349::-;40891:6;40940:2;40928:9;40919:7;40915:23;40911:32;40908:119;;;40946:79;;:::i;:::-;40908:119;41066:1;41091:63;41146:7;41137:6;41126:9;41122:22;41091:63;:::i;:::-;41081:73;;41037:127;40822:349;;;;:::o

Swarm Source

ipfs://39ebe8b552d91c75304862f77dd70b7f0e6c26bf0de856ca4b70ae0a58182274
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.