Token FROM THE SHADOWZ VOL.1

 

Overview ERC-721

Total Supply:
1,511 SZMXTAPEV1

Holders:
231 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
FromTheShadowzVol1

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-05
*/

/*                                                                                                              
 (    (       )    *                )       (       )       (        )             )            )  (           
 )\ ) )\ ) ( /(  (  `      *   ) ( /(       )\ ) ( /(  (    )\ )  ( /( (  (     ( /(         ( /(  )\ )     )  
(()/((()/( )\()) )\))(   ` )  /( )\())(    (()/( )\()) )\  (()/(  )\()))\))(   ')\())  (   ( )\())(()/(  ( /(  
 /(_))/(_)|(_)\ ((_)()\   ( )(_)|(_)\ )\    /(_)|(_)((((_)( /(_))((_)\((_)()\ )((_)\   )\  )((_)\  /(_)) )\()) 
(_))_(_))   ((_)(_()((_) (_(_()) _((_|(_)  (_))  _((_)\ _ )(_))_   ((_)(())\_)()_((_) ((_)((_)((_)(_))  ((_)\  
| |_ | _ \ / _ \|  \/  | |_   _|| || | __| / __|| || (_)_\(_)   \ / _ \ \((_)/ /_  /  \ \ / // _ \| |    / (_) 
| __||   /| (_) | |\/| |   | |  | __ | _|  \__ \| __ |/ _ \ | |) | (_) \ \/\/ / / /    \ V /| (_) | |__ _| |   
|_|  |_|_\ \___/|_|  |_|   |_|  |_||_|___| |___/|_||_/_/ \_\|___/ \___/ \_/\_/ /___|    \_/  \___/|____(_)_|    
 _     __ _    ___    __ _        __    _ ___ _  __      ___\ /___ _  _  __
|_|   (_ / \| | | |_||_ |_)|\|   |_ |V||_) | |_)|_    |V| |  X  | |_||_)|_ 
| |   __)\_/|_| | | ||__| \| |   |__| ||  _|_| \|__   | |_|_/ \ | | ||  |__

FIND US IN THE SHADOWZVERSE! => HTTPS://SHADOWZVERSE.IO

DEPLOYED ON FANTOM 6th July 2022
*/

// SPDX-License-Identifier: Unlicense
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








