ETH Price: $3,475.44 (+1.16%)

Token

Ocarinas (OC)
 

Overview

Max Total Supply

1,628 OC

Holders

490

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
parallelmaximalist.eth
Balance
2 OC
0x2c8c68f84dfe2be2908f3aa54ab8505b7347ee02
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:
Ocarinas

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 300 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-22
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)
                )
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)
                )
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)
                )
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }

    function decode(bytes memory data) internal pure returns (bytes memory) {
        uint8[128] memory toInt;

        for (uint8 i = 0; i < bytes(TABLE).length; i++) {
            toInt[uint8(bytes(TABLE)[i])] = i;
        }

        uint256 delta;
        uint256 len = data.length;
        if (data[len - 2] == "=" && data[len - 1] == "=") {
            delta = 2;
        } else if (data[len - 1] == "=") {
            delta = 1;
        } else {
            delta = 0;
        }
        uint256 decodedLen = (len * 3) / 4 - delta;
        bytes memory buffer = new bytes(decodedLen);
        uint256 index;
        uint8 mask = 0xFF;

        for (uint256 i = 0; i < len; i += 4) {
            uint8 c0 = toInt[uint8(data[i])];
            uint8 c1 = toInt[uint8(data[i + 1])];
            buffer[index++] = (bytes1)(((c0 << 2) | (c1 >> 4)) & mask);
            if (index >= buffer.length) {
                return buffer;
            }
            uint8 c2 = toInt[uint8(data[i + 2])];
            buffer[index++] = (bytes1)(((c1 << 4) | (c2 >> 2)) & mask);
            if (index >= buffer.length) {
                return buffer;
            }
            uint8 c3 = toInt[uint8(data[i + 3])];
            buffer[index++] = (bytes1)(((c2 << 6) | c3) & mask);
        }
        return buffer;
    }
}