/**
 * @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: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/FromTheShadowzVol1.sol


pragma solidity ^0.8.4;




contract FromTheShadowzVol1 is ERC721, ERC721Enumerable, Ownable {
    
    //Collection Data
    uint256 public mintPrice;
    uint256 public maxTrackSupply;
    uint256 public totalTracks;
    uint256 public currentSupply;
    address payable public withdrawWallet;
    uint96 public standardRoyaltyFeesInBips;
    uint96 public airdropRoyaltyFeesInBips;
    string public contractURI;
    address public royaltyReceiver;

    //Track 1 Data
    uint256 public track1CurrentSupply;
    bool public track1MintEnabled;    
    string internal baseTokenURI1;

    //Track 2 Data
    uint256 public track2CurrentSupply;
    bool public track2MintEnabled;
    string internal baseTokenURI2;

    //Track 3 Data
    uint256 public track3CurrentSupply;
    bool public track3MintEnabled;  
    string internal baseTokenURI3; 

    //Track 4 Data
    uint256 public track4CurrentSupply;
    bool public track4MintEnabled;   
    string internal baseTokenURI4;

    //Track 5 Data
    uint256 public track5CurrentSupply;
    bool public track5MintEnabled;   
    string internal baseTokenURI5;

    //Track 6 Data
    uint256 public track6CurrentSupply;
    bool public track6MintEnabled;   
    string internal baseTokenURI6;

    //Track 7 Data
    uint256 public track7CurrentSupply;
    bool public track7MintEnabled;   
    string internal baseTokenURI7;

    //Track 8 Data
    uint256 public track8CurrentSupply;
    bool public track8MintEnabled; 
    string internal baseTokenURI8;  

    //Track 9 Data
    uint256 public track9CurrentSupply;
    bool public track9MintEnabled;  
    string internal baseTokenURI9; 

    //Track 10 Data
    uint256 public track10CurrentSupply;
    bool public track10MintEnabled;  
    string internal baseTokenURI10; 

    constructor() payable ERC721("FROM THE SHADOWZ VOL.1", "SZMXTAPEV1") {
        mintPrice = 80 ether;
        maxTrackSupply = 300;
        totalTracks = 10;
        withdrawWallet = payable(msg.sender);
        standardRoyaltyFeesInBips = 750; //7.5% Royalty for single tracks   
        airdropRoyaltyFeesInBips = 1000; //10% Royalty for complete airdropped special ed mixtape
        royaltyReceiver = msg.sender;
    }

    //Only Owner
    function setMintPrice(uint256 price) external onlyOwner {
        mintPrice = price;
    }

    function setContractURI(string calldata _contractURI) public onlyOwner {
        contractURI = _contractURI;
    }

    function setBaseTokenURI(string calldata baseTokenURI_, uint256 trackNumber) external onlyOwner {
        require(trackNumber != 0 && trackNumber <= 10, "Invalid track number. Track number must be between 1 and 10.");
        if(trackNumber == 1) baseTokenURI1 = baseTokenURI_;
        if(trackNumber == 2) baseTokenURI2 = baseTokenURI_;
        if(trackNumber == 3) baseTokenURI3 = baseTokenURI_;
        if(trackNumber == 4) baseTokenURI4 = baseTokenURI_;
        if(trackNumber == 5) baseTokenURI5 = baseTokenURI_;
        if(trackNumber == 6) baseTokenURI6 = baseTokenURI_;
        if(trackNumber == 7) baseTokenURI7 = baseTokenURI_;
        if(trackNumber == 8) baseTokenURI8 = baseTokenURI_;
        if(trackNumber == 9) baseTokenURI9 = baseTokenURI_;
        if(trackNumber == 10) baseTokenURI10 = baseTokenURI_;        
    }

    function setRoyaltyInfo(address _receiver, uint96 _standardRoyaltyFeesInBips, uint96 _airdropRoyaltyFeesInBips) public onlyOwner {
        royaltyReceiver = _receiver;
        standardRoyaltyFeesInBips = _standardRoyaltyFeesInBips;
        airdropRoyaltyFeesInBips = _airdropRoyaltyFeesInBips;
    }

    function withdraw() external onlyOwner { 
        (bool success, ) = withdrawWallet.call{ value: address(this).balance }('');
        require(success, "Withdraw failed :`(");
    }

    function setWithdrawWallet(address payable _address) external onlyOwner {
        withdrawWallet = _address;
    }

    function toggleTrackMintStatus(uint trackNumber) external onlyOwner {
        require(trackNumber != 0 && trackNumber <= 10, "Invalid track number. Track number must be between 1 and 10.");
        if(trackNumber == 1) track1MintEnabled = !track1MintEnabled;
        if(trackNumber == 2) track2MintEnabled = !track2MintEnabled;
        if(trackNumber == 3) track3MintEnabled = !track3MintEnabled;
        if(trackNumber == 4) track4MintEnabled = !track4MintEnabled;
        if(trackNumber == 5) track5MintEnabled = !track5MintEnabled;
        if(trackNumber == 6) track6MintEnabled = !track6MintEnabled;
        if(trackNumber == 7) track7MintEnabled = !track7MintEnabled;
        if(trackNumber == 8) track8MintEnabled = !track8MintEnabled;
        if(trackNumber == 9) track9MintEnabled = !track9MintEnabled;
        if(trackNumber == 10) track10MintEnabled = !track10MintEnabled;
    }

    //Token Uri
    function tokenURI(uint256 tokenId_) public view override returns (string memory){
        require(_exists(tokenId_), "Token doesn't exist!");
        string memory uri;
        if(tokenId_ > 0 && tokenId_ <= maxTrackSupply) uri = baseTokenURI1;
        if(tokenId_ > maxTrackSupply && tokenId_ <= maxTrackSupply * 2) uri = baseTokenURI2;
        if(tokenId_ > maxTrackSupply * 2 && tokenId_ <= maxTrackSupply * 3) uri = baseTokenURI3;
        if(tokenId_ > maxTrackSupply * 3 && tokenId_ <= maxTrackSupply * 4) uri = baseTokenURI4;
        if(tokenId_ > maxTrackSupply * 4 && tokenId_ <= maxTrackSupply * 5) uri = baseTokenURI5;
        if(tokenId_ > maxTrackSupply * 5 && tokenId_ <= maxTrackSupply * 6) uri = baseTokenURI6;
        if(tokenId_ > maxTrackSupply * 6 && tokenId_ <= maxTrackSupply * 7) uri = baseTokenURI7;
        if(tokenId_ > maxTrackSupply * 7 && tokenId_ <= maxTrackSupply * 8) uri = baseTokenURI8;
        if(tokenId_ > maxTrackSupply * 8 && tokenId_ <= maxTrackSupply * 9) uri = baseTokenURI9;
        if(tokenId_ > maxTrackSupply * 9 && tokenId_ <= maxTrackSupply * 10) uri = baseTokenURI10;

        return string(abi.encodePacked(uri, Strings.toString(tokenId_), ".json"));
    }
    
    //EIP-2981 Royalty
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns(address receiver, uint256 royaltyAmount) {
        require(_tokenId <= (maxTrackSupply * totalTracks), "Token Id outside out of range.");
        uint royalty;        
        if(_tokenId < (maxTrackSupply * totalTracks) - (maxTrackSupply - 1)) royalty = calculateRoyalty(_salePrice, standardRoyaltyFeesInBips);
        else royalty = calculateRoyalty(_salePrice, airdropRoyaltyFeesInBips);   
        return (royaltyReceiver, royalty);     
    }

    function calculateRoyalty(uint256 _salePrice, uint256 _royaltyFeesInBips) internal pure returns(uint256) {        
        return (_salePrice / 10000) * _royaltyFeesInBips;
    }

    //Mint
    function mintTrack(uint amount, uint trackNumber) external payable {
        require(amount > 0, "Mint amount must be greater than zero.");        
        if(owner() != msg.sender) require(amount <= 3, "Max 3 mints per transaction.");
        require(trackNumber != 0 && trackNumber <= 10, "Invalid track number. Track number must be between 1 and 10.");  

        if(trackNumber == 1) {
            if(owner() != msg.sender) require(track1MintEnabled, "Minting for Track 1 is not enabled yet.");
            require(track1CurrentSupply < maxTrackSupply, "Track 1 has sold out.");   
            require(amount <= (maxTrackSupply - track1CurrentSupply), "Attempting to mint more tokens than exist!");
        }
        if(trackNumber == 2) {
            if(owner() != msg.sender) require(track2MintEnabled, "Minting for Track 2 is not enabled yet.");        
            require(track2CurrentSupply < maxTrackSupply, "Track 2 has sold out.");                          
            require(amount <= (maxTrackSupply - track2CurrentSupply), "Attempting to mint more tokens than exist!");                          
        }
        if(trackNumber == 3) {
            if(owner() != msg.sender) require(track3MintEnabled, "Minting for Track 3 is not enabled yet.");        
            require(track3CurrentSupply < maxTrackSupply, "Track 3 has sold out.");                          
            require(amount <= (maxTrackSupply - track3CurrentSupply), "Attempting to mint more tokens than exist!");                          
        }
        if(trackNumber == 4) {
            if(owner() != msg.sender) require(track4MintEnabled, "Minting for Track 4 is not enabled yet.");        
            require(track4CurrentSupply < maxTrackSupply, "Track 4 has sold out.");                          
            require(amount <= (maxTrackSupply - track4CurrentSupply), "Attempting to mint more tokens than exist!");                          
        }
        if(trackNumber == 5) {
            if(owner() != msg.sender) require(track5MintEnabled, "Minting for Track 5 is not enabled yet.");        
            require(track5CurrentSupply < maxTrackSupply, "Track 5 has sold out.");                          
            require(amount <= (maxTrackSupply - track5CurrentSupply), "Attempting to mint more tokens than exist!");                          
        }
        if(trackNumber == 6) {
            if(owner() != msg.sender) require(track6MintEnabled, "Minting for Track 6 is not enabled yet.");        
            require(track6CurrentSupply < maxTrackSupply, "Track 6 has sold out.");                          
            require(amount <= (maxTrackSupply - track6CurrentSupply), "Attempting to mint more tokens than exist!");                          
        }
        if(trackNumber == 7) {
            if(owner() != msg.sender) require(track7MintEnabled, "Minting for Track 7 is not enabled yet.");        
            require(track7CurrentSupply < maxTrackSupply, "Track 7 has sold out.");                          
            require(amount <= (maxTrackSupply - track7CurrentSupply), "Attempting to mint more tokens than exist!");                          
        }
        if(trackNumber == 8) {
            if(owner() != msg.sender) require(track8MintEnabled, "Minting for Track 8 is not enabled yet.");        
            require(track8CurrentSupply < maxTrackSupply, "Track 8 has sold out.");                          
            require(amount <= (maxTrackSupply - track8CurrentSupply), "Attempting to mint more tokens than exist!");                          
        }
        if(trackNumber == 9) {
            if(owner() != msg.sender) require(track9MintEnabled, "Minting for Track 9 is not enabled yet.");        
            require(track9CurrentSupply < maxTrackSupply, "Track 9 has sold out.");                          
            require(amount <= (maxTrackSupply - track9CurrentSupply), "Attempting to mint more tokens than exist!");                          
        }
        if(trackNumber == 10) {
            if(owner() != msg.sender) require(track10MintEnabled, "Minting for Track 10 is not enabled yet.");        
            require(track10CurrentSupply < maxTrackSupply, "Track 10 has sold out.");                          
            require(amount <= (maxTrackSupply - track10CurrentSupply), "Attempting to mint more tokens than exist!");                          
        }

        for(uint256 i = 1; i <= amount; i++){              
            uint256 tokenId = i;

            if(trackNumber == 1){                                                                          
                track1CurrentSupply++;
                currentSupply++;
                tokenId = track1CurrentSupply;
            }
            if(trackNumber == 2){                 
                track2CurrentSupply++;
                currentSupply++;
                tokenId = track2CurrentSupply + (maxTrackSupply * 1);
            }
            if(trackNumber == 3){                 
                track3CurrentSupply++;
                currentSupply++;
                tokenId = track3CurrentSupply + (maxTrackSupply * 2);
            }
            if(trackNumber == 4){                 
                track4CurrentSupply++;
                currentSupply++;
                tokenId = track4CurrentSupply + (maxTrackSupply * 3);
            }
            if(trackNumber == 5){                 
                track5CurrentSupply++;
                currentSupply++;
                tokenId = track5CurrentSupply + (maxTrackSupply * 4);
            }
            if(trackNumber == 6){                 
                track6CurrentSupply++;
                currentSupply++;
                tokenId = track6CurrentSupply + (maxTrackSupply * 5);
            }
            if(trackNumber == 7){                 
                track7CurrentSupply++;
                currentSupply++;
                tokenId = track7CurrentSupply + (maxTrackSupply * 6);
            }
            if(trackNumber == 8){                 
                track8CurrentSupply++;
                currentSupply++;
                tokenId = track8CurrentSupply + (maxTrackSupply * 7);
            }
            if(trackNumber == 9){                 
                track9CurrentSupply++;
                currentSupply++;
                tokenId = track9CurrentSupply + (maxTrackSupply * 8);
            }
            if(trackNumber == 10){                 
                track10CurrentSupply++;
                currentSupply++;
                tokenId = track10CurrentSupply + (maxTrackSupply * 9);
            }

            if(owner() == msg.sender)require(msg.value == (0 ether), "0 only");
            if(owner() != msg.sender) require(msg.value == (mintPrice * amount), "Incorrect payment value.");
            mint(tokenId);                                    
        }
    }

    function mint(uint256 tokenId) internal {   
        _safeMint(msg.sender, tokenId);                        
    }

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

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return interfaceId == 0x2a55205a || super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"airdropRoyaltyFeesInBips","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"maxTrackSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"trackNumber","type":"uint256"}],"name":"mintTrack","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseTokenURI_","type":"string"},{"internalType":"uint256","name":"trackNumber","type":"uint256"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_standardRoyaltyFeesInBips","type":"uint96"},{"internalType":"uint96","name":"_airdropRoyaltyFeesInBips","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_address","type":"address"}],"name":"setWithdrawWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"standardRoyaltyFeesInBips","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"trackNumber","type":"uint256"}],"name":"toggleTrackMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTracks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track10CurrentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track10MintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track1CurrentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track1MintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track2CurrentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track2MintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track3CurrentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track3MintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track4CurrentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track4MintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track5CurrentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track5MintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track6CurrentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track6MintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track7CurrentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track7MintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track8CurrentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track8MintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track9CurrentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"track9MintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

601660808181527f46524f4d2054484520534841444f575a20564f4c2e310000000000000000000060a0908152610100604052600a60c090815269535a4d5854415045563160b01b60e05291926200005a9160009162000135565b5080516200007090600190602084019062000135565b5050506200008d62000087620000df60201b60201c565b620000e3565b6804563918244f400000600b5561012c600c55600a600d5561017760a11b33908117600f55601080546001600160601b0319166103e8179055601280546001600160a01b031916909117905562000218565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200014390620001db565b90600052602060002090601f016020900481019282620001675760008555620001b2565b82601f106200018257805160ff1916838001178555620001b2565b82800160010185558215620001b2579182015b82811115620001b257825182559160200191906001019062000195565b50620001c0929150620001c4565b5090565b5b80821115620001c05760008155600101620001c5565b600181811c90821680620001f057607f821691505b602082108114156200021257634e487b7160e01b600052602260045260246000fd5b50919050565b613ed180620002286000396000f3fe6080604052600436106103765760003560e01c80636352211e116101d1578063b5118e4f11610102578063e8a3d485116100a0578063f2fde38b1161006f578063f2fde38b146109c3578063f39716cd146109e3578063f4a0a528146109fd578063f598794c14610a1d57600080fd5b8063e8a3d48514610939578063e985e9c51461094e578063ec0ab53214610997578063f24e4b8d146109ad57600080fd5b8063d6397c61116100dc578063d6397c61146108c5578063da55b19c146108e5578063e71e0dd614610905578063e767eff01461091f57600080fd5b8063b5118e4f1461086f578063b88d4fde14610885578063c87b56dd146108a557600080fd5b806385d178f41161016f578063938e3d7b11610149578063938e3d7b146107fa57806395d89b411461081a5780639fbc87131461082f578063a22cb4651461084f57600080fd5b806385d178f41461079c5780638da5cb5b146107bc5780639373f432146107da57600080fd5b80636817c76c116101ab5780636817c76c1461073b57806370a0823114610751578063715018a614610771578063771282f61461078657600080fd5b80636352211e146106eb5780636389188c1461070b57806365320b531461072557600080fd5b806327328057116102ab57806340dee0b5116102495780634a722aea116102235780634a722aea146106885780634f6ccce71461069e5780635bbcc6b9146106be5780636292d67a146106d157600080fd5b806340dee0b51461063857806341ec5f9c1461064e57806342842e0e1461066857600080fd5b8063341175411161028557806334117541146105d357806337e8b768146105e9578063397aa825146106095780633ccfd60b1461062357600080fd5b806327328057146105545780632a55205a146105745780632f745c59146105b357600080fd5b8063121bed77116103185780631aa1ccf5116102f25780631aa1ccf5146104ee5780631c95750a1461050457806321ecae971461051e57806323b872dd1461053457600080fd5b8063121bed771461049f5780631756e295146104c357806318160ddd146104d957600080fd5b8063081812fc11610354578063081812fc146103ec578063095ea7b3146104245780630a99696e146104465780630fdbdef01461046057600080fd5b806301ffc9a71461037b57806303ac2fff146103b057806306fdde03146103ca575b600080fd5b34801561038757600080fd5b5061039b610396366004613a39565b610a33565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b5060295461039b9060ff1681565b3480156103d657600080fd5b506103df610a5e565b6040516103a79190613bdc565b3480156103f857600080fd5b5061040c610407366004613afb565b610af0565b6040516001600160a01b0390911681526020016103a7565b34801561043057600080fd5b5061044461043f3660046139ca565b610b17565b005b34801561045257600080fd5b5060235461039b9060ff1681565b34801561046c57600080fd5b50600f5461048790600160a01b90046001600160601b031681565b6040516001600160601b0390911681526020016103a7565b3480156104ab57600080fd5b506104b5602e5481565b6040519081526020016103a7565b3480156104cf57600080fd5b506104b5601f5481565b3480156104e557600080fd5b506008546104b5565b3480156104fa57600080fd5b506104b560285481565b34801561051057600080fd5b5060265461039b9060ff1681565b34801561052a57600080fd5b506104b560135481565b34801561054057600080fd5b5061044461054f366004613880565b610c32565b34801561056057600080fd5b5061044461056f3660046139f5565b610c63565b34801561058057600080fd5b5061059461058f366004613b13565b610cc2565b604080516001600160a01b0390931683526020830191909152016103a7565b3480156105bf57600080fd5b506104b56105ce3660046139ca565b610dad565b3480156105df57600080fd5b506104b5602b5481565b3480156105f557600080fd5b50610444610604366004613afb565b610e43565b34801561061557600080fd5b50602f5461039b9060ff1681565b34801561062f57600080fd5b50610444610f92565b34801561064457600080fd5b506104b5600d5481565b34801561065a57600080fd5b50601d5461039b9060ff1681565b34801561067457600080fd5b50610444610683366004613880565b611033565b34801561069457600080fd5b506104b560255481565b3480156106aa57600080fd5b506104b56106b9366004613afb565b61104e565b6104446106cc366004613b13565b6110ef565b3480156106dd57600080fd5b50602c5461039b9060ff1681565b3480156106f757600080fd5b5061040c610706366004613afb565b612039565b34801561071757600080fd5b50601a5461039b9060ff1681565b34801561073157600080fd5b506104b5601c5481565b34801561074757600080fd5b506104b5600b5481565b34801561075d57600080fd5b506104b561076c36600461382c565b612099565b34801561077d57600080fd5b5061044461211f565b34801561079257600080fd5b506104b5600e5481565b3480156107a857600080fd5b50600f5461040c906001600160a01b031681565b3480156107c857600080fd5b50600a546001600160a01b031661040c565b3480156107e657600080fd5b506104446107f536600461382c565b612133565b34801561080657600080fd5b50610444610815366004613a71565b61215d565b34801561082657600080fd5b506103df612171565b34801561083b57600080fd5b5060125461040c906001600160a01b031681565b34801561085b57600080fd5b5061044461086a366004613999565b612180565b34801561087b57600080fd5b506104b560225481565b34801561089157600080fd5b506104446108a03660046138c0565b61218f565b3480156108b157600080fd5b506103df6108c0366004613afb565b6121c7565b3480156108d157600080fd5b506104446108e0366004613ab1565b61298f565b3480156108f157600080fd5b50601054610487906001600160601b031681565b34801561091157600080fd5b5060205461039b9060ff1681565b34801561092b57600080fd5b5060175461039b9060ff1681565b34801561094557600080fd5b506103df612aa7565b34801561095a57600080fd5b5061039b610969366004613848565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109a357600080fd5b506104b560165481565b3480156109b957600080fd5b506104b560195481565b3480156109cf57600080fd5b506104446109de36600461382c565b612b35565b3480156109ef57600080fd5b5060145461039b9060ff1681565b348015610a0957600080fd5b50610444610a18366004613afb565b612bab565b348015610a2957600080fd5b506104b5600c5481565b600063152a902d60e11b6001600160e01b031983161480610a585750610a5882612bb8565b92915050565b606060008054610a6d90613dc4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9990613dc4565b8015610ae65780601f10610abb57610100808354040283529160200191610ae6565b820191906000526020600020905b815481529060010190602001808311610ac957829003601f168201915b5050505050905090565b6000610afb82612bdd565b506000908152600460205260409020546001600160a01b031690565b6000610b2282612039565b9050806001600160a01b0316836001600160a01b03161415610b955760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610bb15750610bb18133610969565b610c235760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610b8c565b610c2d8383612c3c565b505050565b610c3c3382612caa565b610c585760405162461bcd60e51b8152600401610b8c90613ce8565b610c2d838383612d29565b610c6b612ed0565b601280546001600160a01b0319166001600160a01b03948516179055600f8054909316600160a01b6001600160601b039384160217909255601080546bffffffffffffffffffffffff191692909116919091179055565b600080600d54600c54610cd59190613d62565b841115610d245760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e204964206f757473696465206f7574206f662072616e67652e00006044820152606401610b8c565b60006001600c54610d359190613d81565b600d54600c54610d459190613d62565b610d4f9190613d81565b851015610d7b57600f54610d74908590600160a01b90046001600160601b0316612f2a565b9050610d95565b601054610d929085906001600160601b0316612f2a565b90505b6012546001600160a01b0316925090505b9250929050565b6000610db883612099565b8210610e1a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b8c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610e4b612ed0565b8015801590610e5b5750600a8111155b610e775760405162461bcd60e51b8152600401610b8c90613bef565b8060011415610e93576014805460ff19811660ff909116151790555b8060021415610eaf576017805460ff19811660ff909116151790555b8060031415610ecb57601a805460ff19811660ff909116151790555b8060041415610ee757601d805460ff19811660ff909116151790555b8060051415610f03576020805460ff19811660ff909116151790555b8060061415610f1f576023805460ff19811660ff909116151790555b8060071415610f3b576026805460ff19811660ff909116151790555b8060081415610f57576029805460ff19811660ff909116151790555b8060091415610f7357602c805460ff19811660ff909116151790555b80600a1415610f8f57602f805460ff19811660ff909116151790555b50565b610f9a612ed0565b600f546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610fe7576040519150601f19603f3d011682016040523d82523d6000602084013e610fec565b606091505b5050905080610f8f5760405162461bcd60e51b81526020600482015260136024820152720aed2e8d0c8e4c2ee40ccc2d2d8cac84074c05606b1b6044820152606401610b8c565b610c2d8383836040518060200160405280600081525061218f565b600061105960085490565b82106110bc5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b8c565b600882815481106110dd57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000821161114e5760405162461bcd60e51b815260206004820152602660248201527f4d696e7420616d6f756e74206d7573742062652067726561746572207468616e604482015265103d32b9379760d11b6064820152608401610b8c565b33611161600a546001600160a01b031690565b6001600160a01b0316146111c05760038211156111c05760405162461bcd60e51b815260206004820152601c60248201527f4d61782033206d696e747320706572207472616e73616374696f6e2e000000006044820152606401610b8c565b80158015906111d05750600a8111155b6111ec5760405162461bcd60e51b8152600401610b8c90613bef565b80600114156112f25733611208600a546001600160a01b031690565b6001600160a01b0316146112785760145460ff166112785760405162461bcd60e51b815260206004820152602760248201527f4d696e74696e6720666f7220547261636b2031206973206e6f7420656e61626c60448201526632b2103cb2ba1760c91b6064820152608401610b8c565b600c54601354106112c35760405162461bcd60e51b81526020600482015260156024820152742a3930b1b59018903430b99039b7b6321037baba1760591b6044820152606401610b8c565b601354600c546112d39190613d81565b8211156112f25760405162461bcd60e51b8152600401610b8c90613c9e565b80600214156113f8573361130e600a546001600160a01b031690565b6001600160a01b03161461137e5760175460ff1661137e5760405162461bcd60e51b815260206004820152602760248201527f4d696e74696e6720666f7220547261636b2032206973206e6f7420656e61626c60448201526632b2103cb2ba1760c91b6064820152608401610b8c565b600c54601654106113c95760405162461bcd60e51b81526020600482015260156024820152742a3930b1b59019103430b99039b7b6321037baba1760591b6044820152606401610b8c565b601654600c546113d99190613d81565b8211156113f85760405162461bcd60e51b8152600401610b8c90613c9e565b80600314156114fe5733611414600a546001600160a01b031690565b6001600160a01b03161461148457601a5460ff166114845760405162461bcd60e51b815260206004820152602760248201527f4d696e74696e6720666f7220547261636b2033206973206e6f7420656e61626c60448201526632b2103cb2ba1760c91b6064820152608401610b8c565b600c54601954106114cf5760405162461bcd60e51b81526020600482015260156024820152742a3930b1b59019903430b99039b7b6321037baba1760591b6044820152606401610b8c565b601954600c546114df9190613d81565b8211156114fe5760405162461bcd60e51b8152600401610b8c90613c9e565b8060041415611604573361151a600a546001600160a01b031690565b6001600160a01b03161461158a57601d5460ff1661158a5760405162461bcd60e51b815260206004820152602760248201527f4d696e74696e6720666f7220547261636b2034206973206e6f7420656e61626c60448201526632b2103cb2ba1760c91b6064820152608401610b8c565b600c54601c54106115d55760405162461bcd60e51b81526020600482015260156024820152742a3930b1b5901a103430b99039b7b6321037baba1760591b6044820152606401610b8c565b601c54600c546115e59190613d81565b8211156116045760405162461bcd60e51b8152600401610b8c90613c9e565b806005141561170a5733611620600a546001600160a01b031690565b6001600160a01b0316146116905760205460ff166116905760405162461bcd60e51b815260206004820152602760248201527f4d696e74696e6720666f7220547261636b2035206973206e6f7420656e61626c60448201526632b2103cb2ba1760c91b6064820152608401610b8c565b600c54601f54106116db5760405162461bcd60e51b81526020600482015260156024820152742a3930b1b5901a903430b99039b7b6321037baba1760591b6044820152606401610b8c565b601f54600c546116eb9190613d81565b82111561170a5760405162461bcd60e51b8152600401610b8c90613c9e565b80600614156118105733611726600a546001600160a01b031690565b6001600160a01b0316146117965760235460ff166117965760405162461bcd60e51b815260206004820152602760248201527f4d696e74696e6720666f7220547261636b2036206973206e6f7420656e61626c60448201526632b2103cb2ba1760c91b6064820152608401610b8c565b600c54602254106117e15760405162461bcd60e51b81526020600482015260156024820152742a3930b1b5901b103430b99039b7b6321037baba1760591b6044820152606401610b8c565b602254600c546117f19190613d81565b8211156118105760405162461bcd60e51b8152600401610b8c90613c9e565b8060071415611916573361182c600a546001600160a01b031690565b6001600160a01b03161461189c5760265460ff1661189c5760405162461bcd60e51b815260206004820152602760248201527f4d696e74696e6720666f7220547261636b2037206973206e6f7420656e61626c60448201526632b2103cb2ba1760c91b6064820152608401610b8c565b600c54602554106118e75760405162461bcd60e51b81526020600482015260156024820152742a3930b1b5901b903430b99039b7b6321037baba1760591b6044820152606401610b8c565b602554600c546118f79190613d81565b8211156119165760405162461bcd60e51b8152600401610b8c90613c9e565b8060081415611a1c5733611932600a546001600160a01b031690565b6001600160a01b0316146119a25760295460ff166119a25760405162461bcd60e51b815260206004820152602760248201527f4d696e74696e6720666f7220547261636b2038206973206e6f7420656e61626c60448201526632b2103cb2ba1760c91b6064820152608401610b8c565b600c54602854106119ed5760405162461bcd60e51b81526020600482015260156024820152742a3930b1b5901c103430b99039b7b6321037baba1760591b6044820152606401610b8c565b602854600c546119fd9190613d81565b821115611a1c5760405162461bcd60e51b8152600401610b8c90613c9e565b8060091415611b225733611a38600a546001600160a01b031690565b6001600160a01b031614611aa857602c5460ff16611aa85760405162461bcd60e51b815260206004820152602760248201527f4d696e74696e6720666f7220547261636b2039206973206e6f7420656e61626c60448201526632b2103cb2ba1760c91b6064820152608401610b8c565b600c54602b5410611af35760405162461bcd60e51b81526020600482015260156024820152742a3930b1b5901c903430b99039b7b6321037baba1760591b6044820152606401610b8c565b602b54600c54611b039190613d81565b821115611b225760405162461bcd60e51b8152600401610b8c90613c9e565b80600a1415611c2a5733611b3e600a546001600160a01b031690565b6001600160a01b031614611baf57602f5460ff16611baf5760405162461bcd60e51b815260206004820152602860248201527f4d696e74696e6720666f7220547261636b203130206973206e6f7420656e61626044820152673632b2103cb2ba1760c11b6064820152608401610b8c565b600c54602e5410611bfb5760405162461bcd60e51b81526020600482015260166024820152752a3930b1b5901898103430b99039b7b6321037baba1760511b6044820152606401610b8c565b602e54600c54611c0b9190613d81565b821115611c2a5760405162461bcd60e51b8152600401610b8c90613c9e565b60015b828111610c2d57806001831415611c6e5760138054906000611c4e83613dff565b9091555050600e8054906000611c6383613dff565b919050555060135490505b8260021415611cbf5760168054906000611c8783613dff565b9091555050600e8054906000611c9c83613dff565b9091555050600c54611caf906001613d62565b601654611cbc9190613d36565b90505b8260031415611d105760198054906000611cd883613dff565b9091555050600e8054906000611ced83613dff565b9091555050600c54611d00906002613d62565b601954611d0d9190613d36565b90505b8260041415611d6157601c8054906000611d2983613dff565b9091555050600e8054906000611d3e83613dff565b9091555050600c54611d51906003613d62565b601c54611d5e9190613d36565b90505b8260051415611db257601f8054906000611d7a83613dff565b9091555050600e8054906000611d8f83613dff565b9091555050600c54611da2906004613d62565b601f54611daf9190613d36565b90505b8260061415611e035760228054906000611dcb83613dff565b9091555050600e8054906000611de083613dff565b9091555050600c54611df3906005613d62565b602254611e009190613d36565b90505b8260071415611e545760258054906000611e1c83613dff565b9091555050600e8054906000611e3183613dff565b9091555050600c54611e44906006613d62565b602554611e519190613d36565b90505b8260081415611ea55760288054906000611e6d83613dff565b9091555050600e8054906000611e8283613dff565b9091555050600c54611e95906007613d62565b602854611ea29190613d36565b90505b8260091415611ef657602b8054906000611ebe83613dff565b9091555050600e8054906000611ed383613dff565b9091555050600c54611ee6906008613d62565b602b54611ef39190613d36565b90505b82600a1415611f4757602e8054906000611f0f83613dff565b9091555050600e8054906000611f2483613dff565b9091555050600c54611f37906009613d62565b602e54611f449190613d36565b90505b33611f5a600a546001600160a01b031690565b6001600160a01b03161415611fa0573415611fa05760405162461bcd60e51b815260206004820152600660248201526530206f6e6c7960d01b6044820152606401610b8c565b33611fb3600a546001600160a01b031690565b6001600160a01b03161461201d5783600b54611fcf9190613d62565b341461201d5760405162461bcd60e51b815260206004820152601860248201527f496e636f7272656374207061796d656e742076616c75652e00000000000000006044820152606401610b8c565b61202681612f4a565b508061203181613dff565b915050611c2d565b6000818152600260205260408120546001600160a01b031680610a585760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610b8c565b60006001600160a01b0382166121035760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610b8c565b506001600160a01b031660009081526003602052604090205490565b612127612ed0565b6121316000612f54565b565b61213b612ed0565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b612165612ed0565b610c2d60118383613737565b606060018054610a6d90613dc4565b61218b338383612fa6565b5050565b6121993383612caa565b6121b55760405162461bcd60e51b8152600401610b8c90613ce8565b6121c184848484613075565b50505050565b6000818152600260205260409020546060906001600160a01b03166122255760405162461bcd60e51b8152602060048201526014602482015273546f6b656e20646f65736e27742065786973742160601b6044820152606401610b8c565b60606000831180156122395750600c548311155b156122cc576015805461224b90613dc4565b80601f016020809104026020016040519081016040528092919081815260200182805461227790613dc4565b80156122c45780601f10612299576101008083540402835291602001916122c4565b820191906000526020600020905b8154815290600101906020018083116122a757829003601f168201915b505050505090505b600c54831180156122ea5750600c546122e6906002613d62565b8311155b1561237d57601880546122fc90613dc4565b80601f016020809104026020016040519081016040528092919081815260200182805461232890613dc4565b80156123755780601f1061234a57610100808354040283529160200191612375565b820191906000526020600020905b81548152906001019060200180831161235857829003601f168201915b505050505090505b600c5461238b906002613d62565b831180156123a65750600c546123a2906003613d62565b8311155b1561243957601b80546123b890613dc4565b80601f01602080910402602001604051908101604052809291908181526020018280546123e490613dc4565b80156124315780601f1061240657610100808354040283529160200191612431565b820191906000526020600020905b81548152906001019060200180831161241457829003601f168201915b505050505090505b600c54612447906003613d62565b831180156124625750600c5461245e906004613d62565b8311155b156124f557601e805461247490613dc4565b80601f01602080910402602001604051908101604052809291908181526020018280546124a090613dc4565b80156124ed5780601f106124c2576101008083540402835291602001916124ed565b820191906000526020600020905b8154815290600101906020018083116124d057829003601f168201915b505050505090505b600c54612503906004613d62565b8311801561251e5750600c5461251a906005613d62565b8311155b156125b1576021805461253090613dc4565b80601f016020809104026020016040519081016040528092919081815260200182805461255c90613dc4565b80156125a95780601f1061257e576101008083540402835291602001916125a9565b820191906000526020600020905b81548152906001019060200180831161258c57829003601f168201915b505050505090505b600c546125bf906005613d62565b831180156125da5750600c546125d6906006613d62565b8311155b1561266d57602480546125ec90613dc4565b80601f016020809104026020016040519081016040528092919081815260200182805461261890613dc4565b80156126655780601f1061263a57610100808354040283529160200191612665565b820191906000526020600020905b81548152906001019060200180831161264857829003601f168201915b505050505090505b600c5461267b906006613d62565b831180156126965750600c54612692906007613d62565b8311155b1561272957602780546126a890613dc4565b80601f01602080910402602001604051908101604052809291908181526020018280546126d490613dc4565b80156127215780601f106126f657610100808354040283529160200191612721565b820191906000526020600020905b81548152906001019060200180831161270457829003601f168201915b505050505090505b600c54612737906007613d62565b831180156127525750600c5461274e906008613d62565b8311155b156127e557602a805461276490613dc4565b80601f016020809104026020016040519081016040528092919081815260200182805461279090613dc4565b80156127dd5780601f106127b2576101008083540402835291602001916127dd565b820191906000526020600020905b8154815290600101906020018083116127c057829003601f168201915b505050505090505b600c546127f3906008613d62565b8311801561280e5750600c5461280a906009613d62565b8311155b156128a157602d805461282090613dc4565b80601f016020809104026020016040519081016040528092919081815260200182805461284c90613dc4565b80156128995780601f1061286e57610100808354040283529160200191612899565b820191906000526020600020905b81548152906001019060200180831161287c57829003601f168201915b505050505090505b600c546128af906009613d62565b831180156128ca5750600c546128c690600a613d62565b8311155b1561295d57603080546128dc90613dc4565b80601f016020809104026020016040519081016040528092919081815260200182805461290890613dc4565b80156129555780601f1061292a57610100808354040283529160200191612955565b820191906000526020600020905b81548152906001019060200180831161293857829003601f168201915b505050505090505b80612967846130a8565b604051602001612978929190613b60565b604051602081830303815290604052915050919050565b612997612ed0565b80158015906129a75750600a8111155b6129c35760405162461bcd60e51b8152600401610b8c90613bef565b80600114156129da576129d860158484613737565b505b80600214156129f1576129ef60188484613737565b505b8060031415612a0857612a06601b8484613737565b505b8060041415612a1f57612a1d601e8484613737565b505b8060051415612a3657612a3460218484613737565b505b8060061415612a4d57612a4b60248484613737565b505b8060071415612a6457612a6260278484613737565b505b8060081415612a7b57612a79602a8484613737565b505b8060091415612a9257612a90602d8484613737565b505b80600a1415610c2d576121c160308484613737565b60118054612ab490613dc4565b80601f0160208091040260200160405190810160405280929190818152602001828054612ae090613dc4565b8015612b2d5780601f10612b0257610100808354040283529160200191612b2d565b820191906000526020600020905b815481529060010190602001808311612b1057829003601f168201915b505050505081565b612b3d612ed0565b6001600160a01b038116612ba25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b8c565b610f8f81612f54565b612bb3612ed0565b600b55565b60006001600160e01b0319821663780e9d6360e01b1480610a585750610a58826131c2565b6000818152600260205260409020546001600160a01b0316610f8f5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610b8c565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612c7182612039565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612cb683612039565b9050806001600160a01b0316846001600160a01b03161480612cfd57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80612d215750836001600160a01b0316612d1684610af0565b6001600160a01b0316145b949350505050565b826001600160a01b0316612d3c82612039565b6001600160a01b031614612da05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610b8c565b6001600160a01b038216612e025760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b8c565b612e0d838383613212565b612e18600082612c3c565b6001600160a01b0383166000908152600360205260408120805460019290612e41908490613d81565b90915550506001600160a01b0382166000908152600360205260408120805460019290612e6f908490613d36565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a546001600160a01b031633146121315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b8c565b600081612f3961271085613d4e565b612f439190613d62565b9392505050565b610f8f338261321d565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156130085760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b8c565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613080848484612d29565b61308c84848484613237565b6121c15760405162461bcd60e51b8152600401610b8c90613c4c565b6060816130cc5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156130f657806130e081613dff565b91506130ef9050600a83613d4e565b91506130d0565b60008167ffffffffffffffff81111561311f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613149576020820181803683370190505b5090505b8415612d215761315e600183613d81565b915061316b600a86613e1a565b613176906030613d36565b60f81b81838151811061319957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506131bb600a86613d4e565b945061314d565b60006001600160e01b031982166380ac58cd60e01b14806131f357506001600160e01b03198216635b5e139f60e01b145b80610a5857506301ffc9a760e01b6001600160e01b0319831614610a58565b610c2d838383613344565b61218b8282604051806020016040528060008152506133fc565b60006001600160a01b0384163b1561333957604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061327b903390899088908890600401613b9f565b602060405180830381600087803b15801561329557600080fd5b505af19250505080156132c5575060408051601f3d908101601f191682019092526132c291810190613a55565b60015b61331f573d8080156132f3576040519150601f19603f3d011682016040523d82523d6000602084013e6132f8565b606091505b5080516133175760405162461bcd60e51b8152600401610b8c90613c4c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612d21565b506001949350505050565b6001600160a01b03831661339f5761339a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6133c2565b816001600160a01b0316836001600160a01b0316146133c2576133c2838261342f565b6001600160a01b0382166133d957610c2d816134cc565b826001600160a01b0316826001600160a01b031614610c2d57610c2d82826135a5565b61340683836135e9565b6134136000848484613237565b610c2d5760405162461bcd60e51b8152600401610b8c90613c4c565b6000600161343c84612099565b6134469190613d81565b600083815260076020526040902054909150808214613499576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906134de90600190613d81565b6000838152600960205260408120546008805493945090928490811061351457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061354357634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061358957634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006135b083612099565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661363f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b8c565b6000818152600260205260409020546001600160a01b0316156136a45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b8c565b6136b060008383613212565b6001600160a01b03821660009081526003602052604081208054600192906136d9908490613d36565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461374390613dc4565b90600052602060002090601f01602090048101928261376557600085556137ab565b82601f1061377e5782800160ff198235161785556137ab565b828001600101855582156137ab579182015b828111156137ab578235825591602001919060010190613790565b506137b79291506137bb565b5090565b5b808211156137b757600081556001016137bc565b60008083601f8401126137e1578182fd5b50813567ffffffffffffffff8111156137f8578182fd5b602083019150836020828501011115610da657600080fd5b80356001600160601b038116811461382757600080fd5b919050565b60006020828403121561383d578081fd5b8135612f4381613e70565b6000806040838503121561385a578081fd5b823561386581613e70565b9150602083013561387581613e70565b809150509250929050565b600080600060608486031215613894578081fd5b833561389f81613e70565b925060208401356138af81613e70565b929592945050506040919091013590565b600080600080608085870312156138d5578081fd5b84356138e081613e70565b935060208501356138f081613e70565b925060408501359150606085013567ffffffffffffffff80821115613913578283fd5b818701915087601f830112613926578283fd5b81358181111561393857613938613e5a565b604051601f8201601f19908116603f0116810190838211818310171561396057613960613e5a565b816040528281528a6020848701011115613978578586fd5b82602086016020830137918201602001949094529598949750929550505050565b600080604083850312156139ab578182fd5b82356139b681613e70565b915060208301358015158114613875578182fd5b600080604083850312156139dc578182fd5b82356139e781613e70565b946020939093013593505050565b600080600060608486031215613a09578283fd5b8335613a1481613e70565b9250613a2260208501613810565b9150613a3060408501613810565b90509250925092565b600060208284031215613a4a578081fd5b8135612f4381613e85565b600060208284031215613a66578081fd5b8151612f4381613e85565b60008060208385031215613a83578182fd5b823567ffffffffffffffff811115613a99578283fd5b613aa5858286016137d0565b90969095509350505050565b600080600060408486031215613ac5578283fd5b833567ffffffffffffffff811115613adb578384fd5b613ae7868287016137d0565b909790965060209590950135949350505050565b600060208284031215613b0c578081fd5b5035919050565b60008060408385031215613b25578081fd5b50508035926020909101359150565b60008151808452613b4c816020860160208601613d98565b601f01601f19169290920160200192915050565b60008351613b72818460208801613d98565b835190830190613b86818360208801613d98565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613bd290830184613b34565b9695505050505050565b602081526000612f436020830184613b34565b6020808252603c908201527f496e76616c696420747261636b206e756d6265722e20547261636b206e756d6260408201527f6572206d757374206265206265747765656e203120616e642031302e00000000606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602a908201527f417474656d7074696e6720746f206d696e74206d6f726520746f6b656e73207460408201526968616e2065786973742160b01b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60008219821115613d4957613d49613e2e565b500190565b600082613d5d57613d5d613e44565b500490565b6000816000190483118215151615613d7c57613d7c613e2e565b500290565b600082821015613d9357613d93613e2e565b500390565b60005b83811015613db3578181015183820152602001613d9b565b838111156121c15750506000910152565b600181811c90821680613dd857607f821691505b60208210811415613df957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613e1357613e13613e2e565b5060010190565b600082613e2957613e29613e44565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f8f57600080fd5b6001600160e01b031981168114610f8f57600080fdfea264697066735822122096ef0cd137b60e790ef62e470d86af0732e0419b4dae50bbe764a47812d733ae64736f6c63430008040033

Deployed ByteCode Sourcemap

47628:14496:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61880:241;;;;;;;;;;-1:-1:-1;61880:241:0;;;;;:::i;:::-;;:::i;:::-;;;8883:14:1;;8876:22;8858:41;;8846:2;8831:18;61880:241:0;;;;;;;;49095:29;;;;;;;;;;-1:-1:-1;49095:29:0;;;;;;;;28134:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29647:171::-;;;;;;;;;;-1:-1:-1;29647:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7678:32:1;;;7660:51;;7648:2;7633:18;29647:171:0;7615:102:1;29164:417:0;;;;;;;;;;-1:-1:-1;29164:417:0;;;;;:::i;:::-;;:::i;:::-;;48819:29;;;;;;;;;;-1:-1:-1;48819:29:0;;;;;;;;47908:39;;;;;;;;;;-1:-1:-1;47908:39:0;;;;-1:-1:-1;;;47908:39:0;;-1:-1:-1;;;;;47908:39:0;;;;;;-1:-1:-1;;;;;26313:39:1;;;26295:58;;26283:2;26268:18;47908:39:0;26250:109:1;49331:35:0;;;;;;;;;;;;;;;;;;;26115:25:1;;;26103:2;26088:18;49331:35:0;26070:76:1;48640:34:0;;;;;;;;;;;;;;;;42040:113;;;;;;;;;;-1:-1:-1;42128:10:0;:17;42040:113;;49054:34;;;;;;;;;;;;;;;;48957:29;;;;;;;;;;-1:-1:-1;48957:29:0;;;;;;;;48090:34;;;;;;;;;;;;;;;;30347:336;;;;;;;;;;-1:-1:-1;30347:336:0;;;;;:::i;:::-;;:::i;50984:303::-;;;;;;;;;;-1:-1:-1;50984:303:0;;;;;:::i;:::-;;:::i;53791:534::-;;;;;;;;;;-1:-1:-1;53791:534:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8631:32:1;;;8613:51;;8695:2;8680:18;;8673:34;;;;8586:18;53791:534:0;8568:145:1;41708:256:0;;;;;;;;;;-1:-1:-1;41708:256:0;;;;;:::i;:::-;;:::i;49192:34::-;;;;;;;;;;;;;;;;51610:900;;;;;;;;;;-1:-1:-1;51610:900:0;;;;;:::i;:::-;;:::i;49373:30::-;;;;;;;;;;-1:-1:-1;49373:30:0;;;;;;;;51295:183;;;;;;;;;;;;;:::i;47796:26::-;;;;;;;;;;;;;;;;48543:29;;;;;;;;;;-1:-1:-1;48543:29:0;;;;;;;;30754:185;;;;;;;;;;-1:-1:-1;30754:185:0;;;;;:::i;:::-;;:::i;48916:34::-;;;;;;;;;;;;;;;;42230:233;;;;;;;;;;-1:-1:-1;42230:233:0;;;;;:::i;:::-;;:::i;54533:7003::-;;;;;;:::i;:::-;;:::i;49233:29::-;;;;;;;;;;-1:-1:-1;49233:29:0;;;;;;;;27845:222;;;;;;;;;;-1:-1:-1;27845:222:0;;;;;:::i;:::-;;:::i;48405:29::-;;;;;;;;;;-1:-1:-1;48405:29:0;;;;;;;;48502:34;;;;;;;;;;;;;;;;47729:24;;;;;;;;;;;;;;;;27576:207;;;;;;;;;;-1:-1:-1;27576:207:0;;;;;:::i;:::-;;:::i;6663:103::-;;;;;;;;;;;;;:::i;47829:28::-;;;;;;;;;;;;;;;;47864:37;;;;;;;;;;-1:-1:-1;47864:37:0;;;;-1:-1:-1;;;;;47864:37:0;;;6015:87;;;;;;;;;;-1:-1:-1;6088:6:0;;-1:-1:-1;;;;;6088:6:0;6015:87;;51486:116;;;;;;;;;;-1:-1:-1;51486:116:0;;;;;:::i;:::-;;:::i;50007:::-;;;;;;;;;;-1:-1:-1;50007:116:0;;;;;:::i;:::-;;:::i;28303:104::-;;;;;;;;;;;;;:::i;48031:30::-;;;;;;;;;;-1:-1:-1;48031:30:0;;;;-1:-1:-1;;;;;48031:30:0;;;29890:155;;;;;;;;;;-1:-1:-1;29890:155:0;;;;;:::i;:::-;;:::i;48778:34::-;;;;;;;;;;;;;;;;31010:323;;;;;;;;;;-1:-1:-1;31010:323:0;;;;;:::i;:::-;;:::i;52535:1220::-;;;;;;;;;;-1:-1:-1;52535:1220:0;;;;;:::i;:::-;;:::i;50131:845::-;;;;;;;;;;-1:-1:-1;50131:845:0;;;;;:::i;:::-;;:::i;47954:38::-;;;;;;;;;;-1:-1:-1;47954:38:0;;;;-1:-1:-1;;;;;47954:38:0;;;48681:29;;;;;;;;;;-1:-1:-1;48681:29:0;;;;;;;;48270;;;;;;;;;;-1:-1:-1;48270:29:0;;;;;;;;47999:25;;;;;;;;;;;;;:::i;30116:164::-;;;;;;;;;;-1:-1:-1;30116:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;30237:25:0;;;30213:4;30237:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30116:164;48229:34;;;;;;;;;;;;;;;;48364;;;;;;;;;;;;;;;;6921:201;;;;;;;;;;-1:-1:-1;6921:201:0;;;;;:::i;:::-;;:::i;48131:29::-;;;;;;;;;;-1:-1:-1;48131:29:0;;;;;;;;49907:92;;;;;;;;;;-1:-1:-1;49907:92:0;;;;;:::i;:::-;;:::i;47760:29::-;;;;;;;;;;;;;;;;61880:241;62019:4;-1:-1:-1;;;;;;;;;62048:25:0;;;;:65;;;62077:36;62101:11;62077:23;:36::i;:::-;62041:72;61880:241;-1:-1:-1;;61880:241:0:o;28134:100::-;28188:13;28221:5;28214:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28134:100;:::o;29647:171::-;29723:7;29743:23;29758:7;29743:14;:23::i;:::-;-1:-1:-1;29786:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29786:24:0;;29647:171::o;29164:417::-;29245:13;29261:23;29276:7;29261:14;:23::i;:::-;29245:39;;29309:5;-1:-1:-1;;;;;29303:11:0;:2;-1:-1:-1;;;;;29303:11:0;;;29295:57;;;;-1:-1:-1;;;29295:57:0;;22663:2:1;29295:57:0;;;22645:21:1;22702:2;22682:18;;;22675:30;22741:34;22721:18;;;22714:62;-1:-1:-1;;;22792:18:1;;;22785:31;22833:19;;29295:57:0;;;;;;;;;4646:10;-1:-1:-1;;;;;29387:21:0;;;;:62;;-1:-1:-1;29412:37:0;29429:5;4646:10;30116:164;:::i;29412:37::-;29365:174;;;;-1:-1:-1;;;29365:174:0;;20049:2:1;29365:174:0;;;20031:21:1;20088:2;20068:18;;;20061:30;20127:34;20107:18;;;20100:62;20198:32;20178:18;;;20171:60;20248:19;;29365:174:0;20021:252:1;29365:174:0;29552:21;29561:2;29565:7;29552:8;:21::i;:::-;29164:417;;;:::o;30347:336::-;30542:41;4646:10;30575:7;30542:18;:41::i;:::-;30534:100;;;;-1:-1:-1;;;30534:100:0;;;;;;;:::i;:::-;30647:28;30657:4;30663:2;30667:7;30647:9;:28::i;50984:303::-;5901:13;:11;:13::i;:::-;51124:15:::1;:27:::0;;-1:-1:-1;;;;;;51124:27:0::1;-1:-1:-1::0;;;;;51124:27:0;;::::1;;::::0;;51162:25:::1;:54:::0;;;;::::1;-1:-1:-1::0;;;;;;;;51162:54:0;;::::1;;;::::0;;;51227:24:::1;:52:::0;;-1:-1:-1;;51227:52:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;50984:303::o;53791:534::-;53872:16;53890:21;53962:11;;53945:14;;:28;;;;:::i;:::-;53932:8;:42;;53924:85;;;;-1:-1:-1;;;53924:85:0;;13746:2:1;53924:85:0;;;13728:21:1;13785:2;13765:18;;;13758:30;13824:32;13804:18;;;13797:60;13874:18;;53924:85:0;13718:180:1;53924:85:0;54020:12;54116:1;54099:14;;:18;;;;:::i;:::-;54083:11;;54066:14;;:28;;;;:::i;:::-;54065:53;;;;:::i;:::-;54054:8;:64;54051:214;;;54159:25;;54130:55;;54147:10;;-1:-1:-1;;;54159:25:0;;-1:-1:-1;;;;;54159:25:0;54130:16;:55::i;:::-;54120:65;;54051:214;;;54240:24;;54211:54;;54228:10;;-1:-1:-1;;;;;54240:24:0;54211:16;:54::i;:::-;54201:64;;54051:214;54287:15;;-1:-1:-1;;;;;54287:15:0;;-1:-1:-1;54304:7:0;-1:-1:-1;53791:534:0;;;;;;:::o;41708:256::-;41805:7;41841:23;41858:5;41841:16;:23::i;:::-;41833:5;:31;41825:87;;;;-1:-1:-1;;;41825:87:0;;10581:2:1;41825:87:0;;;10563:21:1;10620:2;10600:18;;;10593:30;10659:34;10639:18;;;10632:62;-1:-1:-1;;;10710:18:1;;;10703:41;10761:19;;41825:87:0;10553:233:1;41825:87:0;-1:-1:-1;;;;;;41930:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;41708:256::o;51610:900::-;5901:13;:11;:13::i;:::-;51697:16;;;::::1;::::0;:37:::1;;;51732:2;51717:11;:17;;51697:37;51689:110;;;;-1:-1:-1::0;;;51689:110:0::1;;;;;;;:::i;:::-;51813:11;51828:1;51813:16;51810:59;;;51852:17;::::0;;-1:-1:-1;;51831:38:0;::::1;51852:17;::::0;;::::1;51851:18;51831:38;::::0;;51810:59:::1;51883:11;51898:1;51883:16;51880:59;;;51922:17;::::0;;-1:-1:-1;;51901:38:0;::::1;51922:17;::::0;;::::1;51921:18;51901:38;::::0;;51880:59:::1;51953:11;51968:1;51953:16;51950:59;;;51992:17;::::0;;-1:-1:-1;;51971:38:0;::::1;51992:17;::::0;;::::1;51991:18;51971:38;::::0;;51950:59:::1;52023:11;52038:1;52023:16;52020:59;;;52062:17;::::0;;-1:-1:-1;;52041:38:0;::::1;52062:17;::::0;;::::1;52061:18;52041:38;::::0;;52020:59:::1;52093:11;52108:1;52093:16;52090:59;;;52132:17;::::0;;-1:-1:-1;;52111:38:0;::::1;52132:17;::::0;;::::1;52131:18;52111:38;::::0;;52090:59:::1;52163:11;52178:1;52163:16;52160:59;;;52202:17;::::0;;-1:-1:-1;;52181:38:0;::::1;52202:17;::::0;;::::1;52201:18;52181:38;::::0;;52160:59:::1;52233:11;52248:1;52233:16;52230:59;;;52272:17;::::0;;-1:-1:-1;;52251:38:0;::::1;52272:17;::::0;;::::1;52271:18;52251:38;::::0;;52230:59:::1;52303:11;52318:1;52303:16;52300:59;;;52342:17;::::0;;-1:-1:-1;;52321:38:0;::::1;52342:17;::::0;;::::1;52341:18;52321:38;::::0;;52300:59:::1;52373:11;52388:1;52373:16;52370:59;;;52412:17;::::0;;-1:-1:-1;;52391:38:0;::::1;52412:17;::::0;;::::1;52411:18;52391:38;::::0;;52370:59:::1;52443:11;52458:2;52443:17;52440:62;;;52484:18;::::0;;-1:-1:-1;;52462:40:0;::::1;52484:18;::::0;;::::1;52483:19;52462:40;::::0;;52440:62:::1;51610:900:::0;:::o;51295:183::-;5901:13;:11;:13::i;:::-;51365:14:::1;::::0;:55:::1;::::0;51347:12:::1;::::0;-1:-1:-1;;;;;51365:14:0::1;::::0;51393:21:::1;::::0;51347:12;51365:55;51347:12;51365:55;51393:21;51365:14;:55:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51346:74;;;51439:7;51431:39;;;::::0;-1:-1:-1;;;51431:39:0;;19701:2:1;51431:39:0::1;::::0;::::1;19683:21:1::0;19740:2;19720:18;;;19713:30;-1:-1:-1;;;19759:18:1;;;19752:49;19818:18;;51431:39:0::1;19673:169:1::0;30754:185:0;30892:39;30909:4;30915:2;30919:7;30892:39;;;;;;;;;;;;:16;:39::i;42230:233::-;42305:7;42341:30;42128:10;:17;;42040:113;42341:30;42333:5;:38;42325:95;;;;-1:-1:-1;;;42325:95:0;;23473:2:1;42325:95:0;;;23455:21:1;23512:2;23492:18;;;23485:30;23551:34;23531:18;;;23524:62;-1:-1:-1;;;23602:18:1;;;23595:42;23654:19;;42325:95:0;23445:234:1;42325:95:0;42438:10;42449:5;42438:17;;;;;;-1:-1:-1;;;42438:17:0;;;;;;;;;;;;;;;;;42431:24;;42230:233;;;:::o;54533:7003::-;54628:1;54619:6;:10;54611:61;;;;-1:-1:-1;;;54611:61:0;;12990:2:1;54611:61:0;;;12972:21:1;13029:2;13009:18;;;13002:30;13068:34;13048:18;;;13041:62;-1:-1:-1;;;13119:18:1;;;13112:36;13165:19;;54611:61:0;12962:228:1;54611:61:0;54705:10;54694:7;6088:6;;-1:-1:-1;;;;;6088:6:0;;6015:87;54694:7;-1:-1:-1;;;;;54694:21:0;;54691:78;;54735:1;54725:6;:11;;54717:52;;;;-1:-1:-1;;;54717:52:0;;16307:2:1;54717:52:0;;;16289:21:1;16346:2;16326:18;;;16319:30;16385;16365:18;;;16358:58;16433:18;;54717:52:0;16279:178:1;54717:52:0;54788:16;;;;;:37;;;54823:2;54808:11;:17;;54788:37;54780:110;;;;-1:-1:-1;;;54780:110:0;;;;;;;:::i;:::-;54908:11;54923:1;54908:16;54905:349;;;54955:10;54944:7;6088:6;;-1:-1:-1;;;;;6088:6:0;;6015:87;54944:7;-1:-1:-1;;;;;54944:21:0;;54941:95;;54975:17;;;;54967:69;;;;-1:-1:-1;;;54967:69:0;;24236:2:1;54967:69:0;;;24218:21:1;24275:2;24255:18;;;24248:30;24314:34;24294:18;;;24287:62;-1:-1:-1;;;24365:18:1;;;24358:37;24412:19;;54967:69:0;24208:229:1;54967:69:0;55081:14;;55059:19;;:36;55051:70;;;;-1:-1:-1;;;55051:70:0;;19351:2:1;55051:70:0;;;19333:21:1;19390:2;19370:18;;;19363:30;-1:-1:-1;;;19409:18:1;;;19402:51;19470:18;;55051:70:0;19323:171:1;55051:70:0;55175:19;;55158:14;;:36;;;;:::i;:::-;55147:6;:48;;55139:103;;;;-1:-1:-1;;;55139:103:0;;;;;;;:::i;:::-;55267:11;55282:1;55267:16;55264:406;;;55314:10;55303:7;6088:6;;-1:-1:-1;;;;;6088:6:0;;6015:87;55303:7;-1:-1:-1;;;;;55303:21:0;;55300:95;;55334:17;;;;55326:69;;;;-1:-1:-1;;;55326:69:0;;17364:2:1;55326:69:0;;;17346:21:1;17403:2;17383:18;;;17376:30;17442:34;17422:18;;;17415:62;-1:-1:-1;;;17493:18:1;;;17486:37;17540:19;;55326:69:0;17336:229:1;55326:69:0;55448:14;;55426:19;;:36;55418:70;;;;-1:-1:-1;;;55418:70:0;;15198:2:1;55418:70:0;;;15180:21:1;15237:2;15217:18;;;15210:30;-1:-1:-1;;;15256:18:1;;;15249:51;15317:18;;55418:70:0;15170:171:1;55418:70:0;55565:19;;55548:14;;:36;;;;:::i;:::-;55537:6;:48;;55529:103;;;;-1:-1:-1;;;55529:103:0;;;;;;;:::i;:::-;55683:11;55698:1;55683:16;55680:406;;;55730:10;55719:7;6088:6;;-1:-1:-1;;;;;6088:6:0;;6015:87;55719:7;-1:-1:-1;;;;;55719:21:0;;55716:95;;55750:17;;;;55742:69;;;;-1:-1:-1;;;55742:69:0;;18182:2:1;55742:69:0;;;18164:21:1;18221:2;18201:18;;;18194:30;18260:34;18240:18;;;18233:62;-1:-1:-1;;;18311:18:1;;;18304:37;18358:19;;55742:69:0;18154:229:1;55742:69:0;55864:14;;55842:19;;:36;55834:70;;;;-1:-1:-1;;;55834:70:0;;20841:2:1;55834:70:0;;;20823:21:1;20880:2;20860:18;;;20853:30;-1:-1:-1;;;20899:18:1;;;20892:51;20960:18;;55834:70:0;20813:171:1;55834:70:0;55981:19;;55964:14;;:36;;;;:::i;:::-;55953:6;:48;;55945:103;;;;-1:-1:-1;;;55945:103:0;;;;;;;:::i;:::-;56099:11;56114:1;56099:16;56096:406;;;56146:10;56135:7;6088:6;;-1:-1:-1;;;;;6088:6:0;;6015:87;56135:7;-1:-1:-1;;;;;56135:21:0;;56132:95;;56166:17;;;;56158:69;;;;-1:-1:-1;;;56158:69:0;;12582:2:1;56158:69:0;;;12564:21:1;12621:2;12601:18;;;12594:30;12660:34;12640:18;;;12633:62;-1:-1:-1;;;12711:18:1;;;12704:37;12758:19;;56158:69:0;12554:229:1;56158:69:0;56280:14;;56258:19;;:36;56250:70;;;;-1:-1:-1;;;56250:70:0;;17014:2:1;56250:70:0;;;16996:21:1;17053:2;17033:18;;;17026:30;-1:-1:-1;;;17072:18:1;;;17065:51;17133:18;;56250:70:0;16986:171:1;56250:70:0;56397:19;;56380:14;;:36;;;;:::i;:::-;56369:6;:48;;56361:103;;;;-1:-1:-1;;;56361:103:0;;;;;;;:::i;:::-;56515:11;56530:1;56515:16;56512:406;;;56562:10;56551:7;6088:6;;-1:-1:-1;;;;;6088:6:0;;6015:87;56551:7;-1:-1:-1;;;;;56551:21:0;;56548:95;;56582:17;;;;56574:69;;;;-1:-1:-1;;;56574:69:0;;9336:2:1;56574:69:0;;;9318:21:1;9375:2;9355:18;;;9348:30;9414:34;9394:18;;;9387:62;-1:-1:-1;;;9465:18:1;;;9458:37;9512:19;;56574:69:0;9308:229:1;56574:69:0;56696:14;;56674:19;;:36;56666:70;;;;-1:-1:-1;;;56666:70:0;;16664:2:1;56666:70:0;;;16646:21:1;16703:2;16683:18;;;16676:30;-1:-1:-1;;;16722:18:1;;;16715:51;16783:18;;56666:70:0;16636:171:1;56666:70:0;56813:19;;56796:14;;:36;;;;:::i;:::-;56785:6;:48;;56777:103;;;;-1:-1:-1;;;56777:103:0;;;;;;;:::i;:::-;56931:11;56946:1;56931:16;56928:406;;;56978:10;56967:7;6088:6;;-1:-1:-1;;;;;6088:6:0;;6015:87;56967:7;-1:-1:-1;;;;;56967:21:0;;56964:95;;56998:17;;;;56990:69;;;;-1:-1:-1;;;56990:69:0;;23065:2:1;56990:69:0;;;23047:21:1;23104:2;23084:18;;;23077:30;23143:34;23123:18;;;23116:62;-1:-1:-1;;;23194:18:1;;;23187:37;23241:19;;56990:69:0;23037:229:1;56990:69:0;57112:14;;57090:19;;:36;57082:70;;;;-1:-1:-1;;;57082:70:0;;23886:2:1;57082:70:0;;;23868:21:1;23925:2;23905:18;;;23898:30;-1:-1:-1;;;23944:18:1;;;23937:51;24005:18;;57082:70:0;23858:171:1;57082:70:0;57229:19;;57212:14;;:36;;;;:::i;:::-;57201:6;:48;;57193:103;;;;-1:-1:-1;;;57193:103:0;;;;;;;:::i;:::-;57347:11;57362:1;57347:16;57344:406;;;57394:10;57383:7;6088:6;;-1:-1:-1;;;;;6088:6:0;;6015:87;57383:7;-1:-1:-1;;;;;57383:21:0;;57380:95;;57414:17;;;;57406:69;;;;-1:-1:-1;;;57406:69:0;;25410:2:1;57406:69:0;;;25392:21:1;25449:2;25429:18;;;25422:30;25488:34;25468:18;;;25461:62;-1:-1:-1;;;25539:18:1;;;25532:37;25586:19;;57406:69:0;25382:229:1;57406:69:0;57528:14;;57506:19;;:36;57498:70;;;;-1:-1:-1;;;57498:70:0;;21960:2:1;57498:70:0;;;21942:21:1;21999:2;21979:18;;;21972:30;-1:-1:-1;;;22018:18:1;;;22011:51;22079:18;;57498:70:0;21932:171:1;57498:70:0;57645:19;;57628:14;;:36;;;;:::i;:::-;57617:6;:48;;57609:103;;;;-1:-1:-1;;;57609:103:0;;;;;;;:::i;:::-;57763:11;57778:1;57763:16;57760:406;;;57810:10;57799:7;6088:6;;-1:-1:-1;;;;;6088:6:0;;6015:87;57799:7;-1:-1:-1;;;;;57799:21:0;;57796:95;;57830:17;;;;57822:69;;;;-1:-1:-1;;;57822:69:0;;9744:2:1;57822:69:0;;;9726:21:1;9783:2;9763:18;;;9756:30;9822:34;9802:18;;;9795:62;-1:-1:-1;;;9873:18:1;;;9866:37;9920:19;;57822:69:0;9716:229:1;57822:69:0;57944:14;;57922:19;;:36;57914:70;;;;-1:-1:-1;;;57914:70:0;;18590:2:1;57914:70:0;;;18572:21:1;18629:2;18609:18;;;18602:30;-1:-1:-1;;;18648:18:1;;;18641:51;18709:18;;57914:70:0;18562:171:1;57914:70:0;58061:19;;58044:14;;:36;;;;:::i;:::-;58033:6;:48;;58025:103;;;;-1:-1:-1;;;58025:103:0;;;;;;;:::i;:::-;58179:11;58194:1;58179:16;58176:406;;;58226:10;58215:7;6088:6;;-1:-1:-1;;;;;6088:6:0;;6015:87;58215:7;-1:-1:-1;;;;;58215:21:0;;58212:95;;58246:17;;;;58238:69;;;;-1:-1:-1;;;58238:69:0;;21552:2:1;58238:69:0;;;21534:21:1;21591:2;21571:18;;;21564:30;21630:34;21610:18;;;21603:62;-1:-1:-1;;;21681:18:1;;;21674:37;21728:19;;58238:69:0;21524:229:1;58238:69:0;58360:14;;58338:19;;:36;58330:70;;;;-1:-1:-1;;;58330:70:0;;15957:2:1;58330:70:0;;;15939:21:1;15996:2;15976:18;;;15969:30;-1:-1:-1;;;16015:18:1;;;16008:51;16076:18;;58330:70:0;15929:171:1;58330:70:0;58477:19;;58460:14;;:36;;;;:::i;:::-;58449:6;:48;;58441:103;;;;-1:-1:-1;;;58441:103:0;;;;;;;:::i;:::-;58595:11;58610:2;58595:17;58592:412;;;58643:10;58632:7;6088:6;;-1:-1:-1;;;;;6088:6:0;;6015:87;58632:7;-1:-1:-1;;;;;58632:21:0;;58629:97;;58663:18;;;;58655:71;;;;-1:-1:-1;;;58655:71:0;;15548:2:1;58655:71:0;;;15530:21:1;15587:2;15567:18;;;15560:30;15626:34;15606:18;;;15599:62;-1:-1:-1;;;15677:18:1;;;15670:38;15725:19;;58655:71:0;15520:230:1;58655:71:0;58780:14;;58757:20;;:37;58749:72;;;;-1:-1:-1;;;58749:72:0;;24644:2:1;58749:72:0;;;24626:21:1;24683:2;24663:18;;;24656:30;-1:-1:-1;;;24702:18:1;;;24695:52;24764:18;;58749:72:0;24616:172:1;58749:72:0;58898:20;;58881:14;;:37;;;;:::i;:::-;58870:6;:49;;58862:104;;;;-1:-1:-1;;;58862:104:0;;;;;;;:::i;:::-;59032:1;59016:2513;59040:6;59035:1;:11;59016:2513;;59099:1;59135;59120:16;;59117:232;;;59230:19;:21;;;:19;:21;;;:::i;:::-;;;;-1:-1:-1;;59270:13:0;:15;;;:13;:15;;;:::i;:::-;;;;;;59314:19;;59304:29;;59117:232;59366:11;59381:1;59366:16;59363:198;;;59419:19;:21;;;:19;:21;;;:::i;:::-;;;;-1:-1:-1;;59459:13:0;:15;;;:13;:15;;;:::i;:::-;;;;-1:-1:-1;;59526:14:0;;:18;;59543:1;59526:18;:::i;:::-;59503:19;;:42;;;;:::i;:::-;59493:52;;59363:198;59578:11;59593:1;59578:16;59575:198;;;59631:19;:21;;;:19;:21;;;:::i;:::-;;;;-1:-1:-1;;59671:13:0;:15;;;:13;:15;;;:::i;:::-;;;;-1:-1:-1;;59738:14:0;;:18;;59755:1;59738:18;:::i;:::-;59715:19;;:42;;;;:::i;:::-;59705:52;;59575:198;59790:11;59805:1;59790:16;59787:198;;;59843:19;:21;;;:19;:21;;;:::i;:::-;;;;-1:-1:-1;;59883:13:0;:15;;;:13;:15;;;:::i;:::-;;;;-1:-1:-1;;59950:14:0;;:18;;59967:1;59950:18;:::i;:::-;59927:19;;:42;;;;:::i;:::-;59917:52;;59787:198;60002:11;60017:1;60002:16;59999:198;;;60055:19;:21;;;:19;:21;;;:::i;:::-;;;;-1:-1:-1;;60095:13:0;:15;;;:13;:15;;;:::i;:::-;;;;-1:-1:-1;;60162:14:0;;:18;;60179:1;60162:18;:::i;:::-;60139:19;;:42;;;;:::i;:::-;60129:52;;59999:198;60214:11;60229:1;60214:16;60211:198;;;60267:19;:21;;;:19;:21;;;:::i;:::-;;;;-1:-1:-1;;60307:13:0;:15;;;:13;:15;;;:::i;:::-;;;;-1:-1:-1;;60374:14:0;;:18;;60391:1;60374:18;:::i;:::-;60351:19;;:42;;;;:::i;:::-;60341:52;;60211:198;60426:11;60441:1;60426:16;60423:198;;;60479:19;:21;;;:19;:21;;;:::i;:::-;;;;-1:-1:-1;;60519:13:0;:15;;;:13;:15;;;:::i;:::-;;;;-1:-1:-1;;60586:14:0;;:18;;60603:1;60586:18;:::i;:::-;60563:19;;:42;;;;:::i;:::-;60553:52;;60423:198;60638:11;60653:1;60638:16;60635:198;;;60691:19;:21;;;:19;:21;;;:::i;:::-;;;;-1:-1:-1;;60731:13:0;:15;;;:13;:15;;;:::i;:::-;;;;-1:-1:-1;;60798:14:0;;:18;;60815:1;60798:18;:::i;:::-;60775:19;;:42;;;;:::i;:::-;60765:52;;60635:198;60850:11;60865:1;60850:16;60847:198;;;60903:19;:21;;;:19;:21;;;:::i;:::-;;;;-1:-1:-1;;60943:13:0;:15;;;:13;:15;;;:::i;:::-;;;;-1:-1:-1;;61010:14:0;;:18;;61027:1;61010:18;:::i;:::-;60987:19;;:42;;;;:::i;:::-;60977:52;;60847:198;61062:11;61077:2;61062:17;61059:201;;;61116:20;:22;;;:20;:22;;;:::i;:::-;;;;-1:-1:-1;;61157:13:0;:15;;;:13;:15;;;:::i;:::-;;;;-1:-1:-1;;61225:14:0;;:18;;61242:1;61225:18;:::i;:::-;61201:20;;:43;;;;:::i;:::-;61191:53;;61059:201;61290:10;61279:7;6088:6;;-1:-1:-1;;;;;6088:6:0;;6015:87;61279:7;-1:-1:-1;;;;;61279:21:0;;61276:66;;;61309:9;:22;61301:41;;;;-1:-1:-1;;;61301:41:0;;14105:2:1;61301:41:0;;;14087:21:1;14144:1;14124:18;;;14117:29;-1:-1:-1;;;14162:18:1;;;14155:36;14208:18;;61301:41:0;14077:155:1;61301:41:0;61371:10;61360:7;6088:6;;-1:-1:-1;;;;;6088:6:0;;6015:87;61360:7;-1:-1:-1;;;;;61360:21:0;;61357:96;;61417:6;61405:9;;:18;;;;:::i;:::-;61391:9;:33;61383:70;;;;-1:-1:-1;;;61383:70:0;;25818:2:1;61383:70:0;;;25800:21:1;25857:2;25837:18;;;25830:30;25896:26;25876:18;;;25869:54;25940:18;;61383:70:0;25790:174:1;61383:70:0;61468:13;61473:7;61468:4;:13::i;:::-;-1:-1:-1;59048:3:0;;;;:::i;:::-;;;;59016:2513;;27845:222;27917:7;27953:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27953:16:0;27988:19;27980:56;;;;-1:-1:-1;;;27980:56:0;;22310:2:1;27980:56:0;;;22292:21:1;22349:2;22329:18;;;22322:30;-1:-1:-1;;;22368:18:1;;;22361:54;22432:18;;27980:56:0;22282:174:1;27576:207:0;27648:7;-1:-1:-1;;;;;27676:19:0;;27668:73;;;;-1:-1:-1;;;27668:73:0;;17772:2:1;27668:73:0;;;17754:21:1;17811:2;17791:18;;;17784:30;17850:34;17830:18;;;17823:62;-1:-1:-1;;;17901:18:1;;;17894:39;17950:19;;27668:73:0;17744:231:1;27668:73:0;-1:-1:-1;;;;;;27759:16:0;;;;;:9;:16;;;;;;;27576:207::o;6663:103::-;5901:13;:11;:13::i;:::-;6728:30:::1;6755:1;6728:18;:30::i;:::-;6663:103::o:0;51486:116::-;5901:13;:11;:13::i;:::-;51569:14:::1;:25:::0;;-1:-1:-1;;;;;;51569:25:0::1;-1:-1:-1::0;;;;;51569:25:0;;;::::1;::::0;;;::::1;::::0;;51486:116::o;50007:::-;5901:13;:11;:13::i;:::-;50089:26:::1;:11;50103:12:::0;;50089:26:::1;:::i;28303:104::-:0;28359:13;28392:7;28385:14;;;;;:::i;29890:155::-;29985:52;4646:10;30018:8;30028;29985:18;:52::i;:::-;29890:155;;:::o;31010:323::-;31184:41;4646:10;31217:7;31184:18;:41::i;:::-;31176:100;;;;-1:-1:-1;;;31176:100:0;;;;;;;:::i;:::-;31287:38;31301:4;31307:2;31311:7;31320:4;31287:13;:38::i;:::-;31010:323;;;;:::o;52535:1220::-;32905:4;32929:16;;;:7;:16;;;;;;52601:13;;-1:-1:-1;;;;;32929:16:0;52626:50;;;;-1:-1:-1;;;52626:50:0;;13397:2:1;52626:50:0;;;13379:21:1;13436:2;13416:18;;;13409:30;-1:-1:-1;;;13455:18:1;;;13448:50;13515:18;;52626:50:0;13369:170:1;52626:50:0;52687:17;52729:1;52718:8;:12;:42;;;;;52746:14;;52734:8;:26;;52718:42;52715:66;;;52768:13;52762:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52715:66;52806:14;;52795:8;:25;:59;;;;-1:-1:-1;52836:14:0;;:18;;52853:1;52836:18;:::i;:::-;52824:8;:30;;52795:59;52792:83;;;52862:13;52856:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52792:83;52900:14;;:18;;52917:1;52900:18;:::i;:::-;52889:8;:29;:63;;;;-1:-1:-1;52934:14:0;;:18;;52951:1;52934:18;:::i;:::-;52922:8;:30;;52889:63;52886:87;;;52960:13;52954:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52886:87;52998:14;;:18;;53015:1;52998:18;:::i;:::-;52987:8;:29;:63;;;;-1:-1:-1;53032:14:0;;:18;;53049:1;53032:18;:::i;:::-;53020:8;:30;;52987:63;52984:87;;;53058:13;53052:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52984:87;53096:14;;:18;;53113:1;53096:18;:::i;:::-;53085:8;:29;:63;;;;-1:-1:-1;53130:14:0;;:18;;53147:1;53130:18;:::i;:::-;53118:8;:30;;53085:63;53082:87;;;53156:13;53150:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53082:87;53194:14;;:18;;53211:1;53194:18;:::i;:::-;53183:8;:29;:63;;;;-1:-1:-1;53228:14:0;;:18;;53245:1;53228:18;:::i;:::-;53216:8;:30;;53183:63;53180:87;;;53254:13;53248:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53180:87;53292:14;;:18;;53309:1;53292:18;:::i;:::-;53281:8;:29;:63;;;;-1:-1:-1;53326:14:0;;:18;;53343:1;53326:18;:::i;:::-;53314:8;:30;;53281:63;53278:87;;;53352:13;53346:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53278:87;53390:14;;:18;;53407:1;53390:18;:::i;:::-;53379:8;:29;:63;;;;-1:-1:-1;53424:14:0;;:18;;53441:1;53424:18;:::i;:::-;53412:8;:30;;53379:63;53376:87;;;53450:13;53444:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53376:87;53488:14;;:18;;53505:1;53488:18;:::i;:::-;53477:8;:29;:63;;;;-1:-1:-1;53522:14:0;;:18;;53539:1;53522:18;:::i;:::-;53510:8;:30;;53477:63;53474:87;;;53548:13;53542:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53474:87;53586:14;;:18;;53603:1;53586:18;:::i;:::-;53575:8;:29;:64;;;;-1:-1:-1;53620:14:0;;:19;;53637:2;53620:19;:::i;:::-;53608:8;:31;;53575:64;53572:89;;;53647:14;53641:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53572:89;53705:3;53710:26;53727:8;53710:16;:26::i;:::-;53688:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53674:73;;;52535:1220;;;:::o;50131:845::-;5901:13;:11;:13::i;:::-;50246:16;;;::::1;::::0;:37:::1;;;50281:2;50266:11;:17;;50246:37;50238:110;;;;-1:-1:-1::0;;;50238:110:0::1;;;;;;;:::i;:::-;50362:11;50377:1;50362:16;50359:50;;;50380:29;:13;50396::::0;;50380:29:::1;:::i;:::-;;50359:50;50423:11;50438:1;50423:16;50420:50;;;50441:29;:13;50457::::0;;50441:29:::1;:::i;:::-;;50420:50;50484:11;50499:1;50484:16;50481:50;;;50502:29;:13;50518::::0;;50502:29:::1;:::i;:::-;;50481:50;50545:11;50560:1;50545:16;50542:50;;;50563:29;:13;50579::::0;;50563:29:::1;:::i;:::-;;50542:50;50606:11;50621:1;50606:16;50603:50;;;50624:29;:13;50640::::0;;50624:29:::1;:::i;:::-;;50603:50;50667:11;50682:1;50667:16;50664:50;;;50685:29;:13;50701::::0;;50685:29:::1;:::i;:::-;;50664:50;50728:11;50743:1;50728:16;50725:50;;;50746:29;:13;50762::::0;;50746:29:::1;:::i;:::-;;50725:50;50789:11;50804:1;50789:16;50786:50;;;50807:29;:13;50823::::0;;50807:29:::1;:::i;:::-;;50786:50;50850:11;50865:1;50850:16;50847:50;;;50868:29;:13;50884::::0;;50868:29:::1;:::i;:::-;;50847:50;50911:11;50926:2;50911:17;50908:52;;;50930:30;:14;50947:13:::0;;50930:30:::1;:::i;47999:25::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6921:201::-;5901:13;:11;:13::i;:::-;-1:-1:-1;;;;;7010:22:0;::::1;7002:73;;;::::0;-1:-1:-1;;;7002:73:0;;11412:2:1;7002:73:0::1;::::0;::::1;11394:21:1::0;11451:2;11431:18;;;11424:30;11490:34;11470:18;;;11463:62;-1:-1:-1;;;11541:18:1;;;11534:36;11587:19;;7002:73:0::1;11384:228:1::0;7002:73:0::1;7086:28;7105:8;7086:18;:28::i;49907:92::-:0;5901:13;:11;:13::i;:::-;49974:9:::1;:17:::0;49907:92::o;41400:224::-;41502:4;-1:-1:-1;;;;;;41526:50:0;;-1:-1:-1;;;41526:50:0;;:90;;;41580:36;41604:11;41580:23;:36::i;37622:135::-;32905:4;32929:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32929:16:0;37696:53;;;;-1:-1:-1;;;37696:53:0;;22310:2:1;37696:53:0;;;22292:21:1;22349:2;22329:18;;;22322:30;-1:-1:-1;;;22368:18:1;;;22361:54;22432:18;;37696:53:0;22282:174:1;36901::0;36976:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36976:29:0;-1:-1:-1;;;;;36976:29:0;;;;;;;;:24;;37030:23;36976:24;37030:14;:23::i;:::-;-1:-1:-1;;;;;37021:46:0;;;;;;;;;;;36901:174;;:::o;33134:264::-;33227:4;33244:13;33260:23;33275:7;33260:14;:23::i;:::-;33244:39;;33313:5;-1:-1:-1;;;;;33302:16:0;:7;-1:-1:-1;;;;;33302:16:0;;:52;;;-1:-1:-1;;;;;;30237:25:0;;;30213:4;30237:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;33322:32;33302:87;;;;33382:7;-1:-1:-1;;;;;33358:31:0;:20;33370:7;33358:11;:20::i;:::-;-1:-1:-1;;;;;33358:31:0;;33302:87;33294:96;33134:264;-1:-1:-1;;;;33134:264:0:o;36157:625::-;36316:4;-1:-1:-1;;;;;36289:31:0;:23;36304:7;36289:14;:23::i;:::-;-1:-1:-1;;;;;36289:31:0;;36281:81;;;;-1:-1:-1;;;36281:81:0;;11819:2:1;36281:81:0;;;11801:21:1;11858:2;11838:18;;;11831:30;11897:34;11877:18;;;11870:62;-1:-1:-1;;;11948:18:1;;;11941:35;11993:19;;36281:81:0;11791:227:1;36281:81:0;-1:-1:-1;;;;;36381:16:0;;36373:65;;;;-1:-1:-1;;;36373:65:0;;14439:2:1;36373:65:0;;;14421:21:1;14478:2;14458:18;;;14451:30;14517:34;14497:18;;;14490:62;-1:-1:-1;;;14568:18:1;;;14561:34;14612:19;;36373:65:0;14411:226:1;36373:65:0;36451:39;36472:4;36478:2;36482:7;36451:20;:39::i;:::-;36555:29;36572:1;36576:7;36555:8;:29::i;:::-;-1:-1:-1;;;;;36597:15:0;;;;;;:9;:15;;;;;:20;;36616:1;;36597:15;:20;;36616:1;;36597:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36628:13:0;;;;;;:9;:13;;;;;:18;;36645:1;;36628:13;:18;;36645:1;;36628:18;:::i;:::-;;;;-1:-1:-1;;36657:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36657:21:0;-1:-1:-1;;;;;36657:21:0;;;;;;;;;36696:27;;36657:16;;36696:27;;;;;;;29164:417;;;:::o;6180:132::-;6088:6;;-1:-1:-1;;;;;6088:6:0;4646:10;6244:23;6236:68;;;;-1:-1:-1;;;6236:68:0;;21191:2:1;6236:68:0;;;21173:21:1;;;21210:18;;;21203:30;21269:34;21249:18;;;21242:62;21321:18;;6236:68:0;21163:182:1;54333:180:0;54429:7;54487:18;54465;54478:5;54465:10;:18;:::i;:::-;54464:41;;;;:::i;:::-;54457:48;54333:180;-1:-1:-1;;;54333:180:0:o;61544:116::-;61598:30;61608:10;61620:7;61598:9;:30::i;7282:191::-;7375:6;;;-1:-1:-1;;;;;7392:17:0;;;-1:-1:-1;;;;;;7392:17:0;;;;;;;7425:40;;7375:6;;;7392:17;7375:6;;7425:40;;7356:16;;7425:40;7282:191;;:::o;37218:315::-;37373:8;-1:-1:-1;;;;;37364:17:0;:5;-1:-1:-1;;;;;37364:17:0;;;37356:55;;;;-1:-1:-1;;;37356:55:0;;14844:2:1;37356:55:0;;;14826:21:1;14883:2;14863:18;;;14856:30;14922:27;14902:18;;;14895:55;14967:18;;37356:55:0;14816:175:1;37356:55:0;-1:-1:-1;;;;;37422:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;37422:46:0;;;;;;;;;;37484:41;;8858::1;;;37484::0;;8831:18:1;37484:41:0;;;;;;;37218:315;;;:::o;32214:313::-;32370:28;32380:4;32386:2;32390:7;32370:9;:28::i;:::-;32417:47;32440:4;32446:2;32450:7;32459:4;32417:22;:47::i;:::-;32409:110;;;;-1:-1:-1;;;32409:110:0;;;;;;;:::i;1820:723::-;1876:13;2097:10;2093:53;;-1:-1:-1;;2124:10:0;;;;;;;;;;;;-1:-1:-1;;;2124:10:0;;;;;1820:723::o;2093:53::-;2171:5;2156:12;2212:78;2219:9;;2212:78;;2245:8;;;;:::i;:::-;;-1:-1:-1;2268:10:0;;-1:-1:-1;2276:2:0;2268:10;;:::i;:::-;;;2212:78;;;2300:19;2332:6;2322:17;;;;;;-1:-1:-1;;;2322:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2322:17:0;;2300:39;;2350:154;2357:10;;2350:154;;2384:11;2394:1;2384:11;;:::i;:::-;;-1:-1:-1;2453:10:0;2461:2;2453:5;:10;:::i;:::-;2440:24;;:2;:24;:::i;:::-;2427:39;;2410:6;2417;2410:14;;;;;;-1:-1:-1;;;2410:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;2410:56:0;;;;;;;;-1:-1:-1;2481:11:0;2490:2;2481:11;;:::i;:::-;;;2350:154;;27207:305;27309:4;-1:-1:-1;;;;;;27346:40:0;;-1:-1:-1;;;27346:40:0;;:105;;-1:-1:-1;;;;;;;27403:48:0;;-1:-1:-1;;;27403:48:0;27346:105;:158;;;-1:-1:-1;;;;;;;;;;18978:40:0;;;27468:36;18869:157;61668:204;61819:45;61846:4;61852:2;61856:7;61819:26;:45::i;33740:110::-;33816:26;33826:2;33830:7;33816:26;;;;;;;;;;;;:9;:26::i;38321:853::-;38475:4;-1:-1:-1;;;;;38496:13:0;;9008:19;:23;38492:675;;38532:71;;-1:-1:-1;;;38532:71:0;;-1:-1:-1;;;;;38532:36:0;;;;;:71;;4646:10;;38583:4;;38589:7;;38598:4;;38532:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38532:71:0;;;;;;;;-1:-1:-1;;38532:71:0;;;;;;;;;;;;:::i;:::-;;;38528:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38773:13:0;;38769:328;;38816:60;;-1:-1:-1;;;38816:60:0;;;;;;;:::i;38769:328::-;39047:6;39041:13;39032:6;39028:2;39024:15;39017:38;38528:584;-1:-1:-1;;;;;;38654:51:0;-1:-1:-1;;;38654:51:0;;-1:-1:-1;38647:58:0;;38492:675;-1:-1:-1;39151:4:0;38321:853;;;;;;:::o;43076:589::-;-1:-1:-1;;;;;43282:18:0;;43278:187;;43317:40;43349:7;44492:10;:17;;44465:24;;;;:15;:24;;;;;:44;;;44520:24;;;;;;;;;;;;44388:164;43317:40;43278:187;;;43387:2;-1:-1:-1;;;;;43379:10:0;:4;-1:-1:-1;;;;;43379:10:0;;43375:90;;43406:47;43439:4;43445:7;43406:32;:47::i;:::-;-1:-1:-1;;;;;43479:16:0;;43475:183;;43512:45;43549:7;43512:36;:45::i;43475:183::-;43585:4;-1:-1:-1;;;;;43579:10:0;:2;-1:-1:-1;;;;;43579:10:0;;43575:83;;43606:40;43634:2;43638:7;43606:27;:40::i;34077:319::-;34206:18;34212:2;34216:7;34206:5;:18::i;:::-;34257:53;34288:1;34292:2;34296:7;34305:4;34257:22;:53::i;:::-;34235:153;;;;-1:-1:-1;;;34235:153:0;;;;;;;:::i;45179:988::-;45445:22;45495:1;45470:22;45487:4;45470:16;:22::i;:::-;:26;;;;:::i;:::-;45507:18;45528:26;;;:17;:26;;;;;;45445:51;;-1:-1:-1;45661:28:0;;;45657:328;;-1:-1:-1;;;;;45728:18:0;;45706:19;45728:18;;;:12;:18;;;;;;;;:34;;;;;;;;;45779:30;;;;;;:44;;;45896:30;;:17;:30;;;;;:43;;;45657:328;-1:-1:-1;46081:26:0;;;;:17;:26;;;;;;;;46074:33;;;-1:-1:-1;;;;;46125:18:0;;;;;:12;:18;;;;;:34;;;;;;;46118:41;45179:988::o;46462:1079::-;46740:10;:17;46715:22;;46740:21;;46760:1;;46740:21;:::i;:::-;46772:18;46793:24;;;:15;:24;;;;;;47166:10;:26;;46715:46;;-1:-1:-1;46793:24:0;;46715:46;;47166:26;;;;-1:-1:-1;;;47166:26:0;;;;;;;;;;;;;;;;;47144:48;;47230:11;47205:10;47216;47205:22;;;;;;-1:-1:-1;;;47205:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;47310:28;;;:15;:28;;;;;;;:41;;;47482:24;;;;;47475:31;47517:10;:16;;;;;-1:-1:-1;;;47517:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;46462:1079;;;;:::o;43966:221::-;44051:14;44068:20;44085:2;44068:16;:20::i;:::-;-1:-1:-1;;;;;44099:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;44144:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;43966:221:0:o;34732:439::-;-1:-1:-1;;;;;34812:16:0;;34804:61;;;;-1:-1:-1;;;34804:61:0;;20480:2:1;34804:61:0;;;20462:21:1;;;20499:18;;;20492:30;20558:34;20538:18;;;20531:62;20610:18;;34804:61:0;20452:182:1;34804:61:0;32905:4;32929:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32929:16:0;:30;34876:58;;;;-1:-1:-1;;;34876:58:0;;12225:2:1;34876:58:0;;;12207:21:1;12264:2;12244:18;;;12237:30;12303;12283:18;;;12276:58;12351:18;;34876:58:0;12197:178:1;34876:58:0;34947:45;34976:1;34980:2;34984:7;34947:20;:45::i;:::-;-1:-1:-1;;;;;35005:13:0;;;;;;:9;:13;;;;;:18;;35022:1;;35005:13;:18;;35022:1;;35005:18;:::i;:::-;;;;-1:-1:-1;;35034:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35034:21:0;-1:-1:-1;;;;;35034:21:0;;;;;;;;35073:33;;35034:16;;;35073:33;;35034:16;;35073:33;29890:155;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:376:1;66:8;76:6;130:3;123:4;115:6;111:17;107:27;97:2;;155:8;145;138:26;97:2;-1:-1:-1;185:20:1;;228:18;217:30;;214:2;;;267:8;257;250:26;214:2;311:4;303:6;299:17;287:29;;363:3;356:4;347:6;339;335:19;331:30;328:39;325:2;;;380:1;377;370:12;395:179;462:20;;-1:-1:-1;;;;;511:38:1;;501:49;;491:2;;564:1;561;554:12;491:2;443:131;;;:::o;579:257::-;638:6;691:2;679:9;670:7;666:23;662:32;659:2;;;712:6;704;697:22;659:2;756:9;743:23;775:31;800:5;775:31;:::i;1111:398::-;1179:6;1187;1240:2;1228:9;1219:7;1215:23;1211:32;1208:2;;;1261:6;1253;1246:22;1208:2;1305:9;1292:23;1324:31;1349:5;1324:31;:::i;:::-;1374:5;-1:-1:-1;1431:2:1;1416:18;;1403:32;1444:33;1403:32;1444:33;:::i;:::-;1496:7;1486:17;;;1198:311;;;;;:::o;1514:466::-;1591:6;1599;1607;1660:2;1648:9;1639:7;1635:23;1631:32;1628:2;;;1681:6;1673;1666:22;1628:2;1725:9;1712:23;1744:31;1769:5;1744:31;:::i;:::-;1794:5;-1:-1:-1;1851:2:1;1836:18;;1823:32;1864:33;1823:32;1864:33;:::i;:::-;1618:362;;1916:7;;-1:-1:-1;;;1970:2:1;1955:18;;;;1942:32;;1618:362::o;1985:1311::-;2080:6;2088;2096;2104;2157:3;2145:9;2136:7;2132:23;2128:33;2125:2;;;2179:6;2171;2164:22;2125:2;2223:9;2210:23;2242:31;2267:5;2242:31;:::i;:::-;2292:5;-1:-1:-1;2349:2:1;2334:18;;2321:32;2362:33;2321:32;2362:33;:::i;:::-;2414:7;-1:-1:-1;2468:2:1;2453:18;;2440:32;;-1:-1:-1;2523:2:1;2508:18;;2495:32;2546:18;2576:14;;;2573:2;;;2608:6;2600;2593:22;2573:2;2651:6;2640:9;2636:22;2626:32;;2696:7;2689:4;2685:2;2681:13;2677:27;2667:2;;2723:6;2715;2708:22;2667:2;2764;2751:16;2786:2;2782;2779:10;2776:2;;;2792:18;;:::i;:::-;2867:2;2861:9;2835:2;2921:13;;-1:-1:-1;;2917:22:1;;;2941:2;2913:31;2909:40;2897:53;;;2965:18;;;2985:22;;;2962:46;2959:2;;;3011:18;;:::i;:::-;3051:10;3047:2;3040:22;3086:2;3078:6;3071:18;3126:7;3121:2;3116;3112;3108:11;3104:20;3101:33;3098:2;;;3152:6;3144;3137:22;3098:2;3213;3208;3204;3200:11;3195:2;3187:6;3183:15;3170:46;3236:15;;;3253:2;3232:24;3225:40;;;;2115:1181;;;;-1:-1:-1;2115:1181:1;;-1:-1:-1;;;;2115:1181:1:o;3301:436::-;3366:6;3374;3427:2;3415:9;3406:7;3402:23;3398:32;3395:2;;;3448:6;3440;3433:22;3395:2;3492:9;3479:23;3511:31;3536:5;3511:31;:::i;:::-;3561:5;-1:-1:-1;3618:2:1;3603:18;;3590:32;3660:15;;3653:23;3641:36;;3631:2;;3696:6;3688;3681:22;3742:325;3810:6;3818;3871:2;3859:9;3850:7;3846:23;3842:32;3839:2;;;3892:6;3884;3877:22;3839:2;3936:9;3923:23;3955:31;3980:5;3955:31;:::i;:::-;4005:5;4057:2;4042:18;;;;4029:32;;-1:-1:-1;;;3829:238:1:o;4072:401::-;4147:6;4155;4163;4216:2;4204:9;4195:7;4191:23;4187:32;4184:2;;;4237:6;4229;4222:22;4184:2;4281:9;4268:23;4300:31;4325:5;4300:31;:::i;:::-;4350:5;-1:-1:-1;4374:37:1;4407:2;4392:18;;4374:37;:::i;:::-;4364:47;;4430:37;4463:2;4452:9;4448:18;4430:37;:::i;:::-;4420:47;;4174:299;;;;;:::o;4478:255::-;4536:6;4589:2;4577:9;4568:7;4564:23;4560:32;4557:2;;;4610:6;4602;4595:22;4557:2;4654:9;4641:23;4673:30;4697:5;4673:30;:::i;4738:259::-;4807:6;4860:2;4848:9;4839:7;4835:23;4831:32;4828:2;;;4881:6;4873;4866:22;4828:2;4918:9;4912:16;4937:30;4961:5;4937:30;:::i;5002:431::-;5073:6;5081;5134:2;5122:9;5113:7;5109:23;5105:32;5102:2;;;5155:6;5147;5140:22;5102:2;5200:9;5187:23;5233:18;5225:6;5222:30;5219:2;;;5270:6;5262;5255:22;5219:2;5314:59;5365:7;5356:6;5345:9;5341:22;5314:59;:::i;:::-;5392:8;;5288:85;;-1:-1:-1;5092:341:1;-1:-1:-1;;;;5092:341:1:o;5438:499::-;5518:6;5526;5534;5587:2;5575:9;5566:7;5562:23;5558:32;5555:2;;;5608:6;5600;5593:22;5555:2;5653:9;5640:23;5686:18;5678:6;5675:30;5672:2;;;5723:6;5715;5708:22;5672:2;5767:59;5818:7;5809:6;5798:9;5794:22;5767:59;:::i;:::-;5845:8;;5741:85;;-1:-1:-1;5927:2:1;5912:18;;;;5899:32;;5545:392;-1:-1:-1;;;;5545:392:1:o;5942:190::-;6001:6;6054:2;6042:9;6033:7;6029:23;6025:32;6022:2;;;6075:6;6067;6060:22;6022:2;-1:-1:-1;6103:23:1;;6012:120;-1:-1:-1;6012:120:1:o;6137:258::-;6205:6;6213;6266:2;6254:9;6245:7;6241:23;6237:32;6234:2;;;6287:6;6279;6272:22;6234:2;-1:-1:-1;;6315:23:1;;;6385:2;6370:18;;;6357:32;;-1:-1:-1;6224:171:1:o;6400:257::-;6441:3;6479:5;6473:12;6506:6;6501:3;6494:19;6522:63;6578:6;6571:4;6566:3;6562:14;6555:4;6548:5;6544:16;6522:63;:::i;:::-;6639:2;6618:15;-1:-1:-1;;6614:29:1;6605:39;;;;6646:4;6601:50;;6449:208;-1:-1:-1;;6449:208:1:o;6662:637::-;6942:3;6980:6;6974:13;6996:53;7042:6;7037:3;7030:4;7022:6;7018:17;6996:53;:::i;:::-;7112:13;;7071:16;;;;7134:57;7112:13;7071:16;7168:4;7156:17;;7134:57;:::i;:::-;-1:-1:-1;;;7213:20:1;;7242:22;;;7291:1;7280:13;;6950:349;-1:-1:-1;;;;6950:349:1:o;7946:488::-;-1:-1:-1;;;;;8215:15:1;;;8197:34;;8267:15;;8262:2;8247:18;;8240:43;8314:2;8299:18;;8292:34;;;8362:3;8357:2;8342:18;;8335:31;;;8140:4;;8383:45;;8408:19;;8400:6;8383:45;:::i;:::-;8375:53;8149:285;-1:-1:-1;;;;;;8149:285:1:o;8910:219::-;9059:2;9048:9;9041:21;9022:4;9079:44;9119:2;9108:9;9104:18;9096:6;9079:44;:::i;9950:424::-;10152:2;10134:21;;;10191:2;10171:18;;;10164:30;10230:34;10225:2;10210:18;;10203:62;10301:30;10296:2;10281:18;;10274:58;10364:3;10349:19;;10124:250::o;10791:414::-;10993:2;10975:21;;;11032:2;11012:18;;;11005:30;11071:34;11066:2;11051:18;;11044:62;-1:-1:-1;;;11137:2:1;11122:18;;11115:48;11195:3;11180:19;;10965:240::o;18738:406::-;18940:2;18922:21;;;18979:2;18959:18;;;18952:30;19018:34;19013:2;18998:18;;18991:62;-1:-1:-1;;;19084:2:1;19069:18;;19062:40;19134:3;19119:19;;18912:232::o;24793:410::-;24995:2;24977:21;;;25034:2;25014:18;;;25007:30;25073:34;25068:2;25053:18;;25046:62;-1:-1:-1;;;25139:2:1;25124:18;;25117:44;25193:3;25178:19;;24967:236::o;26364:128::-;26404:3;26435:1;26431:6;26428:1;26425:13;26422:2;;;26441:18;;:::i;:::-;-1:-1:-1;26477:9:1;;26412:80::o;26497:120::-;26537:1;26563;26553:2;;26568:18;;:::i;:::-;-1:-1:-1;26602:9:1;;26543:74::o;26622:168::-;26662:7;26728:1;26724;26720:6;26716:14;26713:1;26710:21;26705:1;26698:9;26691:17;26687:45;26684:2;;;26735:18;;:::i;:::-;-1:-1:-1;26775:9:1;;26674:116::o;26795:125::-;26835:4;26863:1;26860;26857:8;26854:2;;;26868:18;;:::i;:::-;-1:-1:-1;26905:9:1;;26844:76::o;26925:258::-;26997:1;27007:113;27021:6;27018:1;27015:13;27007:113;;;27097:11;;;27091:18;27078:11;;;27071:39;27043:2;27036:10;27007:113;;;27138:6;27135:1;27132:13;27129:2;;;-1:-1:-1;;27173:1:1;27155:16;;27148:27;26978:205::o;27188:380::-;27267:1;27263:12;;;;27310;;;27331:2;;27385:4;27377:6;27373:17;27363:27;;27331:2;27438;27430:6;27427:14;27407:18;27404:38;27401:2;;;27484:10;27479:3;27475:20;27472:1;27465:31;27519:4;27516:1;27509:15;27547:4;27544:1;27537:15;27401:2;;27243:325;;;:::o;27573:135::-;27612:3;-1:-1:-1;;27633:17:1;;27630:2;;;27653:18;;:::i;:::-;-1:-1:-1;27700:1:1;27689:13;;27620:88::o;27713:112::-;27745:1;27771;27761:2;;27776:18;;:::i;:::-;-1:-1:-1;27810:9:1;;27751:74::o;27830:127::-;27891:10;27886:3;27882:20;27879:1;27872:31;27922:4;27919:1;27912:15;27946:4;27943:1;27936:15;27962:127;28023:10;28018:3;28014:20;28011:1;28004:31;28054:4;28051:1;28044:15;28078:4;28075:1;28068:15;28094:127;28155:10;28150:3;28146:20;28143:1;28136:31;28186:4;28183:1;28176:15;28210:4;28207:1;28200:15;28226:131;-1:-1:-1;;;;;28301:31:1;;28291:42;;28281:2;;28347:1;28344;28337:12;28362:131;-1:-1:-1;;;;;;28436:32:1;;28426:43;;28416:2;;28483:1;28480;28473:12

Swarm Source

ipfs://96ef0cd137b60e790ef62e470d86af0732e0419b4dae50bbe764a47812d733ae
Loading