/**
 * @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.
 */
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) {
        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 = keccak256(
                    abi.encodePacked(computedHash, proofElement)
                );
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(
                    abi.encodePacked(proofElement, computedHash)
                );
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

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

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

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

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

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

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

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

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

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

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

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

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

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

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

contract Ocarinas is ERC721, Ownable {
    using Counters for Counters.Counter;
    using Strings for uint256;
    using Address for address payable;

    struct Slice {
        uint256 start;
        uint256 length;
    }

    uint256 public numChordProgressions;
    uint256 public mintPrice;
    uint256 public totalSupply;
    uint256 private _royaltyDivisor = 20;
    // Melodies and drums are mappings of chord progression number => array of tracks
    // a track being an array of bytes representing the MIDI data.
    // Bass and chords do not have multiple variations per chord progression and therefore is just
    // a single track.
    mapping(uint256 => bytes[]) private _firstMelodyParts;
    mapping(uint256 => bytes[]) private _secondMelodyParts;
    mapping(uint256 => bytes[]) private _thirdMelodyParts;
    mapping(uint256 => bytes[]) private _drums;
    mapping(uint256 => bytes) private _bass;
    mapping(uint256 => bytes) private _chords;
    mapping(uint256 => bytes2) private _timeDivisions;

    bool public mintingEnabled;

    bytes32 private _allSeedsMerkleRoot;

    mapping(uint256 => bytes5) private _seeds;
    mapping(bytes5 => bool) private _seedUsed;

    Counters.Counter private _tokenIdTracker;

    string private baseURI;

    string public composer = "Shaw Avery @ShawAverySongs";

    // CONSTRUCTOR ---------------------------------------------------

    constructor(
        string memory baseURI_,
        uint256 numChordProgressions_,
        uint256 mintPrice_
    ) ERC721("Ocarinas", "OC") {
        baseURI = baseURI_;
        numChordProgressions = numChordProgressions_;
        mintPrice = mintPrice_;
    }

    // ADMIN FUNCTIONS ---------------------------------------------------

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

    function setMintingEnabled(bool value, uint256 supply) public onlyOwner {
        mintingEnabled = value;
        totalSupply = supply;
    }

    function setMintPrice(uint256 value) public onlyOwner {
        mintPrice = value;
    }

    function setComposer(string memory _composer) public onlyOwner {
        composer = _composer;
    }

    function setRoyaltyDivisor(uint256 value) public onlyOwner {
        _royaltyDivisor = value;
    }

    function setNumChordProgressions(uint256 value) public onlyOwner {
        numChordProgressions = value;
    }

    function setAllSeedsMerkleRoot(bytes32 value) public onlyOwner {
        _allSeedsMerkleRoot = value;
    }

    function withdraw(address payable to, uint256 amount) public onlyOwner {
        require(
            address(this).balance >= amount,
            "Ocarinas: Insufficient balance to withdraw"
        );
        if (amount == 0) {
            amount = address(this).balance;
        }
        if (to == address(0)) {
            to = payable(owner());
        }
        to.sendValue(amount);
    }

    function addFirstMelodyPart(uint256 chordProgessions, bytes calldata melody)
        external
        onlyOwner
    {
        _firstMelodyParts[chordProgessions].push(melody);
    }

    function removeFirstMelodyPart(uint256 chordProgessions, uint256 index)
        external
        onlyOwner
    {
        _firstMelodyParts[chordProgessions][index] = _firstMelodyParts[
            chordProgessions
        ][_firstMelodyParts[chordProgessions].length - 1];
        _firstMelodyParts[chordProgessions].pop();
    }

    function addSecondMelodyPart(uint256 chordProgessions, bytes calldata bass)
        external
        onlyOwner
    {
        _secondMelodyParts[chordProgessions].push(bass);
    }

    function removeSecondMelodyPart(uint256 chordProgessions, uint256 index)
        external
        onlyOwner
    {
        _secondMelodyParts[chordProgessions][index] = _secondMelodyParts[
            chordProgessions
        ][_secondMelodyParts[chordProgessions].length - 1];
        _secondMelodyParts[chordProgessions].pop();
    }

    function addThirdMelodyPart(uint256 chordProgessions, bytes calldata solo)
        external
        onlyOwner
    {
        _thirdMelodyParts[chordProgessions].push(solo);
    }

    function removeThirdMelodyPart(uint256 chordProgessions, uint256 index)
        external
        onlyOwner
    {
        _thirdMelodyParts[chordProgessions][index] = _thirdMelodyParts[
            chordProgessions
        ][_thirdMelodyParts[chordProgessions].length - 1];
        _thirdMelodyParts[chordProgessions].pop();
    }

    function addDrums(uint256 chordProgessions, bytes calldata drums)
        external
        onlyOwner
    {
        _drums[chordProgessions].push(drums);
    }

    function removeDrums(uint256 chordProgessions, uint256 index)
        external
        onlyOwner
    {
        _drums[chordProgessions][index] = _drums[chordProgessions][
            _drums[chordProgessions].length - 1
        ];
        _drums[chordProgessions].pop();
    }

    function setBass(uint256 chordProgessions, bytes calldata bass)
        external
        onlyOwner
    {
        _bass[chordProgessions] = bass;
    }

    function setChords(uint256 chordProgessions, bytes calldata chords)
        external
        onlyOwner
    {
        _chords[chordProgessions] = chords;
    }

    function setTimeDivision(uint256 chordProgessions, bytes2 timeDivision)
        external
        onlyOwner
    {
        _timeDivisions[chordProgessions] = timeDivision;
    }

    // ERC-721 FUNCTIONS ---------------------------------------------------

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId), "Ocarinas: nonexistent token");
        bytes5 seed = _seeds[tokenId];

        string memory mid = Base64.encode(
            bytes.concat(
                newMidi(6, uint8(seed[0])),
                newTrack(_firstMelodyParts[uint8(seed[0])][uint8(seed[1])]),
                newTrack(_secondMelodyParts[uint8(seed[0])][uint8(seed[2])]),
                newTrack(_thirdMelodyParts[uint8(seed[0])][uint8(seed[3])]),
                newTrack(_drums[uint8(seed[0])][uint8(seed[4])]),
                newTrack(_bass[uint8(seed[0])]),
                newTrack(_chords[uint8(seed[0])])
            )
        );

        bytes memory json = abi.encodePacked(
            '{"name": "Ocarina #',
            tokenId.toString(),
            '", "description": "A unique piece of music represented entirely on-chain in the MIDI format with inspiration from the musical themes and motifs of video games.", "image": "',
            baseURI,
            "/image/",
            uint256(uint40(seed)).toHexString(),
            '", "animation_url": "',
            baseURI
        );
        json = abi.encodePacked(
            json,
            "/animation/",
            uint256(uint40(seed)).toHexString(),
            '", "audio": "data:audio/midi;base64,',
            mid,
            '", "external_url": "http://beatfoundry.xyz", "attributes": [{"trait_type": "Chord Progression", "value": "',
            uint256(uint8(seed[0]) + 1).toString(),
            '"}, {"trait_type": "First Melody", "value": "',
            uint256(uint8(seed[1]) + 1).toString(),
            '"}, {"trait_type": "Second Melody", "value": "'
        );
        json = abi.encodePacked(
            json,
            uint256(uint8(seed[2]) + 1).toString(),
            '"}, {"trait_type": "Third Melody", "value": "',
            uint256(uint8(seed[3]) + 1).toString(),
            '"}, {"trait_type": "Drums", "value": "',
            uint256(uint8(seed[4]) + 1).toString(),
            '"}], "composer": "',
            composer,
            '"}'
        );
        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    Base64.encode(json)
                )
            );
    }

    function midi(uint256 tokenId)
        external
        view
        virtual
        returns (string memory)
    {
        require(_exists(tokenId), "Ocarinas: nonexistent token");
        bytes5 seed = _seeds[tokenId];
        bytes memory drums = newTrack(_drums[uint8(seed[0])][uint8(seed[4])]);
        bytes memory fmp = newTrack(
            _firstMelodyParts[uint8(seed[0])][uint8(seed[1])]
        );
        bytes memory smp = newTrack(
            _secondMelodyParts[uint8(seed[0])][uint8(seed[2])]
        );
        bytes memory tmp = newTrack(
            _thirdMelodyParts[uint8(seed[0])][uint8(seed[3])]
        );
        bytes memory bass = newTrack(_bass[uint8(seed[0])]);
        bytes memory chords = newTrack(_chords[uint8(seed[0])]);

        bytes memory mid = bytes.concat(
            newMidi(6, uint8(seed[0])),
            fmp,
            smp,
            tmp,
            drums,
            bass,
            chords
        );

        string memory output = string(Base64.encode(mid));
        return output;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

    // MINTING FUNCTIONS ---------------------------------------------------

    function mint(
        address to,
        bytes5 seed,
        bytes calldata pass,
        bytes32[] calldata seedProof
    ) external payable virtual {
        require(mintingEnabled, "Ocarinas: minting disabled");
        require(msg.value == mintPrice, "Ocarinas: incorrect minting price");
        uint256 tokenID = _tokenIdTracker.current();

        require(tokenID < totalSupply, "Ocarinas: minting limit reached");
        require(!_seedUsed[seed], "Ocarinas: seed already used");

        bytes32 hashedPass = keccak256(pass);
        require(
            MerkleProof.verify(
                seedProof,
                _allSeedsMerkleRoot,
                keccak256(abi.encodePacked(hashedPass, seed))
            ),
            "Ocarinas: invalid seed proof"
        );

        _seeds[tokenID] = seed;
        _seedUsed[seed] = true;

        _mint(to, tokenID);
        _tokenIdTracker.increment();
    }

    // MIDI FUNCTIONS ---------------------------------------------------

    function newMidi(uint8 numTracks, uint8 chordProgression)
        internal
        view
        returns (bytes memory)
    {
        bytes2 timeDivision = _timeDivisions[chordProgression];
        if (uint16(timeDivision) == 0) {
            timeDivision = bytes2(uint16(256));
        }
        bytes memory data = new bytes(14);
        data[0] = bytes1(0x4D);
        data[1] = bytes1(0x54);
        data[2] = bytes1(0x68);
        data[3] = bytes1(0x64);
        data[4] = bytes1(0x00);
        data[5] = bytes1(0x00);
        data[6] = bytes1(0x00);
        data[7] = bytes1(0x06);
        data[8] = bytes1(0x00);
        if (numTracks == 1) {
            data[9] = bytes1(0x00);
        } else {
            data[9] = bytes1(0x01);
        }
        data[10] = bytes1(0x00);
        data[11] = bytes1(numTracks);
        data[12] = timeDivision[0];
        data[13] = timeDivision[1];
        return data;
    }

    function newTrack(bytes memory data) internal pure returns (bytes memory) {
        bytes memory it = new bytes(8);
        it[0] = bytes1(0x4D);
        it[1] = bytes1(0x54);
        it[2] = bytes1(0x72);
        it[3] = bytes1(0x6b);
        bytes memory asBytes = abi.encodePacked(data.length);
        it[4] = asBytes[asBytes.length - 4];
        it[5] = asBytes[asBytes.length - 3];
        it[6] = asBytes[asBytes.length - 2];
        it[7] = asBytes[asBytes.length - 1];
        return bytes.concat(it, data);
    }

    // EXTRA FUNCTIONS ---------------------------------------------------

    function usedSupply() external view returns (uint256) {
        return _tokenIdTracker.current();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"uint256","name":"numChordProgressions_","type":"uint256"},{"internalType":"uint256","name":"mintPrice_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"chordProgessions","type":"uint256"},{"internalType":"bytes","name":"drums","type":"bytes"}],"name":"addDrums","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chordProgessions","type":"uint256"},{"internalType":"bytes","name":"melody","type":"bytes"}],"name":"addFirstMelodyPart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chordProgessions","type":"uint256"},{"internalType":"bytes","name":"bass","type":"bytes"}],"name":"addSecondMelodyPart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chordProgessions","type":"uint256"},{"internalType":"bytes","name":"solo","type":"bytes"}],"name":"addThirdMelodyPart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"composer","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":[{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"midi","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes5","name":"seed","type":"bytes5"},{"internalType":"bytes","name":"pass","type":"bytes"},{"internalType":"bytes32[]","name":"seedProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numChordProgressions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chordProgessions","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"removeDrums","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chordProgessions","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"removeFirstMelodyPart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chordProgessions","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"removeSecondMelodyPart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chordProgessions","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"removeThirdMelodyPart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"setAllSeedsMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chordProgessions","type":"uint256"},{"internalType":"bytes","name":"bass","type":"bytes"}],"name":"setBass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chordProgessions","type":"uint256"},{"internalType":"bytes","name":"chords","type":"bytes"}],"name":"setChords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_composer","type":"string"}],"name":"setComposer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"},{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setMintingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setNumChordProgressions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setRoyaltyDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chordProgessions","type":"uint256"},{"internalType":"bytes2","name":"timeDivision","type":"bytes2"}],"name":"setTimeDivision","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6014600a5560c0604052601a60808190527f536861772041766572792040536861774176657279536f6e677300000000000060a09081526200004591601891906200016f565b503480156200005357600080fd5b50604051620041f8380380620041f883398101604081905262000076916200022b565b60408051808201825260088152674f636172696e617360c01b6020808301918252835180850190945260028452614f4360f01b908401528151919291620000c0916000916200016f565b508051620000d69060019060208401906200016f565b505050620000f3620000ed6200011960201b60201c565b6200011d565b8251620001089060179060208601906200016f565b506007919091556008555062000358565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200017d906200031b565b90600052602060002090601f016020900481019282620001a15760008555620001ec565b82601f10620001bc57805160ff1916838001178555620001ec565b82800160010185558215620001ec579182015b82811115620001ec578251825591602001919060010190620001cf565b50620001fa929150620001fe565b5090565b5b80821115620001fa5760008155600101620001ff565b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156200024157600080fd5b83516001600160401b03808211156200025957600080fd5b818601915086601f8301126200026e57600080fd5b81518181111562000283576200028362000215565b604051601f8201601f19908116603f01168101908382118183101715620002ae57620002ae62000215565b81604052828152602093508984848701011115620002cb57600080fd5b600091505b82821015620002ef5784820184015181830185015290830190620002d0565b82821115620003015760008484830101525b928801516040909801519299979850919695505050505050565b600181811c908216806200033057607f821691505b602082108114156200035257634e487b7160e01b600052602260045260246000fd5b50919050565b613e9080620003686000396000f3fe60806040526004361061028c5760003560e01c80638da5cb5b11610164578063c16cffb1116100c6578063efa193f41161008a578063f3fef3a311610064578063f3fef3a31461079a578063f4a0a528146107ba578063f78456c4146107da57600080fd5b8063efa193f41461073a578063efb3ade41461075a578063f2fde38b1461077a57600080fd5b8063c16cffb114610671578063c87b56dd14610691578063ca3bd325146106b1578063cbc21b08146106d1578063e985e9c5146106f157600080fd5b8063a22cb46511610128578063b156613611610102578063b15661361461061b578063b88d4fde14610631578063b9378ab31461065157600080fd5b8063a22cb465146105c6578063aaa06ae9146105e6578063aeb1fe511461060657600080fd5b80638da5cb5b1461053957806395d89b41146105575780639e1e85441461056c5780639fd6db121461058c578063a0f6b3aa146105a657600080fd5b80635b4efa4d1161020d57806367a44c64116101d157806370a08231116101ab57806370a08231146104e4578063715018a6146105045780638cac78461461051957600080fd5b806367a44c641461048e5780636817c76c146104ae578063689e69a9146104c457600080fd5b80635b4efa4d146104065780635c91f25c146104265780635d3dc8af146104465780636352211e1461045b578063640fc1811461047b57600080fd5b806323b872dd1161025457806323b872dd146103665780632ad3eb5c1461038657806342842e0e146103a6578063521993e3146103c657806355f804b3146103e657600080fd5b806301ffc9a71461029157806306fdde03146102c6578063081812fc146102e8578063095ea7b31461032057806318160ddd14610342575b600080fd5b34801561029d57600080fd5b506102b16102ac3660046130a0565b6107fa565b60405190151581526020015b60405180910390f35b3480156102d257600080fd5b506102db61084c565b6040516102bd9190613115565b3480156102f457600080fd5b50610308610303366004613128565b6108de565b6040516001600160a01b0390911681526020016102bd565b34801561032c57600080fd5b5061034061033b366004613156565b610978565b005b34801561034e57600080fd5b5061035860095481565b6040519081526020016102bd565b34801561037257600080fd5b50610340610381366004613182565b610a8e565b34801561039257600080fd5b506103406103a136600461320c565b610abf565b3480156103b257600080fd5b506103406103c1366004613182565b610b18565b3480156103d257600080fd5b506103406103e13660046132e4565b610b33565b3480156103f257600080fd5b506103406104013660046132e4565b610b74565b34801561041257600080fd5b50610340610421366004613128565b610bb1565b34801561043257600080fd5b50610340610441366004613128565b610be0565b34801561045257600080fd5b50610358610c0f565b34801561046757600080fd5b50610308610476366004613128565b610c1f565b61034061048936600461332d565b610c96565b34801561049a57600080fd5b506102db6104a9366004613128565b610f53565b3480156104ba57600080fd5b5061035860085481565b3480156104d057600080fd5b506103406104df3660046133fe565b611189565b3480156104f057600080fd5b506103586104ff366004613420565b61126e565b34801561051057600080fd5b506103406112f5565b34801561052557600080fd5b506103406105343660046133fe565b61132b565b34801561054557600080fd5b506006546001600160a01b0316610308565b34801561056357600080fd5b506102db6113ee565b34801561057857600080fd5b5061034061058736600461320c565b6113fd565b34801561059857600080fd5b506012546102b19060ff1681565b3480156105b257600080fd5b506103406105c136600461320c565b611450565b3480156105d257600080fd5b506103406105e1366004613452565b6114a3565b3480156105f257600080fd5b506103406106013660046133fe565b611568565b34801561061257600080fd5b506102db61162b565b34801561062757600080fd5b5061035860075481565b34801561063d57600080fd5b5061034061064c366004613487565b6116b9565b34801561065d57600080fd5b5061034061066c366004613507565b6116eb565b34801561067d57600080fd5b5061034061068c36600461320c565b61172c565b34801561069d57600080fd5b506102db6106ac366004613128565b61177f565b3480156106bd57600080fd5b506103406106cc366004613523565b6119dd565b3480156106dd57600080fd5b506103406106ec366004613128565b611a2b565b3480156106fd57600080fd5b506102b161070c366004613560565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561074657600080fd5b5061034061075536600461320c565b611a5a565b34801561076657600080fd5b5061034061077536600461320c565b611a9d565b34801561078657600080fd5b50610340610795366004613420565b611ae0565b3480156107a657600080fd5b506103406107b5366004613156565b611b7b565b3480156107c657600080fd5b506103406107d5366004613128565b611c40565b3480156107e657600080fd5b506103406107f53660046133fe565b611c6f565b60006001600160e01b031982166380ac58cd60e01b148061082b57506001600160e01b03198216635b5e139f60e01b145b8061084657506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461085b9061358e565b80601f01602080910402602001604051908101604052809291908181526020018280546108879061358e565b80156108d45780601f106108a9576101008083540402835291602001916108d4565b820191906000526020600020905b8154815290600101906020018083116108b757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661095c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061098382610c1f565b9050806001600160a01b0316836001600160a01b031614156109f15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610953565b336001600160a01b0382161480610a0d5750610a0d813361070c565b610a7f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610953565b610a898383611d32565b505050565b610a983382611da0565b610ab45760405162461bcd60e51b8152600401610953906135c9565b610a89838383611e97565b6006546001600160a01b03163314610ae95760405162461bcd60e51b81526004016109539061361a565b6000838152600c60209081526040822080546001810182559083529120610b1291018383612ecc565b50505050565b610a89838383604051806020016040528060008152506116b9565b6006546001600160a01b03163314610b5d5760405162461bcd60e51b81526004016109539061361a565b8051610b70906018906020840190612f50565b5050565b6006546001600160a01b03163314610b9e5760405162461bcd60e51b81526004016109539061361a565b8051610b70906017906020840190612f50565b6006546001600160a01b03163314610bdb5760405162461bcd60e51b81526004016109539061361a565b600755565b6006546001600160a01b03163314610c0a5760405162461bcd60e51b81526004016109539061361a565b601355565b6000610c1a60165490565b905090565b6000818152600260205260408120546001600160a01b0316806108465760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610953565b60125460ff16610ce85760405162461bcd60e51b815260206004820152601a60248201527f4f636172696e61733a206d696e74696e672064697361626c65640000000000006044820152606401610953565b6008543414610d435760405162461bcd60e51b815260206004820152602160248201527f4f636172696e61733a20696e636f7272656374206d696e74696e6720707269636044820152606560f81b6064820152608401610953565b6000610d4e60165490565b90506009548110610da15760405162461bcd60e51b815260206004820152601f60248201527f4f636172696e61733a206d696e74696e67206c696d69742072656163686564006044820152606401610953565b6001600160d81b0319861660009081526015602052604090205460ff1615610e0b5760405162461bcd60e51b815260206004820152601b60248201527f4f636172696e61733a207365656420616c7265616479207573656400000000006044820152606401610953565b60008585604051610e1d92919061364f565b60405180910390209050610ea384848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601354604051909250610e88915085908c906020019182526001600160d81b031916602082015260250190565b60405160208183030381529060405280519060200120612037565b610eef5760405162461bcd60e51b815260206004820152601c60248201527f4f636172696e61733a20696e76616c696420736565642070726f6f66000000006044820152606401610953565b6000828152601460209081526040808320805464ffffffffff191660d88c901c1790556001600160d81b03198a16835260159091529020805460ff19166001179055610f3b88836120e6565b610f49601680546001019055565b5050505050505050565b6000818152600260205260409020546060906001600160a01b0316610fba5760405162461bcd60e51b815260206004820152601b60248201527f4f636172696e61733a206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610953565b60008281526014602052604081205460d81b90611096600e8284811a815260208101919091526040016000208360045b825491901a908110610ffe57610ffe61365f565b9060005260206000200180546110139061358e565b80601f016020809104026020016040519081016040528092919081815260200182805461103f9061358e565b801561108c5780601f106110615761010080835404028352916020019161108c565b820191906000526020600020905b81548152906001019060200180831161106f57829003601f168201915b5050505050612228565b600083811a8152600b60205260408120919250906110b690846001610fea565b600084811a8152600c60205260408120919250906110d690856002610fea565b600085811a8152600d60205260408120919250906110f690866003610fea565b9050600061111f600f8288815b1a8152602081019190915260400160002080546110139061358e565b905060006111306010828981611103565b90506000611142600689835b1a6124ab565b8686868a878760405160200161115e9796959493929190613691565b6040516020818303038152906040529050600061117a826127d5565b9b9a5050505050505050505050565b6006546001600160a01b031633146111b35760405162461bcd60e51b81526004016109539061361a565b6000828152600d6020526040902080546111cf90600190613739565b815481106111df576111df61365f565b90600052602060002001600d6000848152602001908152602001600020828154811061120d5761120d61365f565b906000526020600020019080546112239061358e565b61122e929190612fc4565b506000828152600d6020526040902080548061124c5761124c613750565b600190038181906000526020600020016000611268919061303f565b90555050565b60006001600160a01b0382166112d95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610953565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461131f5760405162461bcd60e51b81526004016109539061361a565b611329600061293b565b565b6006546001600160a01b031633146113555760405162461bcd60e51b81526004016109539061361a565b6000828152600c60205260409020805461137190600190613739565b815481106113815761138161365f565b90600052602060002001600c600084815260200190815260200160002082815481106113af576113af61365f565b906000526020600020019080546113c59061358e565b6113d0929190612fc4565b506000828152600c6020526040902080548061124c5761124c613750565b60606001805461085b9061358e565b6006546001600160a01b031633146114275760405162461bcd60e51b81526004016109539061361a565b6000838152600d60209081526040822080546001810182559083529120610b1291018383612ecc565b6006546001600160a01b0316331461147a5760405162461bcd60e51b81526004016109539061361a565b6000838152600e60209081526040822080546001810182559083529120610b1291018383612ecc565b6001600160a01b0382163314156114fc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610953565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b031633146115925760405162461bcd60e51b81526004016109539061361a565b6000828152600b6020526040902080546115ae90600190613739565b815481106115be576115be61365f565b90600052602060002001600b600084815260200190815260200160002082815481106115ec576115ec61365f565b906000526020600020019080546116029061358e565b61160d929190612fc4565b506000828152600b6020526040902080548061124c5761124c613750565b601880546116389061358e565b80601f01602080910402602001604051908101604052809291908181526020018280546116649061358e565b80156116b15780601f10611686576101008083540402835291602001916116b1565b820191906000526020600020905b81548152906001019060200180831161169457829003601f168201915b505050505081565b6116c33383611da0565b6116df5760405162461bcd60e51b8152600401610953906135c9565b610b128484848461298d565b6006546001600160a01b031633146117155760405162461bcd60e51b81526004016109539061361a565b6012805460ff191692151592909217909155600955565b6006546001600160a01b031633146117565760405162461bcd60e51b81526004016109539061361a565b6000838152600b60209081526040822080546001810182559083529120610b1291018383612ecc565b6000818152600260205260409020546060906001600160a01b03166117e65760405162461bcd60e51b815260206004820152601b60248201527f4f636172696e61733a206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610953565b60008281526014602052604081205460d81b906118be6118086006848461113c565b600084811a8152600b6020526040902061182490856001610fea565b600085811a8152600c6020526040902061184090866002610fea565b600086811a8152600d6020526040902061185c90876003610fea565b600087811a8152600e6020526040902061187890886004610fea565b611886600f60008a81611103565b611894601060008b81611103565b6040516020016118aa9796959493929190613691565b6040516020818303038152906040526127d5565b905060006118cb856129c0565b60176118da60d886901c612abe565b60176040516020016118ef9493929190613800565b6040516020818303038152906040529050806119148460d81c64ffffffffff16612abe565b836119318660005b61192991901a600161397c565b60ff166129c0565b61193c87600161191c565b6040516020016119509594939291906139a1565b60408051601f1981840301815291905290508061196e84600261191c565b61197985600361191c565b61198486600461191c565b601860405160200161199a959493929190613b4b565b60405160208183030381529060405290506119b4816127d5565b6040516020016119c49190613c54565b6040516020818303038152906040529350505050919050565b6006546001600160a01b03163314611a075760405162461bcd60e51b81526004016109539061361a565b600091825260116020526040909120805461ffff191660f09290921c919091179055565b6006546001600160a01b03163314611a555760405162461bcd60e51b81526004016109539061361a565b600a55565b6006546001600160a01b03163314611a845760405162461bcd60e51b81526004016109539061361a565b6000838152600f60205260409020610b12908383612ecc565b6006546001600160a01b03163314611ac75760405162461bcd60e51b81526004016109539061361a565b6000838152601060205260409020610b12908383612ecc565b6006546001600160a01b03163314611b0a5760405162461bcd60e51b81526004016109539061361a565b6001600160a01b038116611b6f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610953565b611b788161293b565b50565b6006546001600160a01b03163314611ba55760405162461bcd60e51b81526004016109539061361a565b80471015611c085760405162461bcd60e51b815260206004820152602a60248201527f4f636172696e61733a20496e73756666696369656e742062616c616e636520746044820152696f20776974686472617760b01b6064820152608401610953565b80611c105750475b6001600160a01b038216611c2d576006546001600160a01b031691505b610b706001600160a01b03831682612b12565b6006546001600160a01b03163314611c6a5760405162461bcd60e51b81526004016109539061361a565b600855565b6006546001600160a01b03163314611c995760405162461bcd60e51b81526004016109539061361a565b6000828152600e602052604090208054611cb590600190613739565b81548110611cc557611cc561365f565b90600052602060002001600e60008481526020019081526020016000208281548110611cf357611cf361365f565b90600052602060002001908054611d099061358e565b611d14929190612fc4565b506000828152600e6020526040902080548061124c5761124c613750565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d6782610c1f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e195760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610953565b6000611e2483610c1f565b9050806001600160a01b0316846001600160a01b03161480611e5f5750836001600160a01b0316611e54846108de565b6001600160a01b0316145b80611e8f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611eaa82610c1f565b6001600160a01b031614611f125760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610953565b6001600160a01b038216611f745760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610953565b611f7f600082611d32565b6001600160a01b0383166000908152600360205260408120805460019290611fa8908490613739565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fd6908490613c99565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815b85518110156120db5760008682815181106120595761205961365f565b6020026020010151905080831161209b5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506120c8565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806120d381613cb1565b91505061203c565b509092149392505050565b6001600160a01b03821661213c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610953565b6000818152600260205260409020546001600160a01b0316156121a15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610953565b6001600160a01b03821660009081526003602052604081208054600192906121ca908490613c99565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60408051600880825281830190925260609160009190602082018180368337019050509050604d60f81b816000815181106122655761226561365f565b60200101906001600160f81b031916908160001a905350605460f81b816001815181106122945761229461365f565b60200101906001600160f81b031916908160001a905350607260f81b816002815181106122c3576122c361365f565b60200101906001600160f81b031916908160001a905350606b60f81b816003815181106122f2576122f261365f565b60200101906001600160f81b031916908160001a9053506000835160405160200161231f91815260200190565b6040516020818303038152906040529050806004825161233f9190613739565b8151811061234f5761234f61365f565b602001015160f81c60f81b8260048151811061236d5761236d61365f565b60200101906001600160f81b031916908160001a90535080600382516123939190613739565b815181106123a3576123a361365f565b602001015160f81c60f81b826005815181106123c1576123c161365f565b60200101906001600160f81b031916908160001a90535080600282516123e79190613739565b815181106123f7576123f761365f565b602001015160f81c60f81b826006815181106124155761241561365f565b60200101906001600160f81b031916908160001a905350806001825161243b9190613739565b8151811061244b5761244b61365f565b602001015160f81c60f81b826007815181106124695761246961365f565b60200101906001600160f81b031916908160001a9053508184604051602001612493929190613ccc565b60405160208183030381529060405292505050919050565b60ff811660009081526011602052604090205460609060f081901b9061ffff166124d65750600160f81b5b60408051600e808252818301909252600091602082018180368337019050509050604d60f81b8160008151811061250f5761250f61365f565b60200101906001600160f81b031916908160001a905350605460f81b8160018151811061253e5761253e61365f565b60200101906001600160f81b031916908160001a905350606860f81b8160028151811061256d5761256d61365f565b60200101906001600160f81b031916908160001a905350606460f81b8160038151811061259c5761259c61365f565b60200101906001600160f81b031916908160001a905350600060f81b816004815181106125cb576125cb61365f565b60200101906001600160f81b031916908160001a905350600060f81b816005815181106125fa576125fa61365f565b60200101906001600160f81b031916908160001a905350600060f81b816006815181106126295761262961365f565b60200101906001600160f81b031916908160001a905350600660f81b816007815181106126585761265861365f565b60200101906001600160f81b031916908160001a905350600060f81b816008815181106126875761268761365f565b60200101906001600160f81b031916908160001a9053508460ff16600114156126de57600060f81b816009815181106126c2576126c261365f565b60200101906001600160f81b031916908160001a90535061270e565b600160f81b816009815181106126f6576126f661365f565b60200101906001600160f81b031916908160001a9053505b600060f81b81600a815181106127265761272661365f565b60200101906001600160f81b031916908160001a9053508460f81b81600b815181106127545761275461365f565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600c815181106127855761278561365f565b60200101906001600160f81b031916908160001a9053508160011a60f81b81600d815181106127b6576127b661365f565b60200101906001600160f81b031916908160001a905350949350505050565b8051606090806127f5575050604080516020810190915260008152919050565b60006003612804836002613c99565b61280e9190613d11565b612819906004613d25565b90506000612828826020613c99565b67ffffffffffffffff81111561284057612840613258565b6040519080825280601f01601f19166020018201604052801561286a576020820181803683370190505b5090506000604051806060016040528060408152602001613e1b604091399050600181016020830160005b868110156128f6576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612895565b50600386066001811461291057600281146129215761292d565b613d3d60f01b60011983015261292d565b603d60f81b6000198301525b505050918152949350505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612998848484611e97565b6129a484848484612c2b565b610b125760405162461bcd60e51b815260040161095390613d44565b6060816129e45750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a0e57806129f881613cb1565b9150612a079050600a83613d11565b91506129e8565b60008167ffffffffffffffff811115612a2957612a29613258565b6040519080825280601f01601f191660200182016040528015612a53576020820181803683370190505b5090505b8415611e8f57612a68600183613739565b9150612a75600a86613d96565b612a80906030613c99565b60f81b818381518110612a9557612a9561365f565b60200101906001600160f81b031916908160001a905350612ab7600a86613d11565b9450612a57565b606081612ae55750506040805180820190915260048152630307830360e41b602082015290565b8160005b8115612b085780612af981613cb1565b915050600882901c9150612ae9565b611e8f8482612d29565b80471015612b625760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610953565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612baf576040519150601f19603f3d011682016040523d82523d6000602084013e612bb4565b606091505b5050905080610a895760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610953565b60006001600160a01b0384163b15612d1e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c6f903390899088908890600401613daa565b6020604051808303816000875af1925050508015612caa575060408051601f3d908101601f19168201909252612ca791810190613de6565b60015b612d04573d808015612cd8576040519150601f19603f3d011682016040523d82523d6000602084013e612cdd565b606091505b508051612cfc5760405162461bcd60e51b815260040161095390613d44565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e8f565b506001949350505050565b60606000612d38836002613d25565b612d43906002613c99565b67ffffffffffffffff811115612d5b57612d5b613258565b6040519080825280601f01601f191660200182016040528015612d85576020820181803683370190505b509050600360fc1b81600081518110612da057612da061365f565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612dcf57612dcf61365f565b60200101906001600160f81b031916908160001a9053506000612df3846002613d25565b612dfe906001613c99565b90505b6001811115612e76576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612e3257612e3261365f565b1a60f81b828281518110612e4857612e4861365f565b60200101906001600160f81b031916908160001a90535060049490941c93612e6f81613e03565b9050612e01565b508315612ec55760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610953565b9392505050565b828054612ed89061358e565b90600052602060002090601f016020900481019282612efa5760008555612f40565b82601f10612f135782800160ff19823516178555612f40565b82800160010185558215612f40579182015b82811115612f40578235825591602001919060010190612f25565b50612f4c929150613075565b5090565b828054612f5c9061358e565b90600052602060002090601f016020900481019282612f7e5760008555612f40565b82601f10612f9757805160ff1916838001178555612f40565b82800160010185558215612f40579182015b82811115612f40578251825591602001919060010190612fa9565b828054612fd09061358e565b90600052602060002090601f016020900481019282612ff25760008555612f40565b82601f106130035780548555612f40565b82800160010185558215612f4057600052602060002091601f016020900482015b82811115612f40578254825591600101919060010190613024565b50805461304b9061358e565b6000825580601f1061305b575050565b601f016020900490600052602060002090810190611b7891905b5b80821115612f4c5760008155600101613076565b6001600160e01b031981168114611b7857600080fd5b6000602082840312156130b257600080fd5b8135612ec58161308a565b60005b838110156130d85781810151838201526020016130c0565b83811115610b125750506000910152565b600081518084526131018160208601602086016130bd565b601f01601f19169290920160200192915050565b602081526000612ec560208301846130e9565b60006020828403121561313a57600080fd5b5035919050565b6001600160a01b0381168114611b7857600080fd5b6000806040838503121561316957600080fd5b823561317481613141565b946020939093013593505050565b60008060006060848603121561319757600080fd5b83356131a281613141565b925060208401356131b281613141565b929592945050506040919091013590565b60008083601f8401126131d557600080fd5b50813567ffffffffffffffff8111156131ed57600080fd5b60208301915083602082850101111561320557600080fd5b9250929050565b60008060006040848603121561322157600080fd5b83359250602084013567ffffffffffffffff81111561323f57600080fd5b61324b868287016131c3565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561328957613289613258565b604051601f8501601f19908116603f011681019082821181831017156132b1576132b1613258565b816040528093508581528686860111156132ca57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156132f657600080fd5b813567ffffffffffffffff81111561330d57600080fd5b8201601f8101841361331e57600080fd5b611e8f8482356020840161326e565b6000806000806000806080878903121561334657600080fd5b863561335181613141565b955060208701356001600160d81b03198116811461336e57600080fd5b9450604087013567ffffffffffffffff8082111561338b57600080fd5b6133978a838b016131c3565b909650945060608901359150808211156133b057600080fd5b818901915089601f8301126133c457600080fd5b8135818111156133d357600080fd5b8a60208260051b85010111156133e857600080fd5b6020830194508093505050509295509295509295565b6000806040838503121561341157600080fd5b50508035926020909101359150565b60006020828403121561343257600080fd5b8135612ec581613141565b8035801515811461344d57600080fd5b919050565b6000806040838503121561346557600080fd5b823561347081613141565b915061347e6020840161343d565b90509250929050565b6000806000806080858703121561349d57600080fd5b84356134a881613141565b935060208501356134b881613141565b925060408501359150606085013567ffffffffffffffff8111156134db57600080fd5b8501601f810187136134ec57600080fd5b6134fb8782356020840161326e565b91505092959194509250565b6000806040838503121561351a57600080fd5b6131748361343d565b6000806040838503121561353657600080fd5b8235915060208301356001600160f01b03198116811461355557600080fd5b809150509250929050565b6000806040838503121561357357600080fd5b823561357e81613141565b9150602083013561355581613141565b600181811c908216806135a257607f821691505b602082108114156135c357634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b600081516136878185602086016130bd565b9290920192915050565b6000885160206136a48285838e016130bd565b8951918401916136b78184848e016130bd565b89519201916136c98184848d016130bd565b88519201916136db8184848c016130bd565b87519201916136ed8184848b016130bd565b86519201916136ff8184848a016130bd565b855192019161371181848489016130bd565b919091019a9950505050505050505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561374b5761374b613723565b500390565b634e487b7160e01b600052603160045260246000fd5b8054600090600181811c908083168061378057607f831692505b60208084108214156137a257634e487b7160e01b600052602260045260246000fd5b8180156137b657600181146137c7576137f4565b60ff198616895284890196506137f4565b60008881526020902060005b868110156137ec5781548b8201529085019083016137d3565b505084890196505b50505050505092915050565b727b226e616d65223a20224f636172696e61202360681b8152845160009061382f816013850160208a016130bd565b7f222c20226465736372697074696f6e223a20224120756e6971756520706965636013918401918201527f65206f66206d7573696320726570726573656e74656420656e746972656c792060338201527f6f6e2d636861696e20696e20746865204d49444920666f726d6174207769746860538201527f20696e737069726174696f6e2066726f6d20746865206d75736963616c20746860738201527f656d657320616e64206d6f74696673206f6620766964656f2067616d65732e2260938201526b16101134b6b0b3b2911d101160a11b60b382015261391360bf820187613766565b9050662f696d6167652f60c81b815284516139358160078401602089016130bd565b61397061396a6007838501017f222c2022616e696d6174696f6e5f75726c223a20220000000000000000000000815260150190565b86613766565b98975050505050505050565b600060ff821660ff84168060ff0382111561399957613999613723565b019392505050565b600086516139b3818460208b016130bd565b6a2f616e696d6174696f6e2f60a81b90830190815286516139db81600b840160208b016130bd565b7f222c2022617564696f223a2022646174613a617564696f2f6d6964693b626173600b929091019182015263194d8d0b60e21b602b8201528551613a2681602f840160208a016130bd565b7f222c202265787465726e616c5f75726c223a2022687474703a2f2f6265617466602f92909101918201527f6f756e6472792e78797a222c202261747472696275746573223a205b7b227472604f8201527f6169745f74797065223a202243686f72642050726f6772657373696f6e222c20606f82015269113b30b63ab2911d101160b11b608f820152613970613b0b613b05613ac66099850189613675565b7f227d2c207b2274726169745f74797065223a20224669727374204d656c6f647981526c111610113b30b63ab2911d101160991b6020820152602d0190565b86613675565b7f227d2c207b2274726169745f74797065223a20225365636f6e64204d656c6f6481526d3c911610113b30b63ab2911d101160911b6020820152602e0190565b60008651613b5d818460208b016130bd565b865190830190613b71818360208b016130bd565b8082019150507f227d2c207b2274726169745f74797065223a20225468697264204d656c6f647981526c111610113b30b63ab2911d101160991b60208201528551613bc381602d840160208a016130bd565b7f227d2c207b2274726169745f74797065223a20224472756d73222c202276616c602d9290910191820152653ab2911d101160d11b604d8201528451613c108160538401602089016130bd565b71113eae96101131b7b6b837b9b2b9111d101160711b60539290910191820152613c3d6065820185613766565b61227d60f01b815260020198975050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613c8c81601d8501602087016130bd565b91909101601d0192915050565b60008219821115613cac57613cac613723565b500190565b6000600019821415613cc557613cc5613723565b5060010190565b60008351613cde8184602088016130bd565b835190830190613cf28183602088016130bd565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b600082613d2057613d20613cfb565b500490565b6000816000190483118215151615613d3f57613d3f613723565b500290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082613da557613da5613cfb565b500690565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613ddc60808301846130e9565b9695505050505050565b600060208284031215613df857600080fd5b8151612ec58161308a565b600081613e1257613e12613723565b50600019019056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220533cd060b6cb211b6f6da1dda6c0a470264adac67915f91b6dec07c88447807c64736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000008e1bc9bf040000000000000000000000000000000000000000000000000000000000000000002668747470733a2f2f6170692e62656174666f756e6472792e78797a2f6170692f76312f6e66740000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061028c5760003560e01c80638da5cb5b11610164578063c16cffb1116100c6578063efa193f41161008a578063f3fef3a311610064578063f3fef3a31461079a578063f4a0a528146107ba578063f78456c4146107da57600080fd5b8063efa193f41461073a578063efb3ade41461075a578063f2fde38b1461077a57600080fd5b8063c16cffb114610671578063c87b56dd14610691578063ca3bd325146106b1578063cbc21b08146106d1578063e985e9c5146106f157600080fd5b8063a22cb46511610128578063b156613611610102578063b15661361461061b578063b88d4fde14610631578063b9378ab31461065157600080fd5b8063a22cb465146105c6578063aaa06ae9146105e6578063aeb1fe511461060657600080fd5b80638da5cb5b1461053957806395d89b41146105575780639e1e85441461056c5780639fd6db121461058c578063a0f6b3aa146105a657600080fd5b80635b4efa4d1161020d57806367a44c64116101d157806370a08231116101ab57806370a08231146104e4578063715018a6146105045780638cac78461461051957600080fd5b806367a44c641461048e5780636817c76c146104ae578063689e69a9146104c457600080fd5b80635b4efa4d146104065780635c91f25c146104265780635d3dc8af146104465780636352211e1461045b578063640fc1811461047b57600080fd5b806323b872dd1161025457806323b872dd146103665780632ad3eb5c1461038657806342842e0e146103a6578063521993e3146103c657806355f804b3146103e657600080fd5b806301ffc9a71461029157806306fdde03146102c6578063081812fc146102e8578063095ea7b31461032057806318160ddd14610342575b600080fd5b34801561029d57600080fd5b506102b16102ac3660046130a0565b6107fa565b60405190151581526020015b60405180910390f35b3480156102d257600080fd5b506102db61084c565b6040516102bd9190613115565b3480156102f457600080fd5b50610308610303366004613128565b6108de565b6040516001600160a01b0390911681526020016102bd565b34801561032c57600080fd5b5061034061033b366004613156565b610978565b005b34801561034e57600080fd5b5061035860095481565b6040519081526020016102bd565b34801561037257600080fd5b50610340610381366004613182565b610a8e565b34801561039257600080fd5b506103406103a136600461320c565b610abf565b3480156103b257600080fd5b506103406103c1366004613182565b610b18565b3480156103d257600080fd5b506103406103e13660046132e4565b610b33565b3480156103f257600080fd5b506103406104013660046132e4565b610b74565b34801561041257600080fd5b50610340610421366004613128565b610bb1565b34801561043257600080fd5b50610340610441366004613128565b610be0565b34801561045257600080fd5b50610358610c0f565b34801561046757600080fd5b50610308610476366004613128565b610c1f565b61034061048936600461332d565b610c96565b34801561049a57600080fd5b506102db6104a9366004613128565b610f53565b3480156104ba57600080fd5b5061035860085481565b3480156104d057600080fd5b506103406104df3660046133fe565b611189565b3480156104f057600080fd5b506103586104ff366004613420565b61126e565b34801561051057600080fd5b506103406112f5565b34801561052557600080fd5b506103406105343660046133fe565b61132b565b34801561054557600080fd5b506006546001600160a01b0316610308565b34801561056357600080fd5b506102db6113ee565b34801561057857600080fd5b5061034061058736600461320c565b6113fd565b34801561059857600080fd5b506012546102b19060ff1681565b3480156105b257600080fd5b506103406105c136600461320c565b611450565b3480156105d257600080fd5b506103406105e1366004613452565b6114a3565b3480156105f257600080fd5b506103406106013660046133fe565b611568565b34801561061257600080fd5b506102db61162b565b34801561062757600080fd5b5061035860075481565b34801561063d57600080fd5b5061034061064c366004613487565b6116b9565b34801561065d57600080fd5b5061034061066c366004613507565b6116eb565b34801561067d57600080fd5b5061034061068c36600461320c565b61172c565b34801561069d57600080fd5b506102db6106ac366004613128565b61177f565b3480156106bd57600080fd5b506103406106cc366004613523565b6119dd565b3480156106dd57600080fd5b506103406106ec366004613128565b611a2b565b3480156106fd57600080fd5b506102b161070c366004613560565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561074657600080fd5b5061034061075536600461320c565b611a5a565b34801561076657600080fd5b5061034061077536600461320c565b611a9d565b34801561078657600080fd5b50610340610795366004613420565b611ae0565b3480156107a657600080fd5b506103406107b5366004613156565b611b7b565b3480156107c657600080fd5b506103406107d5366004613128565b611c40565b3480156107e657600080fd5b506103406107f53660046133fe565b611c6f565b60006001600160e01b031982166380ac58cd60e01b148061082b57506001600160e01b03198216635b5e139f60e01b145b8061084657506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461085b9061358e565b80601f01602080910402602001604051908101604052809291908181526020018280546108879061358e565b80156108d45780601f106108a9576101008083540402835291602001916108d4565b820191906000526020600020905b8154815290600101906020018083116108b757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661095c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061098382610c1f565b9050806001600160a01b0316836001600160a01b031614156109f15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610953565b336001600160a01b0382161480610a0d5750610a0d813361070c565b610a7f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610953565b610a898383611d32565b505050565b610a983382611da0565b610ab45760405162461bcd60e51b8152600401610953906135c9565b610a89838383611e97565b6006546001600160a01b03163314610ae95760405162461bcd60e51b81526004016109539061361a565b6000838152600c60209081526040822080546001810182559083529120610b1291018383612ecc565b50505050565b610a89838383604051806020016040528060008152506116b9565b6006546001600160a01b03163314610b5d5760405162461bcd60e51b81526004016109539061361a565b8051610b70906018906020840190612f50565b5050565b6006546001600160a01b03163314610b9e5760405162461bcd60e51b81526004016109539061361a565b8051610b70906017906020840190612f50565b6006546001600160a01b03163314610bdb5760405162461bcd60e51b81526004016109539061361a565b600755565b6006546001600160a01b03163314610c0a5760405162461bcd60e51b81526004016109539061361a565b601355565b6000610c1a60165490565b905090565b6000818152600260205260408120546001600160a01b0316806108465760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610953565b60125460ff16610ce85760405162461bcd60e51b815260206004820152601a60248201527f4f636172696e61733a206d696e74696e672064697361626c65640000000000006044820152606401610953565b6008543414610d435760405162461bcd60e51b815260206004820152602160248201527f4f636172696e61733a20696e636f7272656374206d696e74696e6720707269636044820152606560f81b6064820152608401610953565b6000610d4e60165490565b90506009548110610da15760405162461bcd60e51b815260206004820152601f60248201527f4f636172696e61733a206d696e74696e67206c696d69742072656163686564006044820152606401610953565b6001600160d81b0319861660009081526015602052604090205460ff1615610e0b5760405162461bcd60e51b815260206004820152601b60248201527f4f636172696e61733a207365656420616c7265616479207573656400000000006044820152606401610953565b60008585604051610e1d92919061364f565b60405180910390209050610ea384848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601354604051909250610e88915085908c906020019182526001600160d81b031916602082015260250190565b60405160208183030381529060405280519060200120612037565b610eef5760405162461bcd60e51b815260206004820152601c60248201527f4f636172696e61733a20696e76616c696420736565642070726f6f66000000006044820152606401610953565b6000828152601460209081526040808320805464ffffffffff191660d88c901c1790556001600160d81b03198a16835260159091529020805460ff19166001179055610f3b88836120e6565b610f49601680546001019055565b5050505050505050565b6000818152600260205260409020546060906001600160a01b0316610fba5760405162461bcd60e51b815260206004820152601b60248201527f4f636172696e61733a206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610953565b60008281526014602052604081205460d81b90611096600e8284811a815260208101919091526040016000208360045b825491901a908110610ffe57610ffe61365f565b9060005260206000200180546110139061358e565b80601f016020809104026020016040519081016040528092919081815260200182805461103f9061358e565b801561108c5780601f106110615761010080835404028352916020019161108c565b820191906000526020600020905b81548152906001019060200180831161106f57829003601f168201915b5050505050612228565b600083811a8152600b60205260408120919250906110b690846001610fea565b600084811a8152600c60205260408120919250906110d690856002610fea565b600085811a8152600d60205260408120919250906110f690866003610fea565b9050600061111f600f8288815b1a8152602081019190915260400160002080546110139061358e565b905060006111306010828981611103565b90506000611142600689835b1a6124ab565b8686868a878760405160200161115e9796959493929190613691565b6040516020818303038152906040529050600061117a826127d5565b9b9a5050505050505050505050565b6006546001600160a01b031633146111b35760405162461bcd60e51b81526004016109539061361a565b6000828152600d6020526040902080546111cf90600190613739565b815481106111df576111df61365f565b90600052602060002001600d6000848152602001908152602001600020828154811061120d5761120d61365f565b906000526020600020019080546112239061358e565b61122e929190612fc4565b506000828152600d6020526040902080548061124c5761124c613750565b600190038181906000526020600020016000611268919061303f565b90555050565b60006001600160a01b0382166112d95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610953565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461131f5760405162461bcd60e51b81526004016109539061361a565b611329600061293b565b565b6006546001600160a01b031633146113555760405162461bcd60e51b81526004016109539061361a565b6000828152600c60205260409020805461137190600190613739565b815481106113815761138161365f565b90600052602060002001600c600084815260200190815260200160002082815481106113af576113af61365f565b906000526020600020019080546113c59061358e565b6113d0929190612fc4565b506000828152600c6020526040902080548061124c5761124c613750565b60606001805461085b9061358e565b6006546001600160a01b031633146114275760405162461bcd60e51b81526004016109539061361a565b6000838152600d60209081526040822080546001810182559083529120610b1291018383612ecc565b6006546001600160a01b0316331461147a5760405162461bcd60e51b81526004016109539061361a565b6000838152600e60209081526040822080546001810182559083529120610b1291018383612ecc565b6001600160a01b0382163314156114fc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610953565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b031633146115925760405162461bcd60e51b81526004016109539061361a565b6000828152600b6020526040902080546115ae90600190613739565b815481106115be576115be61365f565b90600052602060002001600b600084815260200190815260200160002082815481106115ec576115ec61365f565b906000526020600020019080546116029061358e565b61160d929190612fc4565b506000828152600b6020526040902080548061124c5761124c613750565b601880546116389061358e565b80601f01602080910402602001604051908101604052809291908181526020018280546116649061358e565b80156116b15780601f10611686576101008083540402835291602001916116b1565b820191906000526020600020905b81548152906001019060200180831161169457829003601f168201915b505050505081565b6116c33383611da0565b6116df5760405162461bcd60e51b8152600401610953906135c9565b610b128484848461298d565b6006546001600160a01b031633146117155760405162461bcd60e51b81526004016109539061361a565b6012805460ff191692151592909217909155600955565b6006546001600160a01b031633146117565760405162461bcd60e51b81526004016109539061361a565b6000838152600b60209081526040822080546001810182559083529120610b1291018383612ecc565b6000818152600260205260409020546060906001600160a01b03166117e65760405162461bcd60e51b815260206004820152601b60248201527f4f636172696e61733a206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610953565b60008281526014602052604081205460d81b906118be6118086006848461113c565b600084811a8152600b6020526040902061182490856001610fea565b600085811a8152600c6020526040902061184090866002610fea565b600086811a8152600d6020526040902061185c90876003610fea565b600087811a8152600e6020526040902061187890886004610fea565b611886600f60008a81611103565b611894601060008b81611103565b6040516020016118aa9796959493929190613691565b6040516020818303038152906040526127d5565b905060006118cb856129c0565b60176118da60d886901c612abe565b60176040516020016118ef9493929190613800565b6040516020818303038152906040529050806119148460d81c64ffffffffff16612abe565b836119318660005b61192991901a600161397c565b60ff166129c0565b61193c87600161191c565b6040516020016119509594939291906139a1565b60408051601f1981840301815291905290508061196e84600261191c565b61197985600361191c565b61198486600461191c565b601860405160200161199a959493929190613b4b565b60405160208183030381529060405290506119b4816127d5565b6040516020016119c49190613c54565b6040516020818303038152906040529350505050919050565b6006546001600160a01b03163314611a075760405162461bcd60e51b81526004016109539061361a565b600091825260116020526040909120805461ffff191660f09290921c919091179055565b6006546001600160a01b03163314611a555760405162461bcd60e51b81526004016109539061361a565b600a55565b6006546001600160a01b03163314611a845760405162461bcd60e51b81526004016109539061361a565b6000838152600f60205260409020610b12908383612ecc565b6006546001600160a01b03163314611ac75760405162461bcd60e51b81526004016109539061361a565b6000838152601060205260409020610b12908383612ecc565b6006546001600160a01b03163314611b0a5760405162461bcd60e51b81526004016109539061361a565b6001600160a01b038116611b6f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610953565b611b788161293b565b50565b6006546001600160a01b03163314611ba55760405162461bcd60e51b81526004016109539061361a565b80471015611c085760405162461bcd60e51b815260206004820152602a60248201527f4f636172696e61733a20496e73756666696369656e742062616c616e636520746044820152696f20776974686472617760b01b6064820152608401610953565b80611c105750475b6001600160a01b038216611c2d576006546001600160a01b031691505b610b706001600160a01b03831682612b12565b6006546001600160a01b03163314611c6a5760405162461bcd60e51b81526004016109539061361a565b600855565b6006546001600160a01b03163314611c995760405162461bcd60e51b81526004016109539061361a565b6000828152600e602052604090208054611cb590600190613739565b81548110611cc557611cc561365f565b90600052602060002001600e60008481526020019081526020016000208281548110611cf357611cf361365f565b90600052602060002001908054611d099061358e565b611d14929190612fc4565b506000828152600e6020526040902080548061124c5761124c613750565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d6782610c1f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e195760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610953565b6000611e2483610c1f565b9050806001600160a01b0316846001600160a01b03161480611e5f5750836001600160a01b0316611e54846108de565b6001600160a01b0316145b80611e8f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611eaa82610c1f565b6001600160a01b031614611f125760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610953565b6001600160a01b038216611f745760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610953565b611f7f600082611d32565b6001600160a01b0383166000908152600360205260408120805460019290611fa8908490613739565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fd6908490613c99565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081815b85518110156120db5760008682815181106120595761205961365f565b6020026020010151905080831161209b5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506120c8565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806120d381613cb1565b91505061203c565b509092149392505050565b6001600160a01b03821661213c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610953565b6000818152600260205260409020546001600160a01b0316156121a15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610953565b6001600160a01b03821660009081526003602052604081208054600192906121ca908490613c99565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60408051600880825281830190925260609160009190602082018180368337019050509050604d60f81b816000815181106122655761226561365f565b60200101906001600160f81b031916908160001a905350605460f81b816001815181106122945761229461365f565b60200101906001600160f81b031916908160001a905350607260f81b816002815181106122c3576122c361365f565b60200101906001600160f81b031916908160001a905350606b60f81b816003815181106122f2576122f261365f565b60200101906001600160f81b031916908160001a9053506000835160405160200161231f91815260200190565b6040516020818303038152906040529050806004825161233f9190613739565b8151811061234f5761234f61365f565b602001015160f81c60f81b8260048151811061236d5761236d61365f565b60200101906001600160f81b031916908160001a90535080600382516123939190613739565b815181106123a3576123a361365f565b602001015160f81c60f81b826005815181106123c1576123c161365f565b60200101906001600160f81b031916908160001a90535080600282516123e79190613739565b815181106123f7576123f761365f565b602001015160f81c60f81b826006815181106124155761241561365f565b60200101906001600160f81b031916908160001a905350806001825161243b9190613739565b8151811061244b5761244b61365f565b602001015160f81c60f81b826007815181106124695761246961365f565b60200101906001600160f81b031916908160001a9053508184604051602001612493929190613ccc565b60405160208183030381529060405292505050919050565b60ff811660009081526011602052604090205460609060f081901b9061ffff166124d65750600160f81b5b60408051600e808252818301909252600091602082018180368337019050509050604d60f81b8160008151811061250f5761250f61365f565b60200101906001600160f81b031916908160001a905350605460f81b8160018151811061253e5761253e61365f565b60200101906001600160f81b031916908160001a905350606860f81b8160028151811061256d5761256d61365f565b60200101906001600160f81b031916908160001a905350606460f81b8160038151811061259c5761259c61365f565b60200101906001600160f81b031916908160001a905350600060f81b816004815181106125cb576125cb61365f565b60200101906001600160f81b031916908160001a905350600060f81b816005815181106125fa576125fa61365f565b60200101906001600160f81b031916908160001a905350600060f81b816006815181106126295761262961365f565b60200101906001600160f81b031916908160001a905350600660f81b816007815181106126585761265861365f565b60200101906001600160f81b031916908160001a905350600060f81b816008815181106126875761268761365f565b60200101906001600160f81b031916908160001a9053508460ff16600114156126de57600060f81b816009815181106126c2576126c261365f565b60200101906001600160f81b031916908160001a90535061270e565b600160f81b816009815181106126f6576126f661365f565b60200101906001600160f81b031916908160001a9053505b600060f81b81600a815181106127265761272661365f565b60200101906001600160f81b031916908160001a9053508460f81b81600b815181106127545761275461365f565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600c815181106127855761278561365f565b60200101906001600160f81b031916908160001a9053508160011a60f81b81600d815181106127b6576127b661365f565b60200101906001600160f81b031916908160001a905350949350505050565b8051606090806127f5575050604080516020810190915260008152919050565b60006003612804836002613c99565b61280e9190613d11565b612819906004613d25565b90506000612828826020613c99565b67ffffffffffffffff81111561284057612840613258565b6040519080825280601f01601f19166020018201604052801561286a576020820181803683370190505b5090506000604051806060016040528060408152602001613e1b604091399050600181016020830160005b868110156128f6576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612895565b50600386066001811461291057600281146129215761292d565b613d3d60f01b60011983015261292d565b603d60f81b6000198301525b505050918152949350505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612998848484611e97565b6129a484848484612c2b565b610b125760405162461bcd60e51b815260040161095390613d44565b6060816129e45750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a0e57806129f881613cb1565b9150612a079050600a83613d11565b91506129e8565b60008167ffffffffffffffff811115612a2957612a29613258565b6040519080825280601f01601f191660200182016040528015612a53576020820181803683370190505b5090505b8415611e8f57612a68600183613739565b9150612a75600a86613d96565b612a80906030613c99565b60f81b818381518110612a9557612a9561365f565b60200101906001600160f81b031916908160001a905350612ab7600a86613d11565b9450612a57565b606081612ae55750506040805180820190915260048152630307830360e41b602082015290565b8160005b8115612b085780612af981613cb1565b915050600882901c9150612ae9565b611e8f8482612d29565b80471015612b625760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610953565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612baf576040519150601f19603f3d011682016040523d82523d6000602084013e612bb4565b606091505b5050905080610a895760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610953565b60006001600160a01b0384163b15612d1e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c6f903390899088908890600401613daa565b6020604051808303816000875af1925050508015612caa575060408051601f3d908101601f19168201909252612ca791810190613de6565b60015b612d04573d808015612cd8576040519150601f19603f3d011682016040523d82523d6000602084013e612cdd565b606091505b508051612cfc5760405162461bcd60e51b815260040161095390613d44565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e8f565b506001949350505050565b60606000612d38836002613d25565b612d43906002613c99565b67ffffffffffffffff811115612d5b57612d5b613258565b6040519080825280601f01601f191660200182016040528015612d85576020820181803683370190505b509050600360fc1b81600081518110612da057612da061365f565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612dcf57612dcf61365f565b60200101906001600160f81b031916908160001a9053506000612df3846002613d25565b612dfe906001613c99565b90505b6001811115612e76576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612e3257612e3261365f565b1a60f81b828281518110612e4857612e4861365f565b60200101906001600160f81b031916908160001a90535060049490941c93612e6f81613e03565b9050612e01565b508315612ec55760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610953565b9392505050565b828054612ed89061358e565b90600052602060002090601f016020900481019282612efa5760008555612f40565b82601f10612f135782800160ff19823516178555612f40565b82800160010185558215612f40579182015b82811115612f40578235825591602001919060010190612f25565b50612f4c929150613075565b5090565b828054612f5c9061358e565b90600052602060002090601f016020900481019282612f7e5760008555612f40565b82601f10612f9757805160ff1916838001178555612f40565b82800160010185558215612f40579182015b82811115612f40578251825591602001919060010190612fa9565b828054612fd09061358e565b90600052602060002090601f016020900481019282612ff25760008555612f40565b82601f106130035780548555612f40565b82800160010185558215612f4057600052602060002091601f016020900482015b82811115612f40578254825591600101919060010190613024565b50805461304b9061358e565b6000825580601f1061305b575050565b601f016020900490600052602060002090810190611b7891905b5b80821115612f4c5760008155600101613076565b6001600160e01b031981168114611b7857600080fd5b6000602082840312156130b257600080fd5b8135612ec58161308a565b60005b838110156130d85781810151838201526020016130c0565b83811115610b125750506000910152565b600081518084526131018160208601602086016130bd565b601f01601f19169290920160200192915050565b602081526000612ec560208301846130e9565b60006020828403121561313a57600080fd5b5035919050565b6001600160a01b0381168114611b7857600080fd5b6000806040838503121561316957600080fd5b823561317481613141565b946020939093013593505050565b60008060006060848603121561319757600080fd5b83356131a281613141565b925060208401356131b281613141565b929592945050506040919091013590565b60008083601f8401126131d557600080fd5b50813567ffffffffffffffff8111156131ed57600080fd5b60208301915083602082850101111561320557600080fd5b9250929050565b60008060006040848603121561322157600080fd5b83359250602084013567ffffffffffffffff81111561323f57600080fd5b61324b868287016131c3565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561328957613289613258565b604051601f8501601f19908116603f011681019082821181831017156132b1576132b1613258565b816040528093508581528686860111156132ca57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156132f657600080fd5b813567ffffffffffffffff81111561330d57600080fd5b8201601f8101841361331e57600080fd5b611e8f8482356020840161326e565b6000806000806000806080878903121561334657600080fd5b863561335181613141565b955060208701356001600160d81b03198116811461336e57600080fd5b9450604087013567ffffffffffffffff8082111561338b57600080fd5b6133978a838b016131c3565b909650945060608901359150808211156133b057600080fd5b818901915089601f8301126133c457600080fd5b8135818111156133d357600080fd5b8a60208260051b85010111156133e857600080fd5b6020830194508093505050509295509295509295565b6000806040838503121561341157600080fd5b50508035926020909101359150565b60006020828403121561343257600080fd5b8135612ec581613141565b8035801515811461344d57600080fd5b919050565b6000806040838503121561346557600080fd5b823561347081613141565b915061347e6020840161343d565b90509250929050565b6000806000806080858703121561349d57600080fd5b84356134a881613141565b935060208501356134b881613141565b925060408501359150606085013567ffffffffffffffff8111156134db57600080fd5b8501601f810187136134ec57600080fd5b6134fb8782356020840161326e565b91505092959194509250565b6000806040838503121561351a57600080fd5b6131748361343d565b6000806040838503121561353657600080fd5b8235915060208301356001600160f01b03198116811461355557600080fd5b809150509250929050565b6000806040838503121561357357600080fd5b823561357e81613141565b9150602083013561355581613141565b600181811c908216806135a257607f821691505b602082108114156135c357634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b600081516136878185602086016130bd565b9290920192915050565b6000885160206136a48285838e016130bd565b8951918401916136b78184848e016130bd565b89519201916136c98184848d016130bd565b88519201916136db8184848c016130bd565b87519201916136ed8184848b016130bd565b86519201916136ff8184848a016130bd565b855192019161371181848489016130bd565b919091019a9950505050505050505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561374b5761374b613723565b500390565b634e487b7160e01b600052603160045260246000fd5b8054600090600181811c908083168061378057607f831692505b60208084108214156137a257634e487b7160e01b600052602260045260246000fd5b8180156137b657600181146137c7576137f4565b60ff198616895284890196506137f4565b60008881526020902060005b868110156137ec5781548b8201529085019083016137d3565b505084890196505b50505050505092915050565b727b226e616d65223a20224f636172696e61202360681b8152845160009061382f816013850160208a016130bd565b7f222c20226465736372697074696f6e223a20224120756e6971756520706965636013918401918201527f65206f66206d7573696320726570726573656e74656420656e746972656c792060338201527f6f6e2d636861696e20696e20746865204d49444920666f726d6174207769746860538201527f20696e737069726174696f6e2066726f6d20746865206d75736963616c20746860738201527f656d657320616e64206d6f74696673206f6620766964656f2067616d65732e2260938201526b16101134b6b0b3b2911d101160a11b60b382015261391360bf820187613766565b9050662f696d6167652f60c81b815284516139358160078401602089016130bd565b61397061396a6007838501017f222c2022616e696d6174696f6e5f75726c223a20220000000000000000000000815260150190565b86613766565b98975050505050505050565b600060ff821660ff84168060ff0382111561399957613999613723565b019392505050565b600086516139b3818460208b016130bd565b6a2f616e696d6174696f6e2f60a81b90830190815286516139db81600b840160208b016130bd565b7f222c2022617564696f223a2022646174613a617564696f2f6d6964693b626173600b929091019182015263194d8d0b60e21b602b8201528551613a2681602f840160208a016130bd565b7f222c202265787465726e616c5f75726c223a2022687474703a2f2f6265617466602f92909101918201527f6f756e6472792e78797a222c202261747472696275746573223a205b7b227472604f8201527f6169745f74797065223a202243686f72642050726f6772657373696f6e222c20606f82015269113b30b63ab2911d101160b11b608f820152613970613b0b613b05613ac66099850189613675565b7f227d2c207b2274726169745f74797065223a20224669727374204d656c6f647981526c111610113b30b63ab2911d101160991b6020820152602d0190565b86613675565b7f227d2c207b2274726169745f74797065223a20225365636f6e64204d656c6f6481526d3c911610113b30b63ab2911d101160911b6020820152602e0190565b60008651613b5d818460208b016130bd565b865190830190613b71818360208b016130bd565b8082019150507f227d2c207b2274726169745f74797065223a20225468697264204d656c6f647981526c111610113b30b63ab2911d101160991b60208201528551613bc381602d840160208a016130bd565b7f227d2c207b2274726169745f74797065223a20224472756d73222c202276616c602d9290910191820152653ab2911d101160d11b604d8201528451613c108160538401602089016130bd565b71113eae96101131b7b6b837b9b2b9111d101160711b60539290910191820152613c3d6065820185613766565b61227d60f01b815260020198975050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613c8c81601d8501602087016130bd565b91909101601d0192915050565b60008219821115613cac57613cac613723565b500190565b6000600019821415613cc557613cc5613723565b5060010190565b60008351613cde8184602088016130bd565b835190830190613cf28183602088016130bd565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b600082613d2057613d20613cfb565b500490565b6000816000190483118215151615613d3f57613d3f613723565b500290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082613da557613da5613cfb565b500690565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613ddc60808301846130e9565b9695505050505050565b600060208284031215613df857600080fd5b8151612ec58161308a565b600081613e1257613e12613723565b50600019019056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220533cd060b6cb211b6f6da1dda6c0a470264adac67915f91b6dec07c88447807c64736f6c634300080b0033

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

00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000008e1bc9bf040000000000000000000000000000000000000000000000000000000000000000002668747470733a2f2f6170692e62656174666f756e6472792e78797a2f6170692f76312f6e66740000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI_ (string): https://api.beatfoundry.xyz/api/v1/nft
Arg [1] : numChordProgressions_ (uint256): 7
Arg [2] : mintPrice_ (uint256): 40000000000000000

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [2] : 000000000000000000000000000000000000000000000000008e1bc9bf040000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000026
Arg [4] : 68747470733a2f2f6170692e62656174666f756e6472792e78797a2f6170692f
Arg [5] : 76312f6e66740000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

42337:12374:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29254:355;;;;;;;;;;-1:-1:-1;29254:355:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;29254:355:0;;;;;;;;30423:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32116:308::-;;;;;;;;;;-1:-1:-1;32116:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:55:1;;;1674:74;;1662:2;1647:18;32116:308:0;1528:226:1;31639:411:0;;;;;;;;;;-1:-1:-1;31639:411:0;;;;;:::i;:::-;;:::i;:::-;;42648:26;;;;;;;;;;;;;;;;;;;2384:25:1;;;2372:2;2357:18;42648:26:0;2238:177:1;33175:376:0;;;;;;;;;;-1:-1:-1;33175:376:0;;;;;:::i;:::-;;:::i;45902:184::-;;;;;;;;;;-1:-1:-1;45902:184:0;;;;;:::i;:::-;;:::i;33622:185::-;;;;;;;;;;-1:-1:-1;33622:185:0;;;;;:::i;:::-;;:::i;44491:102::-;;;;;;;;;;-1:-1:-1;44491:102:0;;;;;:::i;:::-;;:::i;44135:98::-;;;;;;;;;;-1:-1:-1;44135:98:0;;;;;:::i;:::-;;:::i;44710:112::-;;;;;;;;;;-1:-1:-1;44710:112:0;;;;;:::i;:::-;;:::i;44830:109::-;;;;;;;;;;-1:-1:-1;44830:109:0;;;;;:::i;:::-;;:::i;54603:105::-;;;;;;;;;;;;;:::i;30030:326::-;;;;;;;;;;-1:-1:-1;30030:326:0;;;;;:::i;:::-;;:::i;51998:946::-;;;;;;:::i;:::-;;:::i;50512:1077::-;;;;;;;;;;-1:-1:-1;50512:1077:0;;;;;:::i;:::-;;:::i;42617:24::-;;;;;;;;;;;;;;;;46634:337;;;;;;;;;;-1:-1:-1;46634:337:0;;;;;:::i;:::-;;:::i;29673:295::-;;;;;;;;;;-1:-1:-1;29673:295:0;;;;;:::i;:::-;;:::i;21016:94::-;;;;;;;;;;;;;:::i;46094:342::-;;;;;;;;;;-1:-1:-1;46094:342:0;;;;;:::i;:::-;;:::i;20365:87::-;;;;;;;;;;-1:-1:-1;20438:6:0;;-1:-1:-1;;;;;20438:6:0;20365:87;;30592:104;;;;;;;;;;;;;:::i;46444:182::-;;;;;;;;;;-1:-1:-1;46444:182:0;;;;;:::i;:::-;;:::i;43385:26::-;;;;;;;;;;-1:-1:-1;43385:26:0;;;;;;;;46979:163;;;;;;;;;;-1:-1:-1;46979:163:0;;;;;:::i;:::-;;:::i;32496:327::-;;;;;;;;;;-1:-1:-1;32496:327:0;;;;;:::i;:::-;;:::i;45557:337::-;;;;;;;;;;-1:-1:-1;45557:337:0;;;;;:::i;:::-;;:::i;43642:53::-;;;;;;;;;;;;;:::i;42575:35::-;;;;;;;;;;;;;;;;33878:365;;;;;;;;;;-1:-1:-1;33878:365:0;;;;;:::i;:::-;;:::i;44241:144::-;;;;;;;;;;-1:-1:-1;44241:144:0;;;;;:::i;:::-;;:::i;45363:186::-;;;;;;;;;;-1:-1:-1;45363:186:0;;;;;:::i;:::-;;:::i;48043:2461::-;;;;;;;;;;-1:-1:-1;48043:2461:0;;;;;:::i;:::-;;:::i;47775:180::-;;;;;;;;;;-1:-1:-1;47775:180:0;;;;;:::i;:::-;;:::i;44601:101::-;;;;;;;;;;-1:-1:-1;44601:101:0;;;;;:::i;:::-;;:::i;32894:214::-;;;;;;;;;;-1:-1:-1;32894:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;33065:25:0;;;33036:4;33065:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32894:214;47441:155;;;;;;;;;;-1:-1:-1;47441:155:0;;;;;:::i;:::-;;:::i;47604:163::-;;;;;;;;;;-1:-1:-1;47604:163:0;;;;;:::i;:::-;;:::i;21265:229::-;;;;;;;;;;-1:-1:-1;21265:229:0;;;;;:::i;:::-;;:::i;44947:408::-;;;;;;;;;;-1:-1:-1;44947:408:0;;;;;:::i;:::-;;:::i;44393:90::-;;;;;;;;;;-1:-1:-1;44393:90:0;;;;;:::i;:::-;;:::i;47150:283::-;;;;;;;;;;-1:-1:-1;47150:283:0;;;;;:::i;:::-;;:::i;29254:355::-;29401:4;-1:-1:-1;;;;;;29443:40:0;;-1:-1:-1;;;29443:40:0;;:105;;-1:-1:-1;;;;;;;29500:48:0;;-1:-1:-1;;;29500:48:0;29443:105;:158;;;-1:-1:-1;;;;;;;;;;1669:40:0;;;29565:36;29423:178;29254:355;-1:-1:-1;;29254:355:0:o;30423:100::-;30477:13;30510:5;30503:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30423:100;:::o;32116:308::-;32237:7;35879:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35879:16:0;32262:110;;;;-1:-1:-1;;;32262:110:0;;10057:2:1;32262:110:0;;;10039:21:1;10096:2;10076:18;;;10069:30;10135:34;10115:18;;;10108:62;-1:-1:-1;;;10186:18:1;;;10179:42;10238:19;;32262:110:0;;;;;;;;;-1:-1:-1;32392:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32392:24:0;;32116:308::o;31639:411::-;31720:13;31736:23;31751:7;31736:14;:23::i;:::-;31720:39;;31784:5;-1:-1:-1;;;;;31778:11:0;:2;-1:-1:-1;;;;;31778:11:0;;;31770:57;;;;-1:-1:-1;;;31770:57:0;;10470:2:1;31770:57:0;;;10452:21:1;10509:2;10489:18;;;10482:30;10548:34;10528:18;;;10521:62;-1:-1:-1;;;10599:18:1;;;10592:31;10640:19;;31770:57:0;10268:397:1;31770:57:0;19296:10;-1:-1:-1;;;;;31862:21:0;;;;:62;;-1:-1:-1;31887:37:0;31904:5;19296:10;32894:214;:::i;31887:37::-;31840:168;;;;-1:-1:-1;;;31840:168:0;;10872:2:1;31840:168:0;;;10854:21:1;10911:2;10891:18;;;10884:30;10950:34;10930:18;;;10923:62;11021:26;11001:18;;;10994:54;11065:19;;31840:168:0;10670:420:1;31840:168:0;32021:21;32030:2;32034:7;32021:8;:21::i;:::-;31709:341;31639:411;;:::o;33175:376::-;33384:41;19296:10;33417:7;33384:18;:41::i;:::-;33362:140;;;;-1:-1:-1;;;33362:140:0;;;;;;;:::i;:::-;33515:28;33525:4;33531:2;33535:7;33515:9;:28::i;45902:184::-;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;46031:36:::1;::::0;;;:18:::1;:36;::::0;;;;;;:47;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;46073:4:::0;;46031:47:::1;:::i;:::-;;45902:184:::0;;;:::o;33622:185::-;33760:39;33777:4;33783:2;33787:7;33760:39;;;;;;;;;;;;:16;:39::i;44491:102::-;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;44565:20;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;;44491:102:::0;:::o;44135:98::-;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;44207:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;44710:112::-:0;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;44786:20:::1;:28:::0;44710:112::o;44830:109::-;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;44904:19:::1;:27:::0;44830:109::o;54603:105::-;54648:7;54675:25;:15;18175:14;;18083:114;54675:25;54668:32;;54603:105;:::o;30030:326::-;30147:7;30188:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30188:16:0;30237:19;30215:110;;;;-1:-1:-1;;;30215:110:0;;12076:2:1;30215:110:0;;;12058:21:1;12115:2;12095:18;;;12088:30;12154:34;12134:18;;;12127:62;-1:-1:-1;;;12205:18:1;;;12198:39;12254:19;;30215:110:0;11874:405:1;51998:946:0;52175:14;;;;52167:53;;;;-1:-1:-1;;;52167:53:0;;12486:2:1;52167:53:0;;;12468:21:1;12525:2;12505:18;;;12498:30;12564:28;12544:18;;;12537:56;12610:18;;52167:53:0;12284:350:1;52167:53:0;52252:9;;52239;:22;52231:68;;;;-1:-1:-1;;;52231:68:0;;12841:2:1;52231:68:0;;;12823:21:1;12880:2;12860:18;;;12853:30;12919:34;12899:18;;;12892:62;-1:-1:-1;;;12970:18:1;;;12963:31;13011:19;;52231:68:0;12639:397:1;52231:68:0;52310:15;52328:25;:15;18175:14;;18083:114;52328:25;52310:43;;52384:11;;52374:7;:21;52366:65;;;;-1:-1:-1;;;52366:65:0;;13243:2:1;52366:65:0;;;13225:21:1;13282:2;13262:18;;;13255:30;13321:33;13301:18;;;13294:61;13372:18;;52366:65:0;13041:355:1;52366:65:0;-1:-1:-1;;;;;;52451:15:0;;;;;;:9;:15;;;;;;;;52450:16;52442:56;;;;-1:-1:-1;;;52442:56:0;;13603:2:1;52442:56:0;;;13585:21:1;13642:2;13622:18;;;13615:30;13681:29;13661:18;;;13654:57;13728:18;;52442:56:0;13401:351:1;52442:56:0;52511:18;52542:4;;52532:15;;;;;;;:::i;:::-;;;;;;;;52511:36;;52580:163;52617:9;;52580:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52645:19:0;;52693:34;;52645:19;;-1:-1:-1;52693:34:0;;-1:-1:-1;52710:10:0;;52722:4;;52693:34;;14188:19:1;;;-1:-1:-1;;;;;;14237:35:1;14232:2;14223:12;;14216:57;14298:2;14289:12;;14033:274;52693:34:0;;;;;;;;;;;;;52683:45;;;;;;52580:18;:163::i;:::-;52558:241;;;;-1:-1:-1;;;52558:241:0;;14514:2:1;52558:241:0;;;14496:21:1;14553:2;14533:18;;;14526:30;14592;14572:18;;;14565:58;14640:18;;52558:241:0;14312:352:1;52558:241:0;52812:15;;;;:6;:15;;;;;;;;:22;;-1:-1:-1;;52812:22:0;;;;;;;;-1:-1:-1;;;;;;52845:15:0;;;;:9;:15;;;;;:22;;-1:-1:-1;;52845:22:0;-1:-1:-1;52845:22:0;;;52880:18;52886:2;52812:15;52880:5;:18::i;:::-;52909:27;:15;18294:19;;18312:1;18294:19;;;18205:127;52909:27;52156:788;;51998:946;;;;;;:::o;50512:1077::-;35855:4;35879:16;;;:7;:16;;;;;;50610:13;;-1:-1:-1;;;;;35879:16:0;50641:56;;;;-1:-1:-1;;;50641:56:0;;14871:2:1;50641:56:0;;;14853:21:1;14910:2;14890:18;;;14883:30;14949:29;14929:18;;;14922:57;14996:18;;50641:56:0;14669:351:1;50641:56:0;50708:11;50722:15;;;:6;:15;;;;;;;;;50769:48;50778:6;50708:11;50722:15;50708:11;50791:7;50778:22;;;;;;;;;;;-1:-1:-1;50778:22:0;50807:4;50812:1;50807:7;50778:38;;50807:7;;;;50778:38;;;;;;:::i;:::-;;;;;;;;50769:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:48::i;:::-;50828:16;50894:7;;;50870:33;;:17;:33;;;;;50748:69;;-1:-1:-1;50828:16:0;50847:83;;50894:4;50915:1;50910:7;;50847:83;50941:16;51008:7;;;50983:34;;:18;:34;;;;;50828:102;;-1:-1:-1;50941:16:0;50960:84;;51008:4;51029:1;51024:7;;50960:84;51055:16;51121:7;;;51097:33;;:17;:33;;;;;50941:103;;-1:-1:-1;51055:16:0;51074:83;;51121:4;51142:1;51137:7;;51074:83;51055:102;-1:-1:-1;51168:17:0;51188:31;51197:5;51168:17;51209:4;51168:17;51209:7;;51197:21;;;;;;;;;;;-1:-1:-1;51197:21:0;51188:31;;;;;:::i;:::-;51168:51;-1:-1:-1;51230:19:0;51252:33;51261:7;51230:19;51275:4;51230:19;51275:7;;51252:33;51230:55;-1:-1:-1;51298:16:0;51344:26;51352:1;51361:4;51298:16;51361:7;;51344;:26::i;:::-;51385:3;51403;51421;51439:5;51459:4;51478:6;51317:178;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51298:197;;51508:20;51538:18;51552:3;51538:13;:18::i;:::-;51508:49;50512:1077;-1:-1:-1;;;;;;;;;;;50512:1077:0:o;46634:337::-;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;46804:59:::1;::::0;;;:17:::1;:59;::::0;;;;46864:42;;:46:::1;::::0;46909:1:::1;::::0;46864:46:::1;:::i;:::-;46804:107;;;;;;;;:::i;:::-;;;;;;;;46759:17;:35;46777:16;46759:35;;;;;;;;;;;46795:5;46759:42;;;;;;;;:::i;:::-;;;;;;;;:152;;;;;;:::i;:::-;;;;;;:::i;:::-;-1:-1:-1::0;46922:35:0::1;::::0;;;:17:::1;:35;::::0;;;;:41;;;::::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;46634:337:::0;;:::o;29673:295::-;29790:7;-1:-1:-1;;;;;29837:19:0;;29815:111;;;;-1:-1:-1;;;29815:111:0;;17382:2:1;29815:111:0;;;17364:21:1;17421:2;17401:18;;;17394:30;17460:34;17440:18;;;17433:62;-1:-1:-1;;;17511:18:1;;;17504:40;17561:19;;29815:111:0;17180:406:1;29815:111:0;-1:-1:-1;;;;;;29944:16:0;;;;;:9;:16;;;;;;;29673:295::o;21016:94::-;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;21081:21:::1;21099:1;21081:9;:21::i;:::-;21016:94::o:0;46094:342::-;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;46266:60:::1;::::0;;;:18:::1;:60;::::0;;;;46327:43;;:47:::1;::::0;46373:1:::1;::::0;46327:47:::1;:::i;:::-;46266:109;;;;;;;;:::i;:::-;;;;;;;;46220:18;:36;46239:16;46220:36;;;;;;;;;;;46257:5;46220:43;;;;;;;;:::i;:::-;;;;;;;;:155;;;;;;:::i;:::-;;;;;;:::i;:::-;-1:-1:-1::0;46386:36:0::1;::::0;;;:18:::1;:36;::::0;;;;:42;;;::::1;;;;:::i;30592:104::-:0;30648:13;30681:7;30674:14;;;;;:::i;46444:182::-;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;46572:35:::1;::::0;;;:17:::1;:35;::::0;;;;;;:46;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;46613:4:::0;;46572:46:::1;:::i;46979:163::-:0;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;47098:24:::1;::::0;;;:6:::1;:24;::::0;;;;;;:36;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;47128:5:::0;;47098:36:::1;:::i;32496:327::-:0;-1:-1:-1;;;;;32631:24:0;;19296:10;32631:24;;32623:62;;;;-1:-1:-1;;;32623:62:0;;17793:2:1;32623:62:0;;;17775:21:1;17832:2;17812:18;;;17805:30;17871:27;17851:18;;;17844:55;17916:18;;32623:62:0;17591:349:1;32623:62:0;19296:10;32698:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;32698:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;32698:53:0;;;;;;;;;;32767:48;;540:41:1;;;32698:42:0;;19296:10;32767:48;;513:18:1;32767:48:0;;;;;;;32496:327;;:::o;45557:337::-;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;45727:59:::1;::::0;;;:17:::1;:59;::::0;;;;45787:42;;:46:::1;::::0;45832:1:::1;::::0;45787:46:::1;:::i;:::-;45727:107;;;;;;;;:::i;:::-;;;;;;;;45682:17;:35;45700:16;45682:35;;;;;;;;;;;45718:5;45682:42;;;;;;;;:::i;:::-;;;;;;;;:152;;;;;;:::i;:::-;;;;;;:::i;:::-;-1:-1:-1::0;45845:35:0::1;::::0;;;:17:::1;:35;::::0;;;;:41;;;::::1;;;;:::i;43642:53::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33878:365::-;34067:41;19296:10;34100:7;34067:18;:41::i;:::-;34045:140;;;;-1:-1:-1;;;34045:140:0;;;;;;;:::i;:::-;34196:39;34210:4;34216:2;34220:7;34229:5;34196:13;:39::i;44241:144::-;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;44324:14:::1;:22:::0;;-1:-1:-1;;44324:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;44357:11:::1;:20:::0;44241:144::o;45363:186::-;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;45493:35:::1;::::0;;;:17:::1;:35;::::0;;;;;;:48;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;45534:6:::0;;45493:48:::1;:::i;48043:2461::-:0;35855:4;35879:16;;;:7;:16;;;;;;48161:13;;-1:-1:-1;;;;;35879:16:0;48192:56;;;;-1:-1:-1;;;48192:56:0;;14871:2:1;48192:56:0;;;14853:21:1;14910:2;14890:18;;;14883:30;14949:29;14929:18;;;14922:57;14996:18;;48192:56:0;14669:351:1;48192:56:0;48259:11;48273:15;;;:6;:15;;;;;;;;;48321:515;48380:26;48388:1;48273:15;48259:11;48397:7;;48380:26;48434:33;48458:7;;;48434:33;;:17;:33;;;;;48425:59;;48458:4;48479:1;48474:7;;48425:59;48512:34;48537:7;;;48512:34;;:18;:34;;;;;48503:60;;48537:4;48558:1;48553:7;;48503:60;48591:33;48615:7;;;48591:33;;:17;:33;;;;;48582:59;;48615:4;48636:1;48631:7;;48582:59;48669:22;48682:7;;;48669:22;;:6;:22;;;;;48660:48;;48682:4;48703:1;48698:7;;48660:48;48727:31;48736:5;:21;48748:4;48736:21;48748:7;;48727:31;48777:33;48786:7;:23;48800:4;48786:23;48800:7;;48777:33;48349:476;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48321:13;:515::i;:::-;48301:535;;48849:17;48936:18;:7;:16;:18::i;:::-;49158:7;49204:35;49212:12;;;;49204:33;:35::i;:::-;49292:7;48869:441;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48849:461;;49359:4;49406:35;49421:4;49414:12;;49406:21;;:33;:35::i;:::-;49509:3;49650:38;49664:4;49669:1;49664:7;49658:18;;49664:7;;49675:1;49658:18;:::i;:::-;49650:27;;:36;:38::i;:::-;49765;49779:4;49784:1;49779:7;;49765:38;49328:549;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;49328:549:0;;;;;;;;;;-1:-1:-1;49328:549:0;49945:38;49959:4;49964:1;49959:7;;49945:38;50060;50074:4;50079:1;50074:7;;50060:38;50168;50182:4;50187:1;50182:7;;50168:38;50256:8;49895:399;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49888:406;;50443:19;50457:4;50443:13;:19::i;:::-;50350:131;;;;;;;;:::i;:::-;;;;;;;;;;;;;50305:191;;;;;48043:2461;;;:::o;47775:180::-;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;47900:32:::1;::::0;;;:14:::1;:32;::::0;;;;;:47;;-1:-1:-1;;47900:47:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;47775:180::o;44601:101::-;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;44671:15:::1;:23:::0;44601:101::o;47441:155::-;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;47558:23:::1;::::0;;;:5:::1;:23;::::0;;;;:30:::1;::::0;47584:4;;47558:30:::1;:::i;47604:163::-:0;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;47725:25:::1;::::0;;;:7:::1;:25;::::0;;;;:34:::1;::::0;47753:6;;47725:34:::1;:::i;21265:229::-:0;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21368:22:0;::::1;21346:110;;;::::0;-1:-1:-1;;;21346:110:0;;26047:2:1;21346:110:0::1;::::0;::::1;26029:21:1::0;26086:2;26066:18;;;26059:30;26125:34;26105:18;;;26098:62;-1:-1:-1;;;26176:18:1;;;26169:36;26222:19;;21346:110:0::1;25845:402:1::0;21346:110:0::1;21467:19;21477:8;21467:9;:19::i;:::-;21265:229:::0;:::o;44947:408::-;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;45076:6:::1;45051:21;:31;;45029:123;;;::::0;-1:-1:-1;;;45029:123:0;;26454:2:1;45029:123:0::1;::::0;::::1;26436:21:1::0;26493:2;26473:18;;;26466:30;26532:34;26512:18;;;26505:62;-1:-1:-1;;;26583:18:1;;;26576:40;26633:19;;45029:123:0::1;26252:406:1::0;45029:123:0::1;45167:11:::0;45163:74:::1;;-1:-1:-1::0;45204:21:0::1;45163:74;-1:-1:-1::0;;;;;45251:16:0;::::1;45247:70;;20438:6:::0;;-1:-1:-1;;;;;20438:6:0;45284:21:::1;;45247:70;45327:20;-1:-1:-1::0;;;;;45327:12:0;::::1;45340:6:::0;45327:12:::1;:20::i;44393:90::-:0;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;44458:9:::1;:17:::0;44393:90::o;47150:283::-;20438:6;;-1:-1:-1;;;;;20438:6:0;19296:10;20585:23;20577:68;;;;-1:-1:-1;;;20577:68:0;;;;;;;:::i;:::-;47299:24:::1;::::0;;;:6:::1;:24;::::0;;;;47338:31;;:35:::1;::::0;47372:1:::1;::::0;47338:35:::1;:::i;:::-;47299:85;;;;;;;;:::i;:::-;;;;;;;;47265:6;:24;47272:16;47265:24;;;;;;;;;;;47290:5;47265:31;;;;;;;;:::i;:::-;;;;;;;;:119;;;;;;:::i;:::-;;;;;;:::i;:::-;-1:-1:-1::0;47395:24:0::1;::::0;;;:6:::1;:24;::::0;;;;:30;;;::::1;;;;:::i;39913:174::-:0;39988:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;39988:29:0;-1:-1:-1;;;;;39988:29:0;;;;;;;;:24;;40042:23;39988:24;40042:14;:23::i;:::-;-1:-1:-1;;;;;40033:46:0;;;;;;;;;;;39913:174;;:::o;36084:452::-;36213:4;35879:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35879:16:0;36235:110;;;;-1:-1:-1;;;36235:110:0;;26865:2:1;36235:110:0;;;26847:21:1;26904:2;26884:18;;;26877:30;26943:34;26923:18;;;26916:62;-1:-1:-1;;;26994:18:1;;;26987:42;27046:19;;36235:110:0;26663:408:1;36235:110:0;36356:13;36372:23;36387:7;36372:14;:23::i;:::-;36356:39;;36425:5;-1:-1:-1;;;;;36414:16:0;:7;-1:-1:-1;;;;;36414:16:0;;:64;;;;36471:7;-1:-1:-1;;;;;36447:31:0;:20;36459:7;36447:11;:20::i;:::-;-1:-1:-1;;;;;36447:31:0;;36414:64;:113;;;-1:-1:-1;;;;;;33065:25:0;;;33036:4;33065:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;36495:32;36406:122;36084:452;-1:-1:-1;;;;36084:452:0:o;39180:615::-;39353:4;-1:-1:-1;;;;;39326:31:0;:23;39341:7;39326:14;:23::i;:::-;-1:-1:-1;;;;;39326:31:0;;39304:122;;;;-1:-1:-1;;;39304:122:0;;27278:2:1;39304:122:0;;;27260:21:1;27317:2;27297:18;;;27290:30;27356:34;27336:18;;;27329:62;-1:-1:-1;;;27407:18:1;;;27400:39;27456:19;;39304:122:0;27076:405:1;39304:122:0;-1:-1:-1;;;;;39445:16:0;;39437:65;;;;-1:-1:-1;;;39437:65:0;;27688:2:1;39437:65:0;;;27670:21:1;27727:2;27707:18;;;27700:30;27766:34;27746:18;;;27739:62;-1:-1:-1;;;27817:18:1;;;27810:34;27861:19;;39437:65:0;27486:400:1;39437:65:0;39619:29;39636:1;39640:7;39619:8;:29::i;:::-;-1:-1:-1;;;;;39661:15:0;;;;;;:9;:15;;;;;:20;;39680:1;;39661:15;:20;;39680:1;;39661:20;:::i;:::-;;;;-1:-1:-1;;;;;;;39692:13:0;;;;;;:9;:13;;;;;:18;;39709:1;;39692:13;:18;;39709:1;;39692:18;:::i;:::-;;;;-1:-1:-1;;39721:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;39721:21:0;-1:-1:-1;;;;;39721:21:0;;;;;;;;;39760:27;;39721:16;;39760:27;;;;;;;39180:615;;;:::o;5939:910::-;6064:4;6104;6064;6121:605;6145:5;:12;6141:1;:16;6121:605;;;6179:20;6202:5;6208:1;6202:8;;;;;;;;:::i;:::-;;;;;;;6179:31;;6247:12;6231;:28;6227:488;;6406:44;;;;;;28181:19:1;;;28216:12;;;28209:28;;;28253:12;;6406:44:0;;;;;;;;;;;;6374:95;;;;;;6359:110;;6227:488;;;6636:44;;;;;;28181:19:1;;;28216:12;;;28209:28;;;28253:12;;6636:44:0;;;;;;;;;;;;6604:95;;;;;;6589:110;;6227:488;-1:-1:-1;6159:3:0;;;;:::i;:::-;;;;6121:605;;;-1:-1:-1;6821:20:0;;;;5939:910;-1:-1:-1;;;5939:910:0:o;37872:382::-;-1:-1:-1;;;;;37952:16:0;;37944:61;;;;-1:-1:-1;;;37944:61:0;;28618:2:1;37944:61:0;;;28600:21:1;;;28637:18;;;28630:30;28696:34;28676:18;;;28669:62;28748:18;;37944:61:0;28416:356:1;37944:61:0;35855:4;35879:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35879:16:0;:30;38016:58;;;;-1:-1:-1;;;38016:58:0;;28979:2:1;38016:58:0;;;28961:21:1;29018:2;28998:18;;;28991:30;29057;29037:18;;;29030:58;29105:18;;38016:58:0;28777:352:1;38016:58:0;-1:-1:-1;;;;;38145:13:0;;;;;;:9;:13;;;;;:18;;38162:1;;38145:13;:18;;38162:1;;38145:18;:::i;:::-;;;;-1:-1:-1;;38174:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38174:21:0;-1:-1:-1;;;;;38174:21:0;;;;;;;;38213:33;;38174:16;;;38213:33;;38174:16;;38213:33;37872:382;;:::o;53983:534::-;54086:12;;;54096:1;54086:12;;;;;;;;;54043;;54068:15;;54086:12;;;;;;;;;;;-1:-1:-1;54086:12:0;54068:30;;54124:4;54117:12;;54109:2;54112:1;54109:5;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;54109:20:0;;;;;;;;;54155:4;54148:12;;54140:2;54143:1;54140:5;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;54140:20:0;;;;;;;;;54186:4;54179:12;;54171:2;54174:1;54171:5;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;54171:20:0;;;;;;;;;54217:4;54210:12;;54202:2;54205:1;54202:5;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;54202:20:0;;;;;;;;;54233;54273:4;:11;54256:29;;;;;;29263:19:1;;29307:2;29298:12;;29134:182;54256:29:0;;;;;;;;;;;;;54233:52;;54304:7;54329:1;54312:7;:14;:18;;;;:::i;:::-;54304:27;;;;;;;;:::i;:::-;;;;;;;;;54296:2;54299:1;54296:5;;;;;;;;:::i;:::-;;;;:35;-1:-1:-1;;;;;54296:35:0;;;;;;;;;54350:7;54375:1;54358:7;:14;:18;;;;:::i;:::-;54350:27;;;;;;;;:::i;:::-;;;;;;;;;54342:2;54345:1;54342:5;;;;;;;;:::i;:::-;;;;:35;-1:-1:-1;;;;;54342:35:0;;;;;;;;;54396:7;54421:1;54404:7;:14;:18;;;;:::i;:::-;54396:27;;;;;;;;:::i;:::-;;;;;;;;;54388:2;54391:1;54388:5;;;;;;;;:::i;:::-;;;;:35;-1:-1:-1;;;;;54388:35:0;;;;;;;;;54442:7;54467:1;54450:7;:14;:18;;;;:::i;:::-;54442:27;;;;;;;;:::i;:::-;;;;;;;;;54434:2;54437:1;54434:5;;;;;;;;:::i;:::-;;;;:35;-1:-1:-1;;;;;54434:35:0;;;;;;;;;54500:2;54504:4;54487:22;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54480:29;;;;53983:534;;;:::o;53029:946::-;53189:32;;;53167:19;53189:32;;;:14;:32;;;;;;53137:12;;53189:32;;;;;53236:20;;53232:92;;-1:-1:-1;;;;53232:92:0;53354:13;;;53364:2;53354:13;;;;;;;;;53334:17;;53354:13;;;;;;;;;;-1:-1:-1;53354:13:0;53334:33;;53395:4;53388:12;;53378:4;53383:1;53378:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;53378:22:0;;;;;;;;;53428:4;53421:12;;53411:4;53416:1;53411:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;53411:22:0;;;;;;;;;53461:4;53454:12;;53444:4;53449:1;53444:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;53444:22:0;;;;;;;;;53494:4;53487:12;;53477:4;53482:1;53477:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;53477:22:0;;;;;;;;;53527:4;53520:12;;53510:4;53515:1;53510:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;53510:22:0;;;;;;;;;53560:4;53553:12;;53543:4;53548:1;53543:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;53543:22:0;;;;;;;;;53593:4;53586:12;;53576:4;53581:1;53576:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;53576:22:0;;;;;;;;;53626:4;53619:12;;53609:4;53614:1;53609:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;53609:22:0;;;;;;;;;53659:4;53652:12;;53642:4;53647:1;53642:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;53642:22:0;;;;;;;;;53679:9;:14;;53692:1;53679:14;53675:124;;;53727:4;53720:12;;53710:4;53715:1;53710:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;53710:22:0;;;;;;;;;53675:124;;;53782:4;53775:12;;53765:4;53770:1;53765:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;53765:22:0;;;;;;;;;53675:124;53827:4;53820:12;;53809:4;53814:2;53809:8;;;;;;;;:::i;:::-;;;;:23;-1:-1:-1;;;;;53809:23:0;;;;;;;;;53861:9;53854:17;;53843:4;53848:2;53843:8;;;;;;;;:::i;:::-;;;;:28;-1:-1:-1;;;;;53843:28:0;;;;;;;;-1:-1:-1;53893:12:0;53906:1;53893:15;;;53882:4;53887:2;53882:8;;;;;;;;:::i;:::-;;;;:26;-1:-1:-1;;;;;53882:26:0;;;;;;;;-1:-1:-1;53930:12:0;53943:1;53930:15;;;53919:4;53924:2;53919:8;;;;;;;;:::i;:::-;;;;:26;-1:-1:-1;;;;;53919:26:0;;;;;;;;-1:-1:-1;53963:4:0;53029:946;-1:-1:-1;;;;53029:946:0:o;2061:1790::-;2159:11;;2119:13;;2185:8;2181:23;;-1:-1:-1;;2195:9:0;;;;;;;;;-1:-1:-1;2195:9:0;;;2061:1790;-1:-1:-1;2061:1790:0:o;2181:23::-;2256:18;2294:1;2283:7;:3;2289:1;2283:7;:::i;:::-;2282:13;;;;:::i;:::-;2277:19;;:1;:19;:::i;:::-;2256:40;-1:-1:-1;2354:19:0;2386:15;2256:40;2399:2;2386:15;:::i;:::-;2376:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2376:26:0;;2354:48;;2415:18;2436:5;;;;;;;;;;;;;;;;;2415:26;;2505:1;2498:5;2494:13;2550:2;2542:6;2538:15;2601:1;2569:960;2624:3;2621:1;2618:10;2569:960;;;2679:1;2722:12;;;;;2716:19;2817:4;2805:2;2801:14;;;;;2783:40;;2777:47;2969:2;2965:14;;;2961:25;;2947:40;;2941:47;3159:1;3155:13;;;3151:24;;3137:39;;3131:46;3340:16;;;;3326:31;;3320:38;2853:1;2849:11;;;2990:4;2937:58;;;2885:129;3039:11;;3127:57;;;3075:128;;;;3228:11;;3316:49;;3264:120;3413:3;3409:13;3442:22;;3512:1;3497:17;;;;2672:9;2569:960;;;2573:44;3561:1;3556:3;3552:11;3582:1;3577:84;;;;3680:1;3675:82;;;;3545:212;;3577:84;-1:-1:-1;;;;;3610:17:0;;3603:43;3577:84;;3675:82;-1:-1:-1;;;;;3708:17:0;;3701:41;3545:212;-1:-1:-1;;;3773:26:0;;;3780:6;2061:1790;-1:-1:-1;;;;2061:1790:0:o;21502:173::-;21577:6;;;-1:-1:-1;;;;;21594:17:0;;;-1:-1:-1;;;;;;21594:17:0;;;;;;;21627:40;;21577:6;;;21594:17;21577:6;;21627:40;;21558:16;;21627:40;21547:128;21502:173;:::o;35125:352::-;35282:28;35292:4;35298:2;35302:7;35282:9;:28::i;:::-;35343:48;35366:4;35372:2;35376:7;35385:5;35343:22;:48::i;:::-;35321:148;;;;-1:-1:-1;;;35321:148:0;;;;;;;:::i;15561:723::-;15617:13;15838:10;15834:53;;-1:-1:-1;;15865:10:0;;;;;;;;;;;;-1:-1:-1;;;15865:10:0;;;;;15561:723::o;15834:53::-;15912:5;15897:12;15953:78;15960:9;;15953:78;;15986:8;;;;:::i;:::-;;-1:-1:-1;16009:10:0;;-1:-1:-1;16017:2:0;16009:10;;:::i;:::-;;;15953:78;;;16041:19;16073:6;16063:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16063:17:0;;16041:39;;16091:154;16098:10;;16091:154;;16125:11;16135:1;16125:11;;:::i;:::-;;-1:-1:-1;16194:10:0;16202:2;16194:5;:10;:::i;:::-;16181:24;;:2;:24;:::i;:::-;16168:39;;16151:6;16158;16151:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;16151:56:0;;;;;;;;-1:-1:-1;16222:11:0;16231:2;16222:11;;:::i;:::-;;;16091:154;;16394:340;16453:13;16483:10;16479:56;;-1:-1:-1;;16510:13:0;;;;;;;;;;;;-1:-1:-1;;;16510:13:0;;;;;16394:340::o;16479:56::-;16560:5;16545:12;16605:78;16612:9;;16605:78;;16638:8;;;;:::i;:::-;;;;16670:1;16661:10;;;;;16605:78;;;16700:26;16712:5;16719:6;16700:11;:26::i;8859:391::-;8988:6;8963:21;:31;;8941:110;;;;-1:-1:-1;;;8941:110:0;;30960:2:1;8941:110:0;;;30942:21:1;30999:2;30979:18;;;30972:30;31038:31;31018:18;;;31011:59;31087:18;;8941:110:0;30758:353:1;8941:110:0;9065:12;9083:9;-1:-1:-1;;;;;9083:14:0;9105:6;9083:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9064:52;;;9149:7;9127:115;;;;-1:-1:-1;;;9127:115:0;;31528:2:1;9127:115:0;;;31510:21:1;31567:2;31547:18;;;31540:30;31606:34;31586:18;;;31579:62;31677:28;31657:18;;;31650:56;31723:19;;9127:115:0;31326:422:1;40652:980:0;40807:4;-1:-1:-1;;;;;40828:13:0;;7860:20;7908:8;40824:801;;40881:175;;-1:-1:-1;;;40881:175:0;;-1:-1:-1;;;;;40881:36:0;;;;;:175;;19296:10;;40975:4;;41002:7;;41032:5;;40881:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40881:175:0;;;;;;;;-1:-1:-1;;40881:175:0;;;;;;;;;;;;:::i;:::-;;;40860:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41239:13:0;;41235:320;;41282:108;;-1:-1:-1;;;41282:108:0;;;;;;;:::i;41235:320::-;41505:6;41499:13;41490:6;41486:2;41482:15;41475:38;40860:710;-1:-1:-1;;;;;;41120:51:0;-1:-1:-1;;;41120:51:0;;-1:-1:-1;41113:58:0;;40824:801;-1:-1:-1;41609:4:0;40652:980;;;;;;:::o;16862:483::-;16964:13;16995:19;17027:10;17031:6;17027:1;:10;:::i;:::-;:14;;17040:1;17027:14;:::i;:::-;17017:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17017:25:0;;16995:47;;-1:-1:-1;;;17053:6:0;17060:1;17053:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;17053:15:0;;;;;;;;;-1:-1:-1;;;17079:6:0;17086:1;17079:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;17079:15:0;;;;;;;;-1:-1:-1;17110:9:0;17122:10;17126:6;17122:1;:10;:::i;:::-;:14;;17135:1;17122:14;:::i;:::-;17110:26;;17105:135;17142:1;17138;:5;17105:135;;;-1:-1:-1;;;17190:5:0;17198:3;17190:11;17177:25;;;;;;;:::i;:::-;;;;17165:6;17172:1;17165:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;17165:37:0;;;;;;;;-1:-1:-1;17227:1:0;17217:11;;;;;17145:3;;;:::i;:::-;;;17105:135;;;-1:-1:-1;17258:10:0;;17250:55;;;;-1:-1:-1;;;17250:55:0;;32867:2:1;17250:55:0;;;32849:21:1;;;32886:18;;;32879:30;32945:34;32925:18;;;32918:62;32997:18;;17250:55:0;32665:356:1;17250:55:0;17330:6;16862:483;-1:-1:-1;;;16862:483:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1759:154::-;-1:-1:-1;;;;;1838:5:1;1834:54;1827:5;1824:65;1814:93;;1903:1;1900;1893:12;1918:315;1986:6;1994;2047:2;2035:9;2026:7;2022:23;2018:32;2015:52;;;2063:1;2060;2053:12;2015:52;2102:9;2089:23;2121:31;2146:5;2121:31;:::i;:::-;2171:5;2223:2;2208:18;;;;2195:32;;-1:-1:-1;;;1918:315:1:o;2420:456::-;2497:6;2505;2513;2566:2;2554:9;2545:7;2541:23;2537:32;2534:52;;;2582:1;2579;2572:12;2534:52;2621:9;2608:23;2640:31;2665:5;2640:31;:::i;:::-;2690:5;-1:-1:-1;2747:2:1;2732:18;;2719:32;2760:33;2719:32;2760:33;:::i;:::-;2420:456;;2812:7;;-1:-1:-1;;;2866:2:1;2851:18;;;;2838:32;;2420:456::o;2881:347::-;2932:8;2942:6;2996:3;2989:4;2981:6;2977:17;2973:27;2963:55;;3014:1;3011;3004:12;2963:55;-1:-1:-1;3037:20:1;;3080:18;3069:30;;3066:50;;;3112:1;3109;3102:12;3066:50;3149:4;3141:6;3137:17;3125:29;;3201:3;3194:4;3185:6;3177;3173:19;3169:30;3166:39;3163:59;;;3218:1;3215;3208:12;3163:59;2881:347;;;;;:::o;3233:477::-;3312:6;3320;3328;3381:2;3369:9;3360:7;3356:23;3352:32;3349:52;;;3397:1;3394;3387:12;3349:52;3433:9;3420:23;3410:33;;3494:2;3483:9;3479:18;3466:32;3521:18;3513:6;3510:30;3507:50;;;3553:1;3550;3543:12;3507:50;3592:58;3642:7;3633:6;3622:9;3618:22;3592:58;:::i;:::-;3233:477;;3669:8;;-1:-1:-1;3566:84:1;;-1:-1:-1;;;;3233:477:1:o;3715:127::-;3776:10;3771:3;3767:20;3764:1;3757:31;3807:4;3804:1;3797:15;3831:4;3828:1;3821:15;3847:632;3912:5;3942:18;3983:2;3975:6;3972:14;3969:40;;;3989:18;;:::i;:::-;4064:2;4058:9;4032:2;4118:15;;-1:-1:-1;;4114:24:1;;;4140:2;4110:33;4106:42;4094:55;;;4164:18;;;4184:22;;;4161:46;4158:72;;;4210:18;;:::i;:::-;4250:10;4246:2;4239:22;4279:6;4270:15;;4309:6;4301;4294:22;4349:3;4340:6;4335:3;4331:16;4328:25;4325:45;;;4366:1;4363;4356:12;4325:45;4416:6;4411:3;4404:4;4396:6;4392:17;4379:44;4471:1;4464:4;4455:6;4447;4443:19;4439:30;4432:41;;;;3847:632;;;;;:::o;4484:451::-;4553:6;4606:2;4594:9;4585:7;4581:23;4577:32;4574:52;;;4622:1;4619;4612:12;4574:52;4662:9;4649:23;4695:18;4687:6;4684:30;4681:50;;;4727:1;4724;4717:12;4681:50;4750:22;;4803:4;4795:13;;4791:27;-1:-1:-1;4781:55:1;;4832:1;4829;4822:12;4781:55;4855:74;4921:7;4916:2;4903:16;4898:2;4894;4890:11;4855:74;:::i;5125:1222::-;5248:6;5256;5264;5272;5280;5288;5341:3;5329:9;5320:7;5316:23;5312:33;5309:53;;;5358:1;5355;5348:12;5309:53;5397:9;5384:23;5416:31;5441:5;5416:31;:::i;:::-;5466:5;-1:-1:-1;5523:2:1;5508:18;;5495:32;-1:-1:-1;;;;;;5558:36:1;;5546:49;;5536:77;;5609:1;5606;5599:12;5536:77;5632:7;-1:-1:-1;5690:2:1;5675:18;;5662:32;5713:18;5743:14;;;5740:34;;;5770:1;5767;5760:12;5740:34;5809:58;5859:7;5850:6;5839:9;5835:22;5809:58;:::i;:::-;5886:8;;-1:-1:-1;5783:84:1;-1:-1:-1;5974:2:1;5959:18;;5946:32;;-1:-1:-1;5990:16:1;;;5987:36;;;6019:1;6016;6009:12;5987:36;6057:8;6046:9;6042:24;6032:34;;6104:7;6097:4;6093:2;6089:13;6085:27;6075:55;;6126:1;6123;6116:12;6075:55;6166:2;6153:16;6192:2;6184:6;6181:14;6178:34;;;6208:1;6205;6198:12;6178:34;6261:7;6256:2;6246:6;6243:1;6239:14;6235:2;6231:23;6227:32;6224:45;6221:65;;;6282:1;6279;6272:12;6221:65;6313:2;6309;6305:11;6295:21;;6335:6;6325:16;;;;;5125:1222;;;;;;;;:::o;6352:248::-;6420:6;6428;6481:2;6469:9;6460:7;6456:23;6452:32;6449:52;;;6497:1;6494;6487:12;6449:52;-1:-1:-1;;6520:23:1;;;6590:2;6575:18;;;6562:32;;-1:-1:-1;6352:248:1:o;6605:247::-;6664:6;6717:2;6705:9;6696:7;6692:23;6688:32;6685:52;;;6733:1;6730;6723:12;6685:52;6772:9;6759:23;6791:31;6816:5;6791:31;:::i;6857:160::-;6922:20;;6978:13;;6971:21;6961:32;;6951:60;;7007:1;7004;6997:12;6951:60;6857:160;;;:::o;7022:315::-;7087:6;7095;7148:2;7136:9;7127:7;7123:23;7119:32;7116:52;;;7164:1;7161;7154:12;7116:52;7203:9;7190:23;7222:31;7247:5;7222:31;:::i;:::-;7272:5;-1:-1:-1;7296:35:1;7327:2;7312:18;;7296:35;:::i;:::-;7286:45;;7022:315;;;;;:::o;7342:795::-;7437:6;7445;7453;7461;7514:3;7502:9;7493:7;7489:23;7485:33;7482:53;;;7531:1;7528;7521:12;7482:53;7570:9;7557:23;7589:31;7614:5;7589:31;:::i;:::-;7639:5;-1:-1:-1;7696:2:1;7681:18;;7668:32;7709:33;7668:32;7709:33;:::i;:::-;7761:7;-1:-1:-1;7815:2:1;7800:18;;7787:32;;-1:-1:-1;7870:2:1;7855:18;;7842:32;7897:18;7886:30;;7883:50;;;7929:1;7926;7919:12;7883:50;7952:22;;8005:4;7997:13;;7993:27;-1:-1:-1;7983:55:1;;8034:1;8031;8024:12;7983:55;8057:74;8123:7;8118:2;8105:16;8100:2;8096;8092:11;8057:74;:::i;:::-;8047:84;;;7342:795;;;;;;;:::o;8142:248::-;8207:6;8215;8268:2;8256:9;8247:7;8243:23;8239:32;8236:52;;;8284:1;8281;8274:12;8236:52;8307:26;8323:9;8307:26;:::i;8395:349::-;8462:6;8470;8523:2;8511:9;8502:7;8498:23;8494:32;8491:52;;;8539:1;8536;8529:12;8491:52;8562:23;;;-1:-1:-1;8635:2:1;8620:18;;8607:32;-1:-1:-1;;;;;;8668:27:1;;8658:38;;8648:66;;8710:1;8707;8700:12;8648:66;8733:5;8723:15;;;8395:349;;;;;:::o;8749:388::-;8817:6;8825;8878:2;8866:9;8857:7;8853:23;8849:32;8846:52;;;8894:1;8891;8884:12;8846:52;8933:9;8920:23;8952:31;8977:5;8952:31;:::i;:::-;9002:5;-1:-1:-1;9059:2:1;9044:18;;9031:32;9072:33;9031:32;9072:33;:::i;9470:380::-;9549:1;9545:12;;;;9592;;;9613:61;;9667:4;9659:6;9655:17;9645:27;;9613:61;9720:2;9712:6;9709:14;9689:18;9686:38;9683:161;;;9766:10;9761:3;9757:20;9754:1;9747:31;9801:4;9798:1;9791:15;9829:4;9826:1;9819:15;9683:161;;9470:380;;;:::o;11095:413::-;11297:2;11279:21;;;11336:2;11316:18;;;11309:30;11375:34;11370:2;11355:18;;11348:62;-1:-1:-1;;;11441:2:1;11426:18;;11419:47;11498:3;11483:19;;11095:413::o;11513:356::-;11715:2;11697:21;;;11734:18;;;11727:30;11793:34;11788:2;11773:18;;11766:62;11860:2;11845:18;;11513:356::o;13757:271::-;13940:6;13932;13927:3;13914:33;13896:3;13966:16;;13991:13;;;13966:16;13757:271;-1:-1:-1;13757:271:1:o;15025:127::-;15086:10;15081:3;15077:20;15074:1;15067:31;15117:4;15114:1;15107:15;15141:4;15138:1;15131:15;15157:184;15198:3;15236:5;15230:12;15251:52;15296:6;15291:3;15284:4;15277:5;15273:16;15251:52;:::i;:::-;15319:16;;;;;15157:184;-1:-1:-1;;15157:184:1:o;15346:1435::-;15751:3;15789:6;15783:13;15815:4;15828:51;15872:6;15867:3;15862:2;15854:6;15850:15;15828:51;:::i;:::-;15942:13;;15901:16;;;;15964:55;15942:13;15901:16;15986:15;;;15964:55;:::i;:::-;16086:13;;16041:20;;;16108:55;16086:13;16041:20;16130:15;;;16108:55;:::i;:::-;16230:13;;16185:20;;;16252:55;16230:13;16185:20;16274:15;;;16252:55;:::i;:::-;16374:13;;16329:20;;;16396:55;16374:13;16329:20;16418:15;;;16396:55;:::i;:::-;16518:13;;16473:20;;;16540:55;16518:13;16473:20;16562:15;;;16540:55;:::i;:::-;16662:13;;16617:20;;;16684:55;16662:13;16617:20;16706:15;;;16684:55;:::i;:::-;16755:20;;;;;15346:1435;-1:-1:-1;;;;;;;;;;15346:1435:1:o;16786:127::-;16847:10;16842:3;16838:20;16835:1;16828:31;16878:4;16875:1;16868:15;16902:4;16899:1;16892:15;16918:125;16958:4;16986:1;16983;16980:8;16977:34;;;16991:18;;:::i;:::-;-1:-1:-1;17028:9:1;;16918:125::o;17048:127::-;17109:10;17104:3;17100:20;17097:1;17090:31;17140:4;17137:1;17130:15;17164:4;17161:1;17154:15;18071:973;18156:12;;18121:3;;18211:1;18231:18;;;;18284;;;;18311:61;;18365:4;18357:6;18353:17;18343:27;;18311:61;18391:2;18439;18431:6;18428:14;18408:18;18405:38;18402:161;;;18485:10;18480:3;18476:20;18473:1;18466:31;18520:4;18517:1;18510:15;18548:4;18545:1;18538:15;18402:161;18579:18;18606:104;;;;18724:1;18719:319;;;;18572:466;;18606:104;-1:-1:-1;;18639:24:1;;18627:37;;18684:16;;;;-1:-1:-1;18606:104:1;;18719:319;18018:1;18011:14;;;18055:4;18042:18;;18813:1;18827:165;18841:6;18838:1;18835:13;18827:165;;;18919:14;;18906:11;;;18899:35;18962:16;;;;18856:10;;18827:165;;;18831:3;;19021:6;19016:3;19012:16;19005:23;;18572:466;;;;;;;18071:973;;;;:::o;19232:1667::-;-1:-1:-1;;;19923:63:1;;20009:13;;19905:3;;20031:62;20009:13;20081:2;20072:12;;20065:4;20053:17;;20031:62;:::i;:::-;20157:66;20152:2;20112:16;;;20144:11;;;20137:87;20253:34;20248:2;20240:11;;20233:55;20317:34;20312:2;20304:11;;20297:55;20382:34;20376:3;20368:12;;20361:56;20447:66;20441:3;20433:12;;20426:88;-1:-1:-1;;;20538:3:1;20530:12;;20523:58;20600:47;20642:3;20634:12;;20626:6;20600:47;:::i;:::-;20590:57;;-1:-1:-1;;;20663:2:1;20656:21;20708:6;20702:13;20724:62;20777:8;20773:1;20769:2;20765:10;20758:4;20750:6;20746:17;20724:62;:::i;:::-;20802:91;20836:56;20889:1;20878:8;20874:2;20870:17;20866:25;19126:66;19114:79;;19218:2;19209:12;;19049:178;20836:56;20828:6;20802:91;:::i;:::-;20795:98;19232:1667;-1:-1:-1;;;;;;;;19232:1667:1:o;20904:204::-;20942:3;20978:4;20975:1;20971:12;21010:4;21007:1;21003:12;21045:3;21039:4;21035:14;21030:3;21027:23;21024:49;;;21053:18;;:::i;:::-;21089:13;;20904:204;-1:-1:-1;;;20904:204:1:o;21614:1933::-;22440:3;22478:6;22472:13;22494:53;22540:6;22535:3;22528:4;22520:6;22516:17;22494:53;:::i;:::-;-1:-1:-1;;;22569:16:1;;;22594:28;;;22647:13;;22669:66;22647:13;22721:2;22710:14;;22703:4;22691:17;;22669:66;:::i;:::-;22803;22798:2;22754:20;;;;22790:11;;;22783:87;-1:-1:-1;;;22894:2:1;22886:11;;22879:27;22931:13;;22953:63;22931:13;23002:2;22994:11;;22987:4;22975:17;;22953:63;:::i;:::-;23081:66;23076:2;23035:17;;;;23068:11;;;23061:87;23177:66;23172:2;23164:11;;23157:87;23274:66;23268:3;23260:12;;23253:88;-1:-1:-1;;;23365:3:1;23357:12;;23350:54;23420:121;23445:95;23470:69;23500:38;23533:3;23525:12;;23517:6;23500:38;:::i;:::-;21190:66;21178:79;;-1:-1:-1;;;21282:2:1;21273:12;;21266:60;21351:2;21342:12;;21113:247;23470:69;23462:6;23445:95;:::i;:::-;21437:66;21425:79;;-1:-1:-1;;;21529:2:1;21520:12;;21513:62;21600:2;21591:12;;21365:244;23552:1835;24274:3;24312:6;24306:13;24328:53;24374:6;24369:3;24362:4;24354:6;24350:17;24328:53;:::i;:::-;24444:13;;24403:16;;;;24466:57;24444:13;24403:16;24500:4;24488:17;;24466:57;:::i;:::-;24556:8;24549:5;24545:20;24532:33;;;24588:66;24581:5;24574:81;24698:28;24693:3;24689:38;24682:4;24675:5;24671:16;24664:64;24759:6;24753:13;24775:66;24832:8;24827:2;24820:5;24816:14;24809:4;24801:6;24797:17;24775:66;:::i;:::-;24909;24904:2;24860:20;;;;24896:11;;;24889:87;-1:-1:-1;;;25000:2:1;24992:11;;24985:45;25055:13;;25077:63;25055:13;25126:2;25118:11;;25111:4;25099:17;;25077:63;:::i;:::-;-1:-1:-1;;;25200:2:1;25159:17;;;;25192:11;;;25185:69;25273:47;25315:3;25307:12;;25299:6;25273:47;:::i;:::-;-1:-1:-1;;;25329:26:1;;25379:1;25371:10;;23552:1835;-1:-1:-1;;;;;;;;23552:1835:1:o;25392:448::-;25654:31;25649:3;25642:44;25624:3;25715:6;25709:13;25731:62;25786:6;25781:2;25776:3;25772:12;25765:4;25757:6;25753:17;25731:62;:::i;:::-;25813:16;;;;25831:2;25809:25;;25392:448;-1:-1:-1;;25392:448:1:o;27891:128::-;27931:3;27962:1;27958:6;27955:1;27952:13;27949:39;;;27968:18;;:::i;:::-;-1:-1:-1;28004:9:1;;27891:128::o;28276:135::-;28315:3;-1:-1:-1;;28336:17:1;;28333:43;;;28356:18;;:::i;:::-;-1:-1:-1;28403:1:1;28392:13;;28276:135::o;29321:466::-;29496:3;29534:6;29528:13;29550:53;29596:6;29591:3;29584:4;29576:6;29572:17;29550:53;:::i;:::-;29666:13;;29625:16;;;;29688:57;29666:13;29625:16;29722:4;29710:17;;29688:57;:::i;:::-;29761:20;;29321:466;-1:-1:-1;;;;29321:466:1:o;29792:127::-;29853:10;29848:3;29844:20;29841:1;29834:31;29884:4;29881:1;29874:15;29908:4;29905:1;29898:15;29924:120;29964:1;29990;29980:35;;29995:18;;:::i;:::-;-1:-1:-1;30029:9:1;;29924:120::o;30049:168::-;30089:7;30155:1;30151;30147:6;30143:14;30140:1;30137:21;30132:1;30125:9;30118:17;30114:45;30111:71;;;30162:18;;:::i;:::-;-1:-1:-1;30202:9:1;;30049:168::o;30222:414::-;30424:2;30406:21;;;30463:2;30443:18;;;30436:30;30502:34;30497:2;30482:18;;30475:62;-1:-1:-1;;;30568:2:1;30553:18;;30546:48;30626:3;30611:19;;30222:414::o;30641:112::-;30673:1;30699;30689:35;;30704:18;;:::i;:::-;-1:-1:-1;30738:9:1;;30641:112::o;31753:512::-;31947:4;-1:-1:-1;;;;;32057:2:1;32049:6;32045:15;32034:9;32027:34;32109:2;32101:6;32097:15;32092:2;32081:9;32077:18;32070:43;;32149:6;32144:2;32133:9;32129:18;32122:34;32192:3;32187:2;32176:9;32172:18;32165:31;32213:46;32254:3;32243:9;32239:19;32231:6;32213:46;:::i;:::-;32205:54;31753:512;-1:-1:-1;;;;;;31753:512:1:o;32270:249::-;32339:6;32392:2;32380:9;32371:7;32367:23;32363:32;32360:52;;;32408:1;32405;32398:12;32360:52;32440:9;32434:16;32459:30;32483:5;32459:30;:::i;32524:136::-;32563:3;32591:5;32581:39;;32600:18;;:::i;:::-;-1:-1:-1;;;32636:18:1;;32524:136::o

Swarm Source

ipfs://533cd060b6cb211b6f6da1dda6c0a470264adac67915f91b6dec07c88447807c
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.