ETH Price: $2,597.72 (+0.88%)
Gas: 5 Gwei

Token

Rogue Captainz (RCAPTAINZ)
 

Overview

Max Total Supply

1,069 RCAPTAINZ

Holders

242

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 RCAPTAINZ
0x3a63f6055f214f5911d9ce2606e750a12da3c7ea
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
RogueCaptainz

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: UNLICENSED
// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

pragma solidity ^0.8.13;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
 * unusable.
 * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
 * array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

// File: IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;


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


pragma solidity ^0.8.13;


contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

    modifier onlyAllowedOperator() virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}
// File: DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


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

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
// File: RogueCaptainz.sol


pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721AQueryable compliant contract.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721ABurnable compliant contract.
 */
interface IERC721ABurnable is IERC721A {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) external;
}

pragma solidity ^0.8.4;

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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

pragma solidity ^0.8.4;

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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
        return ownership;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
        isApprovedForAll(from, _msgSenderERC721A()) ||
        getApproved(tokenId) == _msgSenderERC721A());

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

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

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

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

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

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

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

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

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

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

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

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

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

            let length := sub(end, ptr)
        // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
        // Store the length.
            mstore(ptr, length)
        }
    }
}

pragma solidity ^0.8.4;

/**
 * @title ERC721A Burnable Token
 * @dev ERC721A Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual override {
        _burn(tokenId, true);
    }
}

pragma solidity ^0.8.4;

/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) {
    unchecked {
        uint256 tokenIdsLength = tokenIds.length;
        TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
        for (uint256 i; i != tokenIdsLength; ++i) {
            ownerships[i] = explicitOwnershipOf(tokenIds[i]);
        }
        return ownerships;
    }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view override returns (uint256[] memory) {
    unchecked {
        if (start >= stop) revert InvalidQueryRange();
        uint256 tokenIdsIdx;
        uint256 stopLimit = _nextTokenId();
        // Set `start = max(start, _startTokenId())`.
        if (start < _startTokenId()) {
            start = _startTokenId();
        }
        // Set `stop = min(stop, stopLimit)`.
        if (stop > stopLimit) {
            stop = stopLimit;
        }
        uint256 tokenIdsMaxLength = balanceOf(owner);
        // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
        // to cater for cases where `balanceOf(owner)` is too big.
        if (start < stop) {
            uint256 rangeLength = stop - start;
            if (rangeLength < tokenIdsMaxLength) {
                tokenIdsMaxLength = rangeLength;
            }
        } else {
            tokenIdsMaxLength = 0;
        }
        uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
        if (tokenIdsMaxLength == 0) {
            return tokenIds;
        }
        // We need to call `explicitOwnershipOf(start)`,
        // because the slot at `start` may not be initialized.
        TokenOwnership memory ownership = explicitOwnershipOf(start);
        address currOwnershipAddr;
        // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
        // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
        if (!ownership.burned) {
            currOwnershipAddr = ownership.addr;
        }
        for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
            ownership = _ownershipAt(i);
            if (ownership.burned) {
                continue;
            }
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                tokenIds[tokenIdsIdx++] = i;
            }
        }
        // Downsize the array to fit.
        assembly {
            mstore(tokenIds, tokenIdsIdx)
        }
        return tokenIds;
    }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view override returns (uint256[] memory) {
    unchecked {
        uint256 tokenIdsIdx;
        address currOwnershipAddr;
        uint256 tokenIdsLength = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenIdsLength);
        TokenOwnership memory ownership;
        for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
            ownership = _ownershipAt(i);
            if (ownership.burned) {
                continue;
            }
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                tokenIds[tokenIdsIdx++] = i;
            }
        }
        return tokenIds;
    }
    }
}

pragma solidity ^0.8.4;

contract RogueCaptainz is ERC721AQueryable, ERC721ABurnable, Ownable, DefaultOperatorFilterer {
    using EnumerableSet for EnumerableSet.UintSet;

    uint256 public constant MAX_SUPPLY = 1069;

    uint256 public maxByWallet = 5;
    mapping(address => uint256) public mintedByWallet;

    // 0:close | 1:open
    bool public saleState;

    bool public collectMarketing = true;

    //baseURI
    string public baseURI;

    //uriSuffix
    string public uriSuffix;

    constructor(
        string memory name,
        string memory symbol,
        string memory baseURI_,
        string memory uriSuffix_
    ) ERC721A(name, symbol) {
        baseURI = baseURI_;
        uriSuffix = uriSuffix_;
    }

    uint256 public MINT_PRICE = 0.01069 ether;

    /******************** PUBLIC ********************/

    function mint(uint256 amount) external payable {
        require(msg.sender == tx.origin, "not allowed");
        require(saleState, "Sale is closed!");
        require(_totalMinted() + amount <= MAX_SUPPLY, "Exceed MAX_SUPPLY");
        require(amount > 0, "Amount can't be 0");
        require(amount + mintedByWallet[msg.sender] <= maxByWallet, "Exceed maxByWallet");

        if (collectMarketing) {
            require(amount * MINT_PRICE <= msg.value, "Invalid payment amount");
        }

        mintedByWallet[msg.sender] += amount;

        _safeMint(msg.sender, amount);
    }

    /******************** OVERRIDES ********************/

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

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

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

        if (bytes(baseURI).length == 0) {
            return _toString(tokenId);
        }

        return string(abi.encodePacked(baseURI, _toString(tokenId), uriSuffix));
    }

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

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

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

    /******************** OWNER ********************/

    /// @notice Set baseURI.
    /// @param newBaseURI New baseURI.
    /// @param newUriSuffix New uriSuffix.
    function setBaseURI(string memory newBaseURI, string memory newUriSuffix) external onlyOwner {
        baseURI = newBaseURI;
        uriSuffix = newUriSuffix;
    }

    /// @notice Set saleState.
    /// @param newSaleState New sale state.
    function setSaleState(bool newSaleState) external onlyOwner {
        saleState = newSaleState;
    }

    /// @notice Set collectMarketing.
    /// @param newCollectMarketing New collect marketing flag.
    function setCollectMarketing(bool newCollectMarketing) external onlyOwner {
        collectMarketing = newCollectMarketing;
    }

    /// @notice Set maxByWallet.
    /// @param newMaxByWallet New max by wallet
    function setMaxByWallet(uint256 newMaxByWallet) external onlyOwner {
        maxByWallet = newMaxByWallet;
    }

    /******************** ALPHA MINT ********************/

    function alphaMint(address[] calldata addresses, uint256[] calldata count) external onlyOwner {
        require(!saleState, "sale is open!");
        require(addresses.length == count.length, "mismatching lengths!");

        for (uint256 i; i < addresses.length; i++) {
            _safeMint(addresses[i], count[i]);
        }

        require(_totalMinted() <= MAX_SUPPLY, "Exceed MAX_SUPPLY");
    }

    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"string","name":"uriSuffix_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"count","type":"uint256[]"}],"name":"alphaMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectMarketing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"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":"maxByWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedByWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"},{"internalType":"string","name":"newUriSuffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newCollectMarketing","type":"bool"}],"name":"setCollectMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxByWallet","type":"uint256"}],"name":"setMaxByWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newSaleState","type":"bool"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260056009556001600b60016101000a81548160ff0219169083151502179055506625fa7f94a62000600e553480156200003c57600080fd5b5060405162004f4838038062004f4883398181016040528101906200006291906200063c565b733cc6cdda760b79bafa08df41ecfa224f810dceb660018585816002908051906020019062000093929190620003ef565b508060039080519060200190620000ac929190620003ef565b50620000bd6200031860201b60201c565b6000819055505050620000e5620000d96200032160201b60201c565b6200032960201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620002da578015620001a0576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001669291906200076f565b600060405180830381600087803b1580156200018157600080fd5b505af115801562000196573d6000803e3d6000fd5b50505050620002d9565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200025a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002209291906200076f565b600060405180830381600087803b1580156200023b57600080fd5b505af115801562000250573d6000803e3d6000fd5b50505050620002d8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002a391906200079c565b600060405180830381600087803b158015620002be57600080fd5b505af1158015620002d3573d6000803e3d6000fd5b505050505b5b5b505081600c9080519060200190620002f4929190620003ef565b5080600d90805190602001906200030d929190620003ef565b50505050506200081d565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003fd90620007e8565b90600052602060002090601f0160209004810192826200042157600085556200046d565b82601f106200043c57805160ff19168380011785556200046d565b828001600101855582156200046d579182015b828111156200046c5782518255916020019190600101906200044f565b5b5090506200047c919062000480565b5090565b5b808211156200049b57600081600090555060010162000481565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050882620004bd565b810181811067ffffffffffffffff821117156200052a5762000529620004ce565b5b80604052505050565b60006200053f6200049f565b90506200054d8282620004fd565b919050565b600067ffffffffffffffff82111562000570576200056f620004ce565b5b6200057b82620004bd565b9050602081019050919050565b60005b83811015620005a85780820151818401526020810190506200058b565b83811115620005b8576000848401525b50505050565b6000620005d5620005cf8462000552565b62000533565b905082815260208101848484011115620005f457620005f3620004b8565b5b6200060184828562000588565b509392505050565b600082601f830112620006215762000620620004b3565b5b815162000633848260208601620005be565b91505092915050565b60008060008060808587031215620006595762000658620004a9565b5b600085015167ffffffffffffffff8111156200067a5762000679620004ae565b5b620006888782880162000609565b945050602085015167ffffffffffffffff811115620006ac57620006ab620004ae565b5b620006ba8782880162000609565b935050604085015167ffffffffffffffff811115620006de57620006dd620004ae565b5b620006ec8782880162000609565b925050606085015167ffffffffffffffff81111562000710576200070f620004ae565b5b6200071e8782880162000609565b91505092959194509250565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000757826200072a565b9050919050565b62000769816200074a565b82525050565b60006040820190506200078660008301856200075e565b6200079560208301846200075e565b9392505050565b6000602082019050620007b360008301846200075e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200080157607f821691505b602082108103620008175762000816620007b9565b5b50919050565b61471b806200082d6000396000f3fe60806040526004361061021a5760003560e01c80636790a9de11610123578063a0712d68116100ab578063c4e370951161006f578063c4e37095146107d8578063c87b56dd14610801578063e985e9c51461083e578063f09a03c01461087b578063f2fde38b146108a45761021a565b8063a0712d6814610702578063a22cb4651461071e578063b88d4fde14610747578063c002d23d14610770578063c23dc68f1461079b5761021a565b80638462151c116100f25780638462151c146106075780638da5cb5b146106445780639434b8051461066f57806395d89b411461069a57806399a2557a146106c55761021a565b80636790a9de1461055f5780636c0360eb1461058857806370a08231146105b3578063715018a6146105f05761021a565b806332cb6b0c116101a657806342966c681161017557806342966c68146104665780635503a0e81461048f5780635bbb2177146104ba578063603f4d52146104f75780636352211e146105225761021a565b806332cb6b0c146103d057806334ecc70a146103fb5780633ccfd60b1461042657806342842e0e1461043d5761021a565b80630d758111116101ed5780630d758111146102ed57806317d985141461032a57806318160ddd1461035357806323b872dd1461037e5780632e067421146103a75761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906132be565b6108cd565b6040516102539190613306565b60405180910390f35b34801561026857600080fd5b5061027161095f565b60405161027e91906133ba565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613412565b6109f1565b6040516102bb9190613480565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906134c7565b610a6d565b005b3480156102f957600080fd5b50610314600480360381019061030f9190613507565b610c13565b6040516103219190613543565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c919061358a565b610c2b565b005b34801561035f57600080fd5b50610368610cc4565b6040516103759190613543565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a091906135b7565b610cdb565b005b3480156103b357600080fd5b506103ce60048036038101906103c99190613412565b610de7565b005b3480156103dc57600080fd5b506103e5610e6d565b6040516103f29190613543565b60405180910390f35b34801561040757600080fd5b50610410610e73565b60405161041d9190613543565b60405180910390f35b34801561043257600080fd5b5061043b610e79565b005b34801561044957600080fd5b50610464600480360381019061045f91906135b7565b610f45565b005b34801561047257600080fd5b5061048d60048036038101906104889190613412565b611051565b005b34801561049b57600080fd5b506104a461105f565b6040516104b191906133ba565b60405180910390f35b3480156104c657600080fd5b506104e160048036038101906104dc9190613752565b6110ed565b6040516104ee91906138cd565b60405180910390f35b34801561050357600080fd5b5061050c6111ae565b6040516105199190613306565b60405180910390f35b34801561052e57600080fd5b5061054960048036038101906105449190613412565b6111c1565b6040516105569190613480565b60405180910390f35b34801561056b57600080fd5b50610586600480360381019061058191906139a4565b6111d3565b005b34801561059457600080fd5b5061059d611281565b6040516105aa91906133ba565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d59190613507565b61130f565b6040516105e79190613543565b60405180910390f35b3480156105fc57600080fd5b506106056113c7565b005b34801561061357600080fd5b5061062e60048036038101906106299190613507565b61144f565b60405161063b9190613ada565b60405180910390f35b34801561065057600080fd5b50610659611592565b6040516106669190613480565b60405180910390f35b34801561067b57600080fd5b506106846115bc565b6040516106919190613306565b60405180910390f35b3480156106a657600080fd5b506106af6115cf565b6040516106bc91906133ba565b60405180910390f35b3480156106d157600080fd5b506106ec60048036038101906106e79190613afc565b611661565b6040516106f99190613ada565b60405180910390f35b61071c60048036038101906107179190613412565b61186d565b005b34801561072a57600080fd5b5061074560048036038101906107409190613b4f565b611b1c565b005b34801561075357600080fd5b5061076e60048036038101906107699190613c30565b611c93565b005b34801561077c57600080fd5b50610785611da1565b6040516107929190613543565b60405180910390f35b3480156107a757600080fd5b506107c260048036038101906107bd9190613412565b611da7565b6040516107cf9190613cf5565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa919061358a565b611e11565b005b34801561080d57600080fd5b5061082860048036038101906108239190613412565b611eaa565b60405161083591906133ba565b60405180910390f35b34801561084a57600080fd5b5061086560048036038101906108609190613d10565b611f47565b6040516108729190613306565b60405180910390f35b34801561088757600080fd5b506108a2600480360381019061089d9190613e01565b611fdb565b005b3480156108b057600080fd5b506108cb60048036038101906108c69190613507565b6121ad565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109585750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461096e90613eb1565b80601f016020809104026020016040519081016040528092919081815260200182805461099a90613eb1565b80156109e75780601f106109bc576101008083540402835291602001916109e7565b820191906000526020600020905b8154815290600101906020018083116109ca57829003601f168201915b5050505050905090565b60006109fc826122a4565b610a32576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7882612303565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610adf576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610afe6123cf565b73ffffffffffffffffffffffffffffffffffffffff1614610b6157610b2a81610b256123cf565b611f47565b610b60576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600a6020528060005260406000206000915090505481565b610c336123d7565b73ffffffffffffffffffffffffffffffffffffffff16610c51611592565b73ffffffffffffffffffffffffffffffffffffffff1614610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90613f2e565b60405180910390fd5b80600b60016101000a81548160ff02191690831515021790555050565b6000610cce6123df565b6001546000540303905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610dd7576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d52929190613f4e565b6020604051808303816000875af1158015610d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d959190613f8c565b610dd657336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610dcd9190613480565b60405180910390fd5b5b610de28383836123e8565b505050565b610def6123d7565b73ffffffffffffffffffffffffffffffffffffffff16610e0d611592565b73ffffffffffffffffffffffffffffffffffffffff1614610e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5a90613f2e565b60405180910390fd5b8060098190555050565b61042d81565b60095481565b610e816123d7565b73ffffffffffffffffffffffffffffffffffffffff16610e9f611592565b73ffffffffffffffffffffffffffffffffffffffff1614610ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eec90613f2e565b60405180910390fd5b610efd611592565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610f42573d6000803e3d6000fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611041576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610fbc929190613f4e565b6020604051808303816000875af1158015610fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fff9190613f8c565b61104057336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016110379190613480565b60405180910390fd5b5b61104c8383836123f8565b505050565b61105c816001612418565b50565b600d805461106c90613eb1565b80601f016020809104026020016040519081016040528092919081815260200182805461109890613eb1565b80156110e55780601f106110ba576101008083540402835291602001916110e5565b820191906000526020600020905b8154815290600101906020018083116110c857829003601f168201915b505050505081565b606060008251905060008167ffffffffffffffff8111156111115761111061360f565b5b60405190808252806020026020018201604052801561114a57816020015b61113761316c565b81526020019060019003908161112f5790505b50905060005b8281146111a35761117a85828151811061116d5761116c613fb9565b5b6020026020010151611da7565b82828151811061118d5761118c613fb9565b5b6020026020010181905250806001019050611150565b508092505050919050565b600b60009054906101000a900460ff1681565b60006111cc82612303565b9050919050565b6111db6123d7565b73ffffffffffffffffffffffffffffffffffffffff166111f9611592565b73ffffffffffffffffffffffffffffffffffffffff161461124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124690613f2e565b60405180910390fd5b81600c90805190602001906112659291906131af565b5080600d908051906020019061127c9291906131af565b505050565b600c805461128e90613eb1565b80601f01602080910402602001604051908101604052809291908181526020018280546112ba90613eb1565b80156113075780601f106112dc57610100808354040283529160200191611307565b820191906000526020600020905b8154815290600101906020018083116112ea57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611376576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6113cf6123d7565b73ffffffffffffffffffffffffffffffffffffffff166113ed611592565b73ffffffffffffffffffffffffffffffffffffffff1614611443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143a90613f2e565b60405180910390fd5b61144d60006126ee565b565b6060600080600061145f8561130f565b905060008167ffffffffffffffff81111561147d5761147c61360f565b5b6040519080825280602002602001820160405280156114ab5781602001602082028036833780820191505090505b5090506114b661316c565b60006114c06123df565b90505b838614611584576114d3816127b4565b9150816040015161157957600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461151e57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611578578083878060010198508151811061156b5761156a613fb9565b5b6020026020010181815250505b5b8060010190506114c3565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60019054906101000a900460ff1681565b6060600380546115de90613eb1565b80601f016020809104026020016040519081016040528092919081815260200182805461160a90613eb1565b80156116575780601f1061162c57610100808354040283529160200191611657565b820191906000526020600020905b81548152906001019060200180831161163a57829003601f168201915b5050505050905090565b606081831061169c576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806116a76127df565b90506116b16123df565b8510156116c3576116c06123df565b94505b808411156116cf578093505b60006116da8761130f565b9050848610156116fd5760008686039050818110156116f7578091505b50611702565b600090505b60008167ffffffffffffffff81111561171e5761171d61360f565b5b60405190808252806020026020018201604052801561174c5781602001602082028036833780820191505090505b509050600082036117635780945050505050611866565b600061176e88611da7565b90506000816040015161178357816000015190505b60008990505b8881141580156117995750848714155b15611858576117a7816127b4565b9250826040015161184d57600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146117f257826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361184c578084888060010199508151811061183f5761183e613fb9565b5b6020026020010181815250505b5b806001019050611789565b508583528296505050505050505b9392505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d290614034565b60405180910390fd5b600b60009054906101000a900460ff1661192a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611921906140a0565b60405180910390fd5b61042d816119366127e8565b61194091906140ef565b1115611981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197890614191565b60405180910390fd5b600081116119c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bb906141fd565b60405180910390fd5b600954600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611a1291906140ef565b1115611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90614269565b60405180910390fd5b600b60019054906101000a900460ff1615611ab95734600e5482611a779190614289565b1115611ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaf9061432f565b60405180910390fd5b5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b0891906140ef565b92505081905550611b1933826127fb565b50565b611b246123cf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b88576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b956123cf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c426123cf565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c879190613306565b60405180910390a35050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611d8f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611d0a929190613f4e565b6020604051808303816000875af1158015611d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4d9190613f8c565b611d8e57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611d859190613480565b60405180910390fd5b5b611d9b84848484612819565b50505050565b600e5481565b611daf61316c565b611db761316c565b611dbf6123df565b831080611dd35750611dcf6127df565b8310155b15611de15780915050611e0c565b611dea836127b4565b9050806040015115611dff5780915050611e0c565b611e088361288c565b9150505b919050565b611e196123d7565b73ffffffffffffffffffffffffffffffffffffffff16611e37611592565b73ffffffffffffffffffffffffffffffffffffffff1614611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8490613f2e565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b6060611eb5826122a4565b611eeb576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600c8054611efa90613eb1565b905003611f1157611f0a826128ac565b9050611f42565b600c611f1c836128ac565b600d604051602001611f309392919061441f565b60405160208183030381529060405290505b919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fe36123d7565b73ffffffffffffffffffffffffffffffffffffffff16612001611592565b73ffffffffffffffffffffffffffffffffffffffff1614612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204e90613f2e565b60405180910390fd5b600b60009054906101000a900460ff16156120a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209e9061449c565b60405180910390fd5b8181905084849050146120ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e690614508565b60405180910390fd5b60005b8484905081101561215a5761214785858381811061211357612112613fb9565b5b90506020020160208101906121289190613507565b84848481811061213b5761213a613fb9565b5b905060200201356127fb565b808061215290614528565b9150506120f2565b5061042d6121666127e8565b11156121a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219e90614191565b60405180910390fd5b50505050565b6121b56123d7565b73ffffffffffffffffffffffffffffffffffffffff166121d3611592565b73ffffffffffffffffffffffffffffffffffffffff1614612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090613f2e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228f906145e2565b60405180910390fd5b6122a1816126ee565b50565b6000816122af6123df565b111580156122be575060005482105b80156122fc575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806123126123df565b11612398576000548110156123975760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612395575b6000810361238b576004600083600190039350838152602001908152602001600020549050612361565b80925050506123ca565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b6123f3838383612906565b505050565b61241383838360405180602001604052806000815250611c93565b505050565b600061242383612303565b9050600081905082156125005760008173ffffffffffffffffffffffffffffffffffffffff166124516123cf565b73ffffffffffffffffffffffffffffffffffffffff161480612480575061247f8261247a6123cf565b611f47565b5b806124c5575061248e6123cf565b73ffffffffffffffffffffffffffffffffffffffff166124ad866109f1565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806124fe576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61250e816000866001612cad565b6006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160806001901b03600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000060a042901b6125e384612cb3565b171717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083160361266c576000600185019050600060046000838152602001908152602001600020540361266a576000548114612669578260046000838152602001908152602001600020819055505b5b505b83600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126d6816000866001612cbd565b60016000815480929190600101919050555050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6127bc61316c565b6127d86004600084815260200190815260200160002054612cc3565b9050919050565b60008054905090565b60006127f26123df565b60005403905090565b612815828260405180602001604052806000815250612d5f565b5050565b612824848484612906565b60008373ffffffffffffffffffffffffffffffffffffffff163b146128865761284f84848484613012565b612885576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61289461316c565b6128a56128a083612303565b612cc3565b9050919050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156128f257600183039250600a81066030018353600a810490506128d2565b508181036020830392508083525050919050565b600061291182612303565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612978576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166129996123cf565b73ffffffffffffffffffffffffffffffffffffffff1614806129c857506129c7856129c26123cf565b611f47565b5b80612a0d57506129d66123cf565b73ffffffffffffffffffffffffffffffffffffffff166129f5846109f1565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612a46576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612aac576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ab98585856001612cad565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612bb686612cb3565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603612c3e5760006001840190506000600460008381526020019081526020016000205403612c3c576000548114612c3b578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ca68585856001612cbd565b5050505050565b50505050565b6000819050919050565b50505050565b612ccb61316c565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612dcb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612e05576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e126000858386612cad565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612e7760018514613162565b901b60a042901b612e8786612cb3565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612f8b575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f3b6000878480600101955087613012565b612f71576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612ecc578260005414612f8657600080fd5b612ff6565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612f8c575b81600081905550505061300c6000858386612cbd565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130386123cf565b8786866040518563ffffffff1660e01b815260040161305a9493929190614657565b6020604051808303816000875af192505050801561309657506040513d601f19601f8201168201806040525081019061309391906146b8565b60015b61310f573d80600081146130c6576040519150601f19603f3d011682016040523d82523d6000602084013e6130cb565b606091505b506000815103613107576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000819050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b8280546131bb90613eb1565b90600052602060002090601f0160209004810192826131dd5760008555613224565b82601f106131f657805160ff1916838001178555613224565b82800160010185558215613224579182015b82811115613223578251825591602001919060010190613208565b5b5090506132319190613235565b5090565b5b8082111561324e576000816000905550600101613236565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61329b81613266565b81146132a657600080fd5b50565b6000813590506132b881613292565b92915050565b6000602082840312156132d4576132d361325c565b5b60006132e2848285016132a9565b91505092915050565b60008115159050919050565b613300816132eb565b82525050565b600060208201905061331b60008301846132f7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561335b578082015181840152602081019050613340565b8381111561336a576000848401525b50505050565b6000601f19601f8301169050919050565b600061338c82613321565b613396818561332c565b93506133a681856020860161333d565b6133af81613370565b840191505092915050565b600060208201905081810360008301526133d48184613381565b905092915050565b6000819050919050565b6133ef816133dc565b81146133fa57600080fd5b50565b60008135905061340c816133e6565b92915050565b6000602082840312156134285761342761325c565b5b6000613436848285016133fd565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061346a8261343f565b9050919050565b61347a8161345f565b82525050565b60006020820190506134956000830184613471565b92915050565b6134a48161345f565b81146134af57600080fd5b50565b6000813590506134c18161349b565b92915050565b600080604083850312156134de576134dd61325c565b5b60006134ec858286016134b2565b92505060206134fd858286016133fd565b9150509250929050565b60006020828403121561351d5761351c61325c565b5b600061352b848285016134b2565b91505092915050565b61353d816133dc565b82525050565b60006020820190506135586000830184613534565b92915050565b613567816132eb565b811461357257600080fd5b50565b6000813590506135848161355e565b92915050565b6000602082840312156135a05761359f61325c565b5b60006135ae84828501613575565b91505092915050565b6000806000606084860312156135d0576135cf61325c565b5b60006135de868287016134b2565b93505060206135ef868287016134b2565b9250506040613600868287016133fd565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61364782613370565b810181811067ffffffffffffffff821117156136665761366561360f565b5b80604052505050565b6000613679613252565b9050613685828261363e565b919050565b600067ffffffffffffffff8211156136a5576136a461360f565b5b602082029050602081019050919050565b600080fd5b60006136ce6136c98461368a565b61366f565b905080838252602082019050602084028301858111156136f1576136f06136b6565b5b835b8181101561371a578061370688826133fd565b8452602084019350506020810190506136f3565b5050509392505050565b600082601f8301126137395761373861360a565b5b81356137498482602086016136bb565b91505092915050565b6000602082840312156137685761376761325c565b5b600082013567ffffffffffffffff81111561378657613785613261565b5b61379284828501613724565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6137d08161345f565b82525050565b600067ffffffffffffffff82169050919050565b6137f3816137d6565b82525050565b613802816132eb565b82525050565b60608201600082015161381e60008501826137c7565b50602082015161383160208501826137ea565b50604082015161384460408501826137f9565b50505050565b60006138568383613808565b60608301905092915050565b6000602082019050919050565b600061387a8261379b565b61388481856137a6565b935061388f836137b7565b8060005b838110156138c05781516138a7888261384a565b97506138b283613862565b925050600181019050613893565b5085935050505092915050565b600060208201905081810360008301526138e7818461386f565b905092915050565b600080fd5b600067ffffffffffffffff82111561390f5761390e61360f565b5b61391882613370565b9050602081019050919050565b82818337600083830152505050565b6000613947613942846138f4565b61366f565b905082815260208101848484011115613963576139626138ef565b5b61396e848285613925565b509392505050565b600082601f83011261398b5761398a61360a565b5b813561399b848260208601613934565b91505092915050565b600080604083850312156139bb576139ba61325c565b5b600083013567ffffffffffffffff8111156139d9576139d8613261565b5b6139e585828601613976565b925050602083013567ffffffffffffffff811115613a0657613a05613261565b5b613a1285828601613976565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613a51816133dc565b82525050565b6000613a638383613a48565b60208301905092915050565b6000602082019050919050565b6000613a8782613a1c565b613a918185613a27565b9350613a9c83613a38565b8060005b83811015613acd578151613ab48882613a57565b9750613abf83613a6f565b925050600181019050613aa0565b5085935050505092915050565b60006020820190508181036000830152613af48184613a7c565b905092915050565b600080600060608486031215613b1557613b1461325c565b5b6000613b23868287016134b2565b9350506020613b34868287016133fd565b9250506040613b45868287016133fd565b9150509250925092565b60008060408385031215613b6657613b6561325c565b5b6000613b74858286016134b2565b9250506020613b8585828601613575565b9150509250929050565b600067ffffffffffffffff821115613baa57613ba961360f565b5b613bb382613370565b9050602081019050919050565b6000613bd3613bce84613b8f565b61366f565b905082815260208101848484011115613bef57613bee6138ef565b5b613bfa848285613925565b509392505050565b600082601f830112613c1757613c1661360a565b5b8135613c27848260208601613bc0565b91505092915050565b60008060008060808587031215613c4a57613c4961325c565b5b6000613c58878288016134b2565b9450506020613c69878288016134b2565b9350506040613c7a878288016133fd565b925050606085013567ffffffffffffffff811115613c9b57613c9a613261565b5b613ca787828801613c02565b91505092959194509250565b606082016000820151613cc960008501826137c7565b506020820151613cdc60208501826137ea565b506040820151613cef60408501826137f9565b50505050565b6000606082019050613d0a6000830184613cb3565b92915050565b60008060408385031215613d2757613d2661325c565b5b6000613d35858286016134b2565b9250506020613d46858286016134b2565b9150509250929050565b600080fd5b60008083601f840112613d6b57613d6a61360a565b5b8235905067ffffffffffffffff811115613d8857613d87613d50565b5b602083019150836020820283011115613da457613da36136b6565b5b9250929050565b60008083601f840112613dc157613dc061360a565b5b8235905067ffffffffffffffff811115613dde57613ddd613d50565b5b602083019150836020820283011115613dfa57613df96136b6565b5b9250929050565b60008060008060408587031215613e1b57613e1a61325c565b5b600085013567ffffffffffffffff811115613e3957613e38613261565b5b613e4587828801613d55565b9450945050602085013567ffffffffffffffff811115613e6857613e67613261565b5b613e7487828801613dab565b925092505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ec957607f821691505b602082108103613edc57613edb613e82565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613f1860208361332c565b9150613f2382613ee2565b602082019050919050565b60006020820190508181036000830152613f4781613f0b565b9050919050565b6000604082019050613f636000830185613471565b613f706020830184613471565b9392505050565b600081519050613f868161355e565b92915050565b600060208284031215613fa257613fa161325c565b5b6000613fb084828501613f77565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f6e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b600061401e600b8361332c565b915061402982613fe8565b602082019050919050565b6000602082019050818103600083015261404d81614011565b9050919050565b7f53616c6520697320636c6f736564210000000000000000000000000000000000600082015250565b600061408a600f8361332c565b915061409582614054565b602082019050919050565b600060208201905081810360008301526140b98161407d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006140fa826133dc565b9150614105836133dc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561413a576141396140c0565b5b828201905092915050565b7f457863656564204d41585f535550504c59000000000000000000000000000000600082015250565b600061417b60118361332c565b915061418682614145565b602082019050919050565b600060208201905081810360008301526141aa8161416e565b9050919050565b7f416d6f756e742063616e27742062652030000000000000000000000000000000600082015250565b60006141e760118361332c565b91506141f2826141b1565b602082019050919050565b60006020820190508181036000830152614216816141da565b9050919050565b7f457863656564206d6178427957616c6c65740000000000000000000000000000600082015250565b600061425360128361332c565b915061425e8261421d565b602082019050919050565b6000602082019050818103600083015261428281614246565b9050919050565b6000614294826133dc565b915061429f836133dc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142d8576142d76140c0565b5b828202905092915050565b7f496e76616c6964207061796d656e7420616d6f756e7400000000000000000000600082015250565b600061431960168361332c565b9150614324826142e3565b602082019050919050565b600060208201905081810360008301526143488161430c565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461437c81613eb1565b614386818661434f565b945060018216600081146143a157600181146143b2576143e5565b60ff198316865281860193506143e5565b6143bb8561435a565b60005b838110156143dd578154818901526001820191506020810190506143be565b838801955050505b50505092915050565b60006143f982613321565b614403818561434f565b935061441381856020860161333d565b80840191505092915050565b600061442b828661436f565b915061443782856143ee565b9150614443828461436f565b9150819050949350505050565b7f73616c65206973206f70656e2100000000000000000000000000000000000000600082015250565b6000614486600d8361332c565b915061449182614450565b602082019050919050565b600060208201905081810360008301526144b581614479565b9050919050565b7f6d69736d61746368696e67206c656e6774687321000000000000000000000000600082015250565b60006144f260148361332c565b91506144fd826144bc565b602082019050919050565b60006020820190508181036000830152614521816144e5565b9050919050565b6000614533826133dc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614565576145646140c0565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145cc60268361332c565b91506145d782614570565b604082019050919050565b600060208201905081810360008301526145fb816145bf565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061462982614602565b614633818561460d565b935061464381856020860161333d565b61464c81613370565b840191505092915050565b600060808201905061466c6000830187613471565b6146796020830186613471565b6146866040830185613534565b8181036060830152614698818461461e565b905095945050505050565b6000815190506146b281613292565b92915050565b6000602082840312156146ce576146cd61325c565b5b60006146dc848285016146a3565b9150509291505056fea26469706673582212208483f716b0aa14e3644feb7b4f810b407e7503b607ad89191d4bb57022bdd05964736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000e526f677565204361707461696e7a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009524341505441494e5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002368747470733a2f2f726f6775656361707461696e7a2e78797a2f6170692f6d6574612f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80636790a9de11610123578063a0712d68116100ab578063c4e370951161006f578063c4e37095146107d8578063c87b56dd14610801578063e985e9c51461083e578063f09a03c01461087b578063f2fde38b146108a45761021a565b8063a0712d6814610702578063a22cb4651461071e578063b88d4fde14610747578063c002d23d14610770578063c23dc68f1461079b5761021a565b80638462151c116100f25780638462151c146106075780638da5cb5b146106445780639434b8051461066f57806395d89b411461069a57806399a2557a146106c55761021a565b80636790a9de1461055f5780636c0360eb1461058857806370a08231146105b3578063715018a6146105f05761021a565b806332cb6b0c116101a657806342966c681161017557806342966c68146104665780635503a0e81461048f5780635bbb2177146104ba578063603f4d52146104f75780636352211e146105225761021a565b806332cb6b0c146103d057806334ecc70a146103fb5780633ccfd60b1461042657806342842e0e1461043d5761021a565b80630d758111116101ed5780630d758111146102ed57806317d985141461032a57806318160ddd1461035357806323b872dd1461037e5780632e067421146103a75761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906132be565b6108cd565b6040516102539190613306565b60405180910390f35b34801561026857600080fd5b5061027161095f565b60405161027e91906133ba565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613412565b6109f1565b6040516102bb9190613480565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906134c7565b610a6d565b005b3480156102f957600080fd5b50610314600480360381019061030f9190613507565b610c13565b6040516103219190613543565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c919061358a565b610c2b565b005b34801561035f57600080fd5b50610368610cc4565b6040516103759190613543565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a091906135b7565b610cdb565b005b3480156103b357600080fd5b506103ce60048036038101906103c99190613412565b610de7565b005b3480156103dc57600080fd5b506103e5610e6d565b6040516103f29190613543565b60405180910390f35b34801561040757600080fd5b50610410610e73565b60405161041d9190613543565b60405180910390f35b34801561043257600080fd5b5061043b610e79565b005b34801561044957600080fd5b50610464600480360381019061045f91906135b7565b610f45565b005b34801561047257600080fd5b5061048d60048036038101906104889190613412565b611051565b005b34801561049b57600080fd5b506104a461105f565b6040516104b191906133ba565b60405180910390f35b3480156104c657600080fd5b506104e160048036038101906104dc9190613752565b6110ed565b6040516104ee91906138cd565b60405180910390f35b34801561050357600080fd5b5061050c6111ae565b6040516105199190613306565b60405180910390f35b34801561052e57600080fd5b5061054960048036038101906105449190613412565b6111c1565b6040516105569190613480565b60405180910390f35b34801561056b57600080fd5b50610586600480360381019061058191906139a4565b6111d3565b005b34801561059457600080fd5b5061059d611281565b6040516105aa91906133ba565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d59190613507565b61130f565b6040516105e79190613543565b60405180910390f35b3480156105fc57600080fd5b506106056113c7565b005b34801561061357600080fd5b5061062e60048036038101906106299190613507565b61144f565b60405161063b9190613ada565b60405180910390f35b34801561065057600080fd5b50610659611592565b6040516106669190613480565b60405180910390f35b34801561067b57600080fd5b506106846115bc565b6040516106919190613306565b60405180910390f35b3480156106a657600080fd5b506106af6115cf565b6040516106bc91906133ba565b60405180910390f35b3480156106d157600080fd5b506106ec60048036038101906106e79190613afc565b611661565b6040516106f99190613ada565b60405180910390f35b61071c60048036038101906107179190613412565b61186d565b005b34801561072a57600080fd5b5061074560048036038101906107409190613b4f565b611b1c565b005b34801561075357600080fd5b5061076e60048036038101906107699190613c30565b611c93565b005b34801561077c57600080fd5b50610785611da1565b6040516107929190613543565b60405180910390f35b3480156107a757600080fd5b506107c260048036038101906107bd9190613412565b611da7565b6040516107cf9190613cf5565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa919061358a565b611e11565b005b34801561080d57600080fd5b5061082860048036038101906108239190613412565b611eaa565b60405161083591906133ba565b60405180910390f35b34801561084a57600080fd5b5061086560048036038101906108609190613d10565b611f47565b6040516108729190613306565b60405180910390f35b34801561088757600080fd5b506108a2600480360381019061089d9190613e01565b611fdb565b005b3480156108b057600080fd5b506108cb60048036038101906108c69190613507565b6121ad565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109585750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461096e90613eb1565b80601f016020809104026020016040519081016040528092919081815260200182805461099a90613eb1565b80156109e75780601f106109bc576101008083540402835291602001916109e7565b820191906000526020600020905b8154815290600101906020018083116109ca57829003601f168201915b5050505050905090565b60006109fc826122a4565b610a32576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7882612303565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610adf576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610afe6123cf565b73ffffffffffffffffffffffffffffffffffffffff1614610b6157610b2a81610b256123cf565b611f47565b610b60576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600a6020528060005260406000206000915090505481565b610c336123d7565b73ffffffffffffffffffffffffffffffffffffffff16610c51611592565b73ffffffffffffffffffffffffffffffffffffffff1614610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90613f2e565b60405180910390fd5b80600b60016101000a81548160ff02191690831515021790555050565b6000610cce6123df565b6001546000540303905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610dd7576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d52929190613f4e565b6020604051808303816000875af1158015610d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d959190613f8c565b610dd657336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610dcd9190613480565b60405180910390fd5b5b610de28383836123e8565b505050565b610def6123d7565b73ffffffffffffffffffffffffffffffffffffffff16610e0d611592565b73ffffffffffffffffffffffffffffffffffffffff1614610e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5a90613f2e565b60405180910390fd5b8060098190555050565b61042d81565b60095481565b610e816123d7565b73ffffffffffffffffffffffffffffffffffffffff16610e9f611592565b73ffffffffffffffffffffffffffffffffffffffff1614610ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eec90613f2e565b60405180910390fd5b610efd611592565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610f42573d6000803e3d6000fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611041576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610fbc929190613f4e565b6020604051808303816000875af1158015610fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fff9190613f8c565b61104057336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016110379190613480565b60405180910390fd5b5b61104c8383836123f8565b505050565b61105c816001612418565b50565b600d805461106c90613eb1565b80601f016020809104026020016040519081016040528092919081815260200182805461109890613eb1565b80156110e55780601f106110ba576101008083540402835291602001916110e5565b820191906000526020600020905b8154815290600101906020018083116110c857829003601f168201915b505050505081565b606060008251905060008167ffffffffffffffff8111156111115761111061360f565b5b60405190808252806020026020018201604052801561114a57816020015b61113761316c565b81526020019060019003908161112f5790505b50905060005b8281146111a35761117a85828151811061116d5761116c613fb9565b5b6020026020010151611da7565b82828151811061118d5761118c613fb9565b5b6020026020010181905250806001019050611150565b508092505050919050565b600b60009054906101000a900460ff1681565b60006111cc82612303565b9050919050565b6111db6123d7565b73ffffffffffffffffffffffffffffffffffffffff166111f9611592565b73ffffffffffffffffffffffffffffffffffffffff161461124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124690613f2e565b60405180910390fd5b81600c90805190602001906112659291906131af565b5080600d908051906020019061127c9291906131af565b505050565b600c805461128e90613eb1565b80601f01602080910402602001604051908101604052809291908181526020018280546112ba90613eb1565b80156113075780601f106112dc57610100808354040283529160200191611307565b820191906000526020600020905b8154815290600101906020018083116112ea57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611376576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6113cf6123d7565b73ffffffffffffffffffffffffffffffffffffffff166113ed611592565b73ffffffffffffffffffffffffffffffffffffffff1614611443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143a90613f2e565b60405180910390fd5b61144d60006126ee565b565b6060600080600061145f8561130f565b905060008167ffffffffffffffff81111561147d5761147c61360f565b5b6040519080825280602002602001820160405280156114ab5781602001602082028036833780820191505090505b5090506114b661316c565b60006114c06123df565b90505b838614611584576114d3816127b4565b9150816040015161157957600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461151e57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611578578083878060010198508151811061156b5761156a613fb9565b5b6020026020010181815250505b5b8060010190506114c3565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60019054906101000a900460ff1681565b6060600380546115de90613eb1565b80601f016020809104026020016040519081016040528092919081815260200182805461160a90613eb1565b80156116575780601f1061162c57610100808354040283529160200191611657565b820191906000526020600020905b81548152906001019060200180831161163a57829003601f168201915b5050505050905090565b606081831061169c576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806116a76127df565b90506116b16123df565b8510156116c3576116c06123df565b94505b808411156116cf578093505b60006116da8761130f565b9050848610156116fd5760008686039050818110156116f7578091505b50611702565b600090505b60008167ffffffffffffffff81111561171e5761171d61360f565b5b60405190808252806020026020018201604052801561174c5781602001602082028036833780820191505090505b509050600082036117635780945050505050611866565b600061176e88611da7565b90506000816040015161178357816000015190505b60008990505b8881141580156117995750848714155b15611858576117a7816127b4565b9250826040015161184d57600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146117f257826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361184c578084888060010199508151811061183f5761183e613fb9565b5b6020026020010181815250505b5b806001019050611789565b508583528296505050505050505b9392505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d290614034565b60405180910390fd5b600b60009054906101000a900460ff1661192a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611921906140a0565b60405180910390fd5b61042d816119366127e8565b61194091906140ef565b1115611981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197890614191565b60405180910390fd5b600081116119c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bb906141fd565b60405180910390fd5b600954600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611a1291906140ef565b1115611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90614269565b60405180910390fd5b600b60019054906101000a900460ff1615611ab95734600e5482611a779190614289565b1115611ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaf9061432f565b60405180910390fd5b5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b0891906140ef565b92505081905550611b1933826127fb565b50565b611b246123cf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b88576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b956123cf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c426123cf565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c879190613306565b60405180910390a35050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611d8f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611d0a929190613f4e565b6020604051808303816000875af1158015611d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4d9190613f8c565b611d8e57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611d859190613480565b60405180910390fd5b5b611d9b84848484612819565b50505050565b600e5481565b611daf61316c565b611db761316c565b611dbf6123df565b831080611dd35750611dcf6127df565b8310155b15611de15780915050611e0c565b611dea836127b4565b9050806040015115611dff5780915050611e0c565b611e088361288c565b9150505b919050565b611e196123d7565b73ffffffffffffffffffffffffffffffffffffffff16611e37611592565b73ffffffffffffffffffffffffffffffffffffffff1614611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8490613f2e565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b6060611eb5826122a4565b611eeb576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600c8054611efa90613eb1565b905003611f1157611f0a826128ac565b9050611f42565b600c611f1c836128ac565b600d604051602001611f309392919061441f565b60405160208183030381529060405290505b919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fe36123d7565b73ffffffffffffffffffffffffffffffffffffffff16612001611592565b73ffffffffffffffffffffffffffffffffffffffff1614612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204e90613f2e565b60405180910390fd5b600b60009054906101000a900460ff16156120a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209e9061449c565b60405180910390fd5b8181905084849050146120ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e690614508565b60405180910390fd5b60005b8484905081101561215a5761214785858381811061211357612112613fb9565b5b90506020020160208101906121289190613507565b84848481811061213b5761213a613fb9565b5b905060200201356127fb565b808061215290614528565b9150506120f2565b5061042d6121666127e8565b11156121a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219e90614191565b60405180910390fd5b50505050565b6121b56123d7565b73ffffffffffffffffffffffffffffffffffffffff166121d3611592565b73ffffffffffffffffffffffffffffffffffffffff1614612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090613f2e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228f906145e2565b60405180910390fd5b6122a1816126ee565b50565b6000816122af6123df565b111580156122be575060005482105b80156122fc575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806123126123df565b11612398576000548110156123975760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612395575b6000810361238b576004600083600190039350838152602001908152602001600020549050612361565b80925050506123ca565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b6123f3838383612906565b505050565b61241383838360405180602001604052806000815250611c93565b505050565b600061242383612303565b9050600081905082156125005760008173ffffffffffffffffffffffffffffffffffffffff166124516123cf565b73ffffffffffffffffffffffffffffffffffffffff161480612480575061247f8261247a6123cf565b611f47565b5b806124c5575061248e6123cf565b73ffffffffffffffffffffffffffffffffffffffff166124ad866109f1565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806124fe576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61250e816000866001612cad565b6006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160806001901b03600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000060a042901b6125e384612cb3565b171717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083160361266c576000600185019050600060046000838152602001908152602001600020540361266a576000548114612669578260046000838152602001908152602001600020819055505b5b505b83600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126d6816000866001612cbd565b60016000815480929190600101919050555050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6127bc61316c565b6127d86004600084815260200190815260200160002054612cc3565b9050919050565b60008054905090565b60006127f26123df565b60005403905090565b612815828260405180602001604052806000815250612d5f565b5050565b612824848484612906565b60008373ffffffffffffffffffffffffffffffffffffffff163b146128865761284f84848484613012565b612885576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61289461316c565b6128a56128a083612303565b612cc3565b9050919050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156128f257600183039250600a81066030018353600a810490506128d2565b508181036020830392508083525050919050565b600061291182612303565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612978576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166129996123cf565b73ffffffffffffffffffffffffffffffffffffffff1614806129c857506129c7856129c26123cf565b611f47565b5b80612a0d57506129d66123cf565b73ffffffffffffffffffffffffffffffffffffffff166129f5846109f1565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612a46576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612aac576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ab98585856001612cad565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612bb686612cb3565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603612c3e5760006001840190506000600460008381526020019081526020016000205403612c3c576000548114612c3b578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ca68585856001612cbd565b5050505050565b50505050565b6000819050919050565b50505050565b612ccb61316c565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612dcb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612e05576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e126000858386612cad565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612e7760018514613162565b901b60a042901b612e8786612cb3565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612f8b575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f3b6000878480600101955087613012565b612f71576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612ecc578260005414612f8657600080fd5b612ff6565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612f8c575b81600081905550505061300c6000858386612cbd565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130386123cf565b8786866040518563ffffffff1660e01b815260040161305a9493929190614657565b6020604051808303816000875af192505050801561309657506040513d601f19601f8201168201806040525081019061309391906146b8565b60015b61310f573d80600081146130c6576040519150601f19603f3d011682016040523d82523d6000602084013e6130cb565b606091505b506000815103613107576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000819050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b8280546131bb90613eb1565b90600052602060002090601f0160209004810192826131dd5760008555613224565b82601f106131f657805160ff1916838001178555613224565b82800160010185558215613224579182015b82811115613223578251825591602001919060010190613208565b5b5090506132319190613235565b5090565b5b8082111561324e576000816000905550600101613236565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61329b81613266565b81146132a657600080fd5b50565b6000813590506132b881613292565b92915050565b6000602082840312156132d4576132d361325c565b5b60006132e2848285016132a9565b91505092915050565b60008115159050919050565b613300816132eb565b82525050565b600060208201905061331b60008301846132f7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561335b578082015181840152602081019050613340565b8381111561336a576000848401525b50505050565b6000601f19601f8301169050919050565b600061338c82613321565b613396818561332c565b93506133a681856020860161333d565b6133af81613370565b840191505092915050565b600060208201905081810360008301526133d48184613381565b905092915050565b6000819050919050565b6133ef816133dc565b81146133fa57600080fd5b50565b60008135905061340c816133e6565b92915050565b6000602082840312156134285761342761325c565b5b6000613436848285016133fd565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061346a8261343f565b9050919050565b61347a8161345f565b82525050565b60006020820190506134956000830184613471565b92915050565b6134a48161345f565b81146134af57600080fd5b50565b6000813590506134c18161349b565b92915050565b600080604083850312156134de576134dd61325c565b5b60006134ec858286016134b2565b92505060206134fd858286016133fd565b9150509250929050565b60006020828403121561351d5761351c61325c565b5b600061352b848285016134b2565b91505092915050565b61353d816133dc565b82525050565b60006020820190506135586000830184613534565b92915050565b613567816132eb565b811461357257600080fd5b50565b6000813590506135848161355e565b92915050565b6000602082840312156135a05761359f61325c565b5b60006135ae84828501613575565b91505092915050565b6000806000606084860312156135d0576135cf61325c565b5b60006135de868287016134b2565b93505060206135ef868287016134b2565b9250506040613600868287016133fd565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61364782613370565b810181811067ffffffffffffffff821117156136665761366561360f565b5b80604052505050565b6000613679613252565b9050613685828261363e565b919050565b600067ffffffffffffffff8211156136a5576136a461360f565b5b602082029050602081019050919050565b600080fd5b60006136ce6136c98461368a565b61366f565b905080838252602082019050602084028301858111156136f1576136f06136b6565b5b835b8181101561371a578061370688826133fd565b8452602084019350506020810190506136f3565b5050509392505050565b600082601f8301126137395761373861360a565b5b81356137498482602086016136bb565b91505092915050565b6000602082840312156137685761376761325c565b5b600082013567ffffffffffffffff81111561378657613785613261565b5b61379284828501613724565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6137d08161345f565b82525050565b600067ffffffffffffffff82169050919050565b6137f3816137d6565b82525050565b613802816132eb565b82525050565b60608201600082015161381e60008501826137c7565b50602082015161383160208501826137ea565b50604082015161384460408501826137f9565b50505050565b60006138568383613808565b60608301905092915050565b6000602082019050919050565b600061387a8261379b565b61388481856137a6565b935061388f836137b7565b8060005b838110156138c05781516138a7888261384a565b97506138b283613862565b925050600181019050613893565b5085935050505092915050565b600060208201905081810360008301526138e7818461386f565b905092915050565b600080fd5b600067ffffffffffffffff82111561390f5761390e61360f565b5b61391882613370565b9050602081019050919050565b82818337600083830152505050565b6000613947613942846138f4565b61366f565b905082815260208101848484011115613963576139626138ef565b5b61396e848285613925565b509392505050565b600082601f83011261398b5761398a61360a565b5b813561399b848260208601613934565b91505092915050565b600080604083850312156139bb576139ba61325c565b5b600083013567ffffffffffffffff8111156139d9576139d8613261565b5b6139e585828601613976565b925050602083013567ffffffffffffffff811115613a0657613a05613261565b5b613a1285828601613976565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613a51816133dc565b82525050565b6000613a638383613a48565b60208301905092915050565b6000602082019050919050565b6000613a8782613a1c565b613a918185613a27565b9350613a9c83613a38565b8060005b83811015613acd578151613ab48882613a57565b9750613abf83613a6f565b925050600181019050613aa0565b5085935050505092915050565b60006020820190508181036000830152613af48184613a7c565b905092915050565b600080600060608486031215613b1557613b1461325c565b5b6000613b23868287016134b2565b9350506020613b34868287016133fd565b9250506040613b45868287016133fd565b9150509250925092565b60008060408385031215613b6657613b6561325c565b5b6000613b74858286016134b2565b9250506020613b8585828601613575565b9150509250929050565b600067ffffffffffffffff821115613baa57613ba961360f565b5b613bb382613370565b9050602081019050919050565b6000613bd3613bce84613b8f565b61366f565b905082815260208101848484011115613bef57613bee6138ef565b5b613bfa848285613925565b509392505050565b600082601f830112613c1757613c1661360a565b5b8135613c27848260208601613bc0565b91505092915050565b60008060008060808587031215613c4a57613c4961325c565b5b6000613c58878288016134b2565b9450506020613c69878288016134b2565b9350506040613c7a878288016133fd565b925050606085013567ffffffffffffffff811115613c9b57613c9a613261565b5b613ca787828801613c02565b91505092959194509250565b606082016000820151613cc960008501826137c7565b506020820151613cdc60208501826137ea565b506040820151613cef60408501826137f9565b50505050565b6000606082019050613d0a6000830184613cb3565b92915050565b60008060408385031215613d2757613d2661325c565b5b6000613d35858286016134b2565b9250506020613d46858286016134b2565b9150509250929050565b600080fd5b60008083601f840112613d6b57613d6a61360a565b5b8235905067ffffffffffffffff811115613d8857613d87613d50565b5b602083019150836020820283011115613da457613da36136b6565b5b9250929050565b60008083601f840112613dc157613dc061360a565b5b8235905067ffffffffffffffff811115613dde57613ddd613d50565b5b602083019150836020820283011115613dfa57613df96136b6565b5b9250929050565b60008060008060408587031215613e1b57613e1a61325c565b5b600085013567ffffffffffffffff811115613e3957613e38613261565b5b613e4587828801613d55565b9450945050602085013567ffffffffffffffff811115613e6857613e67613261565b5b613e7487828801613dab565b925092505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ec957607f821691505b602082108103613edc57613edb613e82565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613f1860208361332c565b9150613f2382613ee2565b602082019050919050565b60006020820190508181036000830152613f4781613f0b565b9050919050565b6000604082019050613f636000830185613471565b613f706020830184613471565b9392505050565b600081519050613f868161355e565b92915050565b600060208284031215613fa257613fa161325c565b5b6000613fb084828501613f77565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f6e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b600061401e600b8361332c565b915061402982613fe8565b602082019050919050565b6000602082019050818103600083015261404d81614011565b9050919050565b7f53616c6520697320636c6f736564210000000000000000000000000000000000600082015250565b600061408a600f8361332c565b915061409582614054565b602082019050919050565b600060208201905081810360008301526140b98161407d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006140fa826133dc565b9150614105836133dc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561413a576141396140c0565b5b828201905092915050565b7f457863656564204d41585f535550504c59000000000000000000000000000000600082015250565b600061417b60118361332c565b915061418682614145565b602082019050919050565b600060208201905081810360008301526141aa8161416e565b9050919050565b7f416d6f756e742063616e27742062652030000000000000000000000000000000600082015250565b60006141e760118361332c565b91506141f2826141b1565b602082019050919050565b60006020820190508181036000830152614216816141da565b9050919050565b7f457863656564206d6178427957616c6c65740000000000000000000000000000600082015250565b600061425360128361332c565b915061425e8261421d565b602082019050919050565b6000602082019050818103600083015261428281614246565b9050919050565b6000614294826133dc565b915061429f836133dc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142d8576142d76140c0565b5b828202905092915050565b7f496e76616c6964207061796d656e7420616d6f756e7400000000000000000000600082015250565b600061431960168361332c565b9150614324826142e3565b602082019050919050565b600060208201905081810360008301526143488161430c565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461437c81613eb1565b614386818661434f565b945060018216600081146143a157600181146143b2576143e5565b60ff198316865281860193506143e5565b6143bb8561435a565b60005b838110156143dd578154818901526001820191506020810190506143be565b838801955050505b50505092915050565b60006143f982613321565b614403818561434f565b935061441381856020860161333d565b80840191505092915050565b600061442b828661436f565b915061443782856143ee565b9150614443828461436f565b9150819050949350505050565b7f73616c65206973206f70656e2100000000000000000000000000000000000000600082015250565b6000614486600d8361332c565b915061449182614450565b602082019050919050565b600060208201905081810360008301526144b581614479565b9050919050565b7f6d69736d61746368696e67206c656e6774687321000000000000000000000000600082015250565b60006144f260148361332c565b91506144fd826144bc565b602082019050919050565b60006020820190508181036000830152614521816144e5565b9050919050565b6000614533826133dc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614565576145646140c0565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145cc60268361332c565b91506145d782614570565b604082019050919050565b600060208201905081810360008301526145fb816145bf565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061462982614602565b614633818561460d565b935061464381856020860161333d565b61464c81613370565b840191505092915050565b600060808201905061466c6000830187613471565b6146796020830186613471565b6146866040830185613534565b8181036060830152614698818461461e565b905095945050505050565b6000815190506146b281613292565b92915050565b6000602082840312156146ce576146cd61325c565b5b60006146dc848285016146a3565b9150509291505056fea26469706673582212208483f716b0aa14e3644feb7b4f810b407e7503b607ad89191d4bb57022bdd05964736f6c634300080d0033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000e526f677565204361707461696e7a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009524341505441494e5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002368747470733a2f2f726f6775656361707461696e7a2e78797a2f6170692f6d6574612f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Rogue Captainz
Arg [1] : symbol (string): RCAPTAINZ
Arg [2] : baseURI_ (string): https://roguecaptainz.xyz/api/meta/
Arg [3] : uriSuffix_ (string):

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [5] : 526f677565204361707461696e7a000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [7] : 524341505441494e5a0000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [9] : 68747470733a2f2f726f6775656361707461696e7a2e78797a2f6170692f6d65
Arg [10] : 74612f0000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

67154:4280:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36211:612;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41167:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43235:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42695:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67396:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70500:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35289:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69270:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70722:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67309:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67359:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71325:106;;;;;;;;;;;;;:::i;:::-;;69454:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61244:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67615:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62744:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67479:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40956:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70034:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67568:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36887:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30482:103;;;;;;;;;;;;;:::i;:::-;;66308:812;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29831:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67509:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41336:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63570:2289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68002:601;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43511:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69646:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67894:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62165:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70286:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68897:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43890:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70906:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30740:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36211:612;36296:4;36607:10;36592:25;;:11;:25;;;;:98;;;;36680:10;36665:25;;:11;:25;;;;36592:98;:171;;;;36753:10;36738:25;;:11;:25;;;;36592:171;36576:187;;36211:612;;;:::o;41167:100::-;41221:13;41254:5;41247:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41167:100;:::o;43235:204::-;43303:7;43328:16;43336:7;43328;:16::i;:::-;43323:64;;43353:34;;;;;;;;;;;;;;43323:64;43407:15;:24;43423:7;43407:24;;;;;;;;;;;;;;;;;;;;;43400:31;;43235:204;;;:::o;42695:474::-;42768:13;42800:27;42819:7;42800:18;:27::i;:::-;42768:61;;42850:5;42844:11;;:2;:11;;;42840:48;;42864:24;;;;;;;;;;;;;;42840:48;42928:5;42905:28;;:19;:17;:19::i;:::-;:28;;;42901:175;;42953:44;42970:5;42977:19;:17;:19::i;:::-;42953:16;:44::i;:::-;42948:128;;43025:35;;;;;;;;;;;;;;42948:128;42901:175;43115:2;43088:15;:24;43104:7;43088:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43153:7;43149:2;43133:28;;43142:5;43133:28;;;;;;;;;;;;42757:412;42695:474;;:::o;67396:49::-;;;;;;;;;;;;;;;;;:::o;70500:131::-;30062:12;:10;:12::i;:::-;30051:23;;:7;:5;:7::i;:::-;:23;;;30043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70604:19:::1;70585:16;;:38;;;;;;;;;;;;;;;;;;70500:131:::0;:::o;35289:303::-;35342:7;35562:15;:13;:15::i;:::-;35547:12;;35531:13;;:28;:46;35524:53;;35289:303;:::o;69270:176::-;16956:1;15782:42;16910:43;;;:47;16906:225;;;15782:42;16979:40;;;17028:4;17035:10;16979:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16974:146;;17093:10;17074:30;;;;;;;;;;;:::i;:::-;;;;;;;;16974:146;16906:225;69401:37:::1;69420:4;69426:2;69430:7;69401:18;:37::i;:::-;69270:176:::0;;;:::o;70722:114::-;30062:12;:10;:12::i;:::-;30051:23;;:7;:5;:7::i;:::-;:23;;;30043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70814:14:::1;70800:11;:28;;;;70722:114:::0;:::o;67309:41::-;67346:4;67309:41;:::o;67359:30::-;;;;:::o;71325:106::-;30062:12;:10;:12::i;:::-;30051:23;;:7;:5;:7::i;:::-;:23;;;30043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71383:7:::1;:5;:7::i;:::-;71375:25;;:48;71401:21;71375:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;71325:106::o:0;69454:184::-;16956:1;15782:42;16910:43;;;:47;16906:225;;;15782:42;16979:40;;;17028:4;17035:10;16979:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16974:146;;17093:10;17074:30;;;;;;;;;;;:::i;:::-;;;;;;;;16974:146;16906:225;69589:41:::1;69612:4;69618:2;69622:7;69589:22;:41::i;:::-;69454:184:::0;;;:::o;61244:94::-;61310:20;61316:7;61325:4;61310:5;:20::i;:::-;61244:94;:::o;67615:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62744:436::-;62833:23;62886:22;62911:8;:15;62886:40;;62937:34;62995:14;62974:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;62937:73;;63026:9;63021:117;63042:14;63037:1;:19;63021:117;;63094:32;63114:8;63123:1;63114:11;;;;;;;;:::i;:::-;;;;;;;;63094:19;:32::i;:::-;63078:10;63089:1;63078:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;63058:3;;;;;63021:117;;;;63155:10;63148:17;;;;62744:436;;;:::o;67479:21::-;;;;;;;;;;;;;:::o;40956:144::-;41020:7;41063:27;41082:7;41063:18;:27::i;:::-;41040:52;;40956:144;;;:::o;70034:167::-;30062:12;:10;:12::i;:::-;30051:23;;:7;:5;:7::i;:::-;:23;;;30043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70148:10:::1;70138:7;:20;;;;;;;;;;;;:::i;:::-;;70181:12;70169:9;:24;;;;;;;;;;;;:::i;:::-;;70034:167:::0;;:::o;67568:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36887:224::-;36951:7;36992:1;36975:19;;:5;:19;;;36971:60;;37003:28;;;;;;;;;;;;;;36971:60;32259:13;37049:18;:25;37068:5;37049:25;;;;;;;;;;;;;;;;:54;37042:61;;36887:224;;;:::o;30482:103::-;30062:12;:10;:12::i;:::-;30051:23;;:7;:5;:7::i;:::-;:23;;;30043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30547:30:::1;30574:1;30547:18;:30::i;:::-;30482:103::o:0;66308:812::-;66378:16;66424:19;66454:25;66490:22;66515:16;66525:5;66515:9;:16::i;:::-;66490:41;;66542:25;66584:14;66570:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66542:57;;66610:31;;:::i;:::-;66657:9;66669:15;:13;:15::i;:::-;66657:27;;66652:428;66701:14;66686:11;:29;66652:428;;66749:15;66762:1;66749:12;:15::i;:::-;66737:27;;66783:9;:16;;;66820:8;66779:65;66888:1;66862:28;;:9;:14;;;:28;;;66858:103;;66931:9;:14;;;66911:34;;66858:103;67000:5;66979:26;;:17;:26;;;66975:94;;67052:1;67026:8;67035:13;;;;;;67026:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;66975:94;66652:428;66717:3;;;;;66652:428;;;;67097:8;67090:15;;;;;;;66308:812;;;:::o;29831:87::-;29877:7;29904:6;;;;;;;;;;;29897:13;;29831:87;:::o;67509:35::-;;;;;;;;;;;;;:::o;41336:104::-;41392:13;41425:7;41418:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41336:104;:::o;63570:2289::-;63705:16;63764:4;63755:5;:13;63751:45;;63777:19;;;;;;;;;;;;;;63751:45;63807:19;63837:17;63857:14;:12;:14::i;:::-;63837:34;;63949:15;:13;:15::i;:::-;63941:5;:23;63937:79;;;63989:15;:13;:15::i;:::-;63981:23;;63937:79;64084:9;64077:4;:16;64073:65;;;64117:9;64110:16;;64073:65;64148:25;64176:16;64186:5;64176:9;:16::i;:::-;64148:44;;64358:4;64350:5;:12;64346:250;;;64379:19;64408:5;64401:4;:12;64379:34;;64446:17;64432:11;:31;64428:103;;;64504:11;64484:31;;64428:103;64364:178;64346:250;;;64583:1;64563:21;;64346:250;64606:25;64648:17;64634:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64606:60;;64702:1;64681:17;:22;64677:70;;64727:8;64720:15;;;;;;;;64677:70;64879:31;64913:26;64933:5;64913:19;:26::i;:::-;64879:60;;64950:25;65183:9;:16;;;65178:84;;65236:9;:14;;;65216:34;;65178:84;65277:9;65289:5;65277:17;;65272:434;65301:4;65296:1;:9;;:45;;;;;65324:17;65309:11;:32;;65296:45;65272:434;;;65375:15;65388:1;65375:12;:15::i;:::-;65363:27;;65409:9;:16;;;65446:8;65405:65;65514:1;65488:28;;:9;:14;;;:28;;;65484:103;;65557:9;:14;;;65537:34;;65484:103;65626:5;65605:26;;:17;:26;;;65601:94;;65678:1;65652:8;65661:13;;;;;;65652:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;65601:94;65272:434;65343:3;;;;;65272:434;;;;65796:11;65786:8;65779:29;65836:8;65829:15;;;;;;;;63570:2289;;;;;;:::o;68002:601::-;68082:9;68068:23;;:10;:23;;;68060:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;68126:9;;;;;;;;;;;68118:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;67346:4;68191:6;68174:14;:12;:14::i;:::-;:23;;;;:::i;:::-;:37;;68166:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;68261:1;68252:6;:10;68244:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;68342:11;;68312:14;:26;68327:10;68312:26;;;;;;;;;;;;;;;;68303:6;:35;;;;:::i;:::-;:50;;68295:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;68393:16;;;;;;;;;;;68389:116;;;68457:9;68443:10;;68434:6;:19;;;;:::i;:::-;:32;;68426:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;68389:116;68547:6;68517:14;:26;68532:10;68517:26;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;68566:29;68576:10;68588:6;68566:9;:29::i;:::-;68002:601;:::o;43511:308::-;43622:19;:17;:19::i;:::-;43610:31;;:8;:31;;;43606:61;;43650:17;;;;;;;;;;;;;;43606:61;43732:8;43680:18;:39;43699:19;:17;:19::i;:::-;43680:39;;;;;;;;;;;;;;;:49;43720:8;43680:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;43792:8;43756:55;;43771:19;:17;:19::i;:::-;43756:55;;;43802:8;43756:55;;;;;;:::i;:::-;;;;;;;;43511:308;;:::o;69646:209::-;16956:1;15782:42;16910:43;;;:47;16906:225;;;15782:42;16979:40;;;17028:4;17035:10;16979:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16974:146;;17093:10;17074:30;;;;;;;;;;;:::i;:::-;;;;;;;;16974:146;16906:225;69800:47:::1;69823:4;69829:2;69833:7;69842:4;69800:22;:47::i;:::-;69646:209:::0;;;;:::o;67894:41::-;;;;:::o;62165:420::-;62241:21;;:::i;:::-;62275:31;;:::i;:::-;62331:15;:13;:15::i;:::-;62321:7;:25;:54;;;;62361:14;:12;:14::i;:::-;62350:7;:25;;62321:54;62317:103;;;62399:9;62392:16;;;;;62317:103;62442:21;62455:7;62442:12;:21::i;:::-;62430:33;;62478:9;:16;;;62474:65;;;62518:9;62511:16;;;;;62474:65;62556:21;62569:7;62556:12;:21::i;:::-;62549:28;;;62165:420;;;;:::o;70286:103::-;30062:12;:10;:12::i;:::-;30051:23;;:7;:5;:7::i;:::-;:23;;;30043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70369:12:::1;70357:9;;:24;;;;;;;;;;;;;;;;;;70286:103:::0;:::o;68897:365::-;68989:13;69020:16;69028:7;69020;:16::i;:::-;69015:59;;69045:29;;;;;;;;;;;;;;69015:59;69116:1;69097:7;69091:21;;;;;:::i;:::-;;;:26;69087:84;;69141:18;69151:7;69141:9;:18::i;:::-;69134:25;;;;69087:84;69214:7;69223:18;69233:7;69223:9;:18::i;:::-;69243:9;69197:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69183:71;;68897:365;;;;:::o;43890:164::-;43987:4;44011:18;:25;44030:5;44011:25;;;;;;;;;;;;;;;:35;44037:8;44011:35;;;;;;;;;;;;;;;;;;;;;;;;;44004:42;;43890:164;;;;:::o;70906:411::-;30062:12;:10;:12::i;:::-;30051:23;;:7;:5;:7::i;:::-;:23;;;30043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71020:9:::1;;;;;;;;;;;71019:10;71011:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;71086:5;;:12;;71066:9;;:16;;:32;71058:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;71141:9;71136:103;71156:9;;:16;;71152:1;:20;71136:103;;;71194:33;71204:9;;71214:1;71204:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;71218:5;;71224:1;71218:8;;;;;;;:::i;:::-;;;;;;;;71194:9;:33::i;:::-;71174:3;;;;;:::i;:::-;;;;71136:103;;;;67346:4;71259:14;:12;:14::i;:::-;:28;;71251:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;70906:411:::0;;;;:::o;30740:201::-;30062:12;:10;:12::i;:::-;30051:23;;:7;:5;:7::i;:::-;:23;;;30043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30849:1:::1;30829:22;;:8;:22;;::::0;30821:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;30905:28;30924:8;30905:18;:28::i;:::-;30740:201:::0;:::o;45269:270::-;45326:4;45378:7;45359:15;:13;:15::i;:::-;:26;;:62;;;;;45408:13;;45398:7;:23;45359:62;:144;;;;;45502:1;33029:8;45455:17;:26;45473:7;45455:26;;;;;;;;;;;;:43;:48;45359:144;45343:160;;45269:270;;;:::o;38524:1049::-;38591:7;38611:12;38626:7;38611:22;;38686:4;38667:15;:13;:15::i;:::-;:23;38663:847;;38716:13;;38709:4;:20;38705:805;;;38750:14;38767:17;:23;38785:4;38767:23;;;;;;;;;;;;38750:40;;38875:1;33029:8;38848:6;:23;:28;38844:651;;39335:105;39352:1;39342:6;:11;39335:105;;39391:17;:25;39409:6;;;;;;;39391:25;;;;;;;;;;;;39382:34;;39335:105;;;39469:6;39462:13;;;;;;38844:651;38731:779;38705:805;38663:847;39534:31;;;;;;;;;;;;;;38524:1049;;;;:::o;58764:105::-;58824:7;58851:10;58844:17;;58764:105;:::o;28671:98::-;28724:7;28751:10;28744:17;;28671:98;:::o;68672:101::-;68737:7;68764:1;68757:8;;68672:101;:::o;44121:170::-;44255:28;44265:4;44271:2;44275:7;44255:9;:28::i;:::-;44121:170;;;:::o;44362:185::-;44500:39;44517:4;44523:2;44527:7;44500:39;;;;;;;;;;;;:16;:39::i;:::-;44362:185;;;:::o;53093:2648::-;53173:27;53203;53222:7;53203:18;:27::i;:::-;53173:57;;53243:12;53274:19;53243:52;;53312:13;53308:303;;;53342:22;53391:4;53368:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;53412:43;53429:4;53435:19;:17;:19::i;:::-;53412:16;:43::i;:::-;53368:87;:147;;;;53496:19;:17;:19::i;:::-;53472:43;;:20;53484:7;53472:11;:20::i;:::-;:43;;;53368:147;53342:174;;53538:17;53533:66;;53564:35;;;;;;;;;;;;;;53533:66;53327:284;53308:303;53623:51;53645:4;53659:1;53663:7;53672:1;53623:21;:51::i;:::-;53747:15;:24;53763:7;53747:24;;;;;;;;;;;;53740:31;;;;;;;;;;;54386:1;32522:3;54357:1;:25;;54356:31;54328:18;:24;54347:4;54328:24;;;;;;;;;;;;;;;;:59;;;;;;;;;;;33307:8;33029;32913:3;54675:15;:41;;54639:23;54657:4;54639:17;:23::i;:::-;:78;:104;:140;54601:17;:26;54619:7;54601:26;;;;;;;;;;;:178;;;;54941:1;33307:8;54891:19;:46;:51;54887:586;;54959:19;54991:1;54981:7;:11;54959:33;;55140:1;55106:17;:30;55124:11;55106:30;;;;;;;;;;;;:35;55102:360;;55236:13;;55221:11;:28;55217:230;;55408:19;55375:17;:30;55393:11;55375:30;;;;;;;;;;;:52;;;;55217:230;55102:360;54944:529;54887:586;55524:7;55520:1;55497:35;;55506:4;55497:35;;;;;;;;;;;;55543:50;55564:4;55578:1;55582:7;55591:1;55543:20;:50::i;:::-;55712:12;;:14;;;;;;;;;;;;;53162:2579;;53093:2648;;:::o;31101:191::-;31175:16;31194:6;;;;;;;;;;;31175:25;;31220:8;31211:6;;:17;;;;;;;;;;;;;;;;;;31275:8;31244:40;;31265:8;31244:40;;;;;;;;;;;;31164:128;31101:191;:::o;40080:153::-;40140:21;;:::i;:::-;40181:44;40200:17;:24;40218:5;40200:24;;;;;;;;;;;;40181:18;:44::i;:::-;40174:51;;40080:153;;;:::o;34984:95::-;35031:7;35058:13;;35051:20;;34984:95;:::o;35690:273::-;35737:7;35933:15;:13;:15::i;:::-;35917:13;;:31;35910:38;;35690:273;:::o;45623:104::-;45692:27;45702:2;45706:8;45692:27;;;;;;;;;;;;:9;:27::i;:::-;45623:104;;:::o;44618:396::-;44785:28;44795:4;44801:2;44805:7;44785:9;:28::i;:::-;44846:1;44828:2;:14;;;:19;44824:183;;44867:56;44898:4;44904:2;44908:7;44917:5;44867:30;:56::i;:::-;44862:145;;44951:40;;;;;;;;;;;;;;44862:145;44824:183;44618:396;;;;:::o;40736:158::-;40798:21;;:::i;:::-;40839:47;40858:27;40877:7;40858:18;:27::i;:::-;40839:18;:47::i;:::-;40832:54;;40736:158;;;:::o;58975:1878::-;59032:17;59435:3;59428:4;59422:11;59418:21;59411:28;;59522:3;59516:4;59509:17;59624:3;60060:5;60186:1;60181:3;60177:11;60170:18;;60319:2;60313:4;60309:13;60305:2;60301:22;60296:3;60288:36;60360:2;60354:4;60350:13;60342:21;;59956:663;60379:4;59956:663;;;60548:1;60543:3;60539:11;60532:18;;60599:2;60593:4;60589:13;60585:2;60581:22;60576:3;60568:36;60470:2;60464:4;60460:13;60452:21;;59956:663;;;59960:418;60658:3;60653;60649:13;60769:2;60764:3;60760:12;60753:19;;60828:6;60823:3;60816:19;59071:1775;;58975:1878;;;:::o;50288:2409::-;50403:27;50433;50452:7;50433:18;:27::i;:::-;50403:57;;50518:4;50477:45;;50493:19;50477:45;;;50473:86;;50531:28;;;;;;;;;;;;;;50473:86;50572:22;50621:4;50598:27;;:19;:17;:19::i;:::-;:27;;;:83;;;;50638:43;50655:4;50661:19;:17;:19::i;:::-;50638:16;:43::i;:::-;50598:83;:139;;;;50718:19;:17;:19::i;:::-;50694:43;;:20;50706:7;50694:11;:20::i;:::-;:43;;;50598:139;50572:166;;50756:17;50751:66;;50782:35;;;;;;;;;;;;;;50751:66;50846:1;50832:16;;:2;:16;;;50828:52;;50857:23;;;;;;;;;;;;;;50828:52;50893:43;50915:4;50921:2;50925:7;50934:1;50893:21;:43::i;:::-;51009:15;:24;51025:7;51009:24;;;;;;;;;;;;51002:31;;;;;;;;;;;51389:18;:24;51408:4;51389:24;;;;;;;;;;;;;;;;51387:26;;;;;;;;;;;;51463:18;:22;51482:2;51463:22;;;;;;;;;;;;;;;;51461:24;;;;;;;;;;;33307:8;32913:3;51813:15;:41;;51779:21;51797:2;51779:17;:21::i;:::-;:76;:112;51741:17;:26;51759:7;51741:26;;;;;;;;;;;:150;;;;52053:1;33307:8;52003:19;:46;:51;51999:586;;52071:19;52103:1;52093:7;:11;52071:33;;52252:1;52218:17;:30;52236:11;52218:30;;;;;;;;;;;;:35;52214:360;;52348:13;;52333:11;:28;52329:230;;52520:19;52487:17;:30;52505:11;52487:30;;;;;;;;;;;:52;;;;52329:230;52214:360;52056:529;51999:586;52628:7;52624:2;52609:27;;52618:4;52609:27;;;;;;;;;;;;52647:42;52668:4;52674:2;52678:7;52687:1;52647:20;:42::i;:::-;50392:2305;;50288:2409;;;:::o;57597:159::-;;;;;:::o;42256:148::-;42320:14;42381:5;42371:15;;42256:148;;;:::o;58415:158::-;;;;;:::o;39667:322::-;39733:31;;:::i;:::-;39810:6;39777:9;:14;;:41;;;;;;;;;;;32913:3;39863:6;:32;;39829:9;:24;;:67;;;;;;;;;;;39953:1;33029:8;39926:6;:23;:28;;39907:9;:16;;:47;;;;;;;;;;;39667:322;;;:::o;46100:2114::-;46223:20;46246:13;;46223:36;;46288:1;46274:16;;:2;:16;;;46270:48;;46299:19;;;;;;;;;;;;;;46270:48;46345:1;46333:8;:13;46329:44;;46355:18;;;;;;;;;;;;;;46329:44;46386:61;46416:1;46420:2;46424:12;46438:8;46386:21;:61::i;:::-;46962:1;32396:2;46933:1;:25;;46932:31;46920:8;:44;46894:18;:22;46913:2;46894:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;33172:3;47315:29;47342:1;47330:8;:13;47315:14;:29::i;:::-;:56;;32913:3;47260:15;:41;;47226:21;47244:2;47226:17;:21::i;:::-;:76;:146;47183:17;:31;47201:12;47183:31;;;;;;;;;;;:189;;;;47385:20;47408:12;47385:35;;47431:11;47460:8;47445:12;:23;47431:37;;47503:1;47485:2;:14;;;:19;47481:609;;47521:306;47573:12;47569:2;47548:38;;47565:1;47548:38;;;;;;;;;;;;47610:69;47649:1;47653:2;47657:14;;;;;;47673:5;47610:30;:69::i;:::-;47605:166;;47711:40;;;;;;;;;;;;;;47605:166;47822:3;47807:12;:18;47521:306;;47900:12;47883:13;;:29;47879:43;;47914:8;;;47879:43;47481:609;;;47955:124;48007:14;;;;;;48003:2;47982:40;;47999:1;47982:40;;;;;;;;;;;;48074:3;48059:12;:18;47955:124;;47481:609;48116:12;48100:13;:28;;;;46695:1441;;48146:60;48175:1;48179:2;48183:12;48197:8;48146:20;:60::i;:::-;46212:2002;46100:2114;;;:::o;56233:716::-;56396:4;56442:2;56417:45;;;56463:19;:17;:19::i;:::-;56484:4;56490:7;56499:5;56417:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56413:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56717:1;56700:6;:13;:18;56696:235;;56746:40;;;;;;;;;;;;;;56696:235;56889:6;56883:13;56874:6;56870:2;56866:15;56859:38;56413:529;56586:54;;;56576:64;;;:6;:64;;;;56569:71;;;56233:716;;;;;;:::o;42491:142::-;42549:14;42610:5;42600:15;;42491:142;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:329::-;4997:6;5046:2;5034:9;5025:7;5021:23;5017:32;5014:119;;;5052:79;;:::i;:::-;5014:119;5172:1;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5143:117;4938:329;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:116::-;5695:21;5710:5;5695:21;:::i;:::-;5688:5;5685:32;5675:60;;5731:1;5728;5721:12;5675:60;5625:116;:::o;5747:133::-;5790:5;5828:6;5815:20;5806:29;;5844:30;5868:5;5844:30;:::i;:::-;5747:133;;;;:::o;5886:323::-;5942:6;5991:2;5979:9;5970:7;5966:23;5962:32;5959:119;;;5997:79;;:::i;:::-;5959:119;6117:1;6142:50;6184:7;6175:6;6164:9;6160:22;6142:50;:::i;:::-;6132:60;;6088:114;5886:323;;;;:::o;6215:619::-;6292:6;6300;6308;6357:2;6345:9;6336:7;6332:23;6328:32;6325:119;;;6363:79;;:::i;:::-;6325:119;6483:1;6508:53;6553:7;6544:6;6533:9;6529:22;6508:53;:::i;:::-;6498:63;;6454:117;6610:2;6636:53;6681:7;6672:6;6661:9;6657:22;6636:53;:::i;:::-;6626:63;;6581:118;6738:2;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6709:118;6215:619;;;;;:::o;6840:117::-;6949:1;6946;6939:12;6963:180;7011:77;7008:1;7001:88;7108:4;7105:1;7098:15;7132:4;7129:1;7122:15;7149:281;7232:27;7254:4;7232:27;:::i;:::-;7224:6;7220:40;7362:6;7350:10;7347:22;7326:18;7314:10;7311:34;7308:62;7305:88;;;7373:18;;:::i;:::-;7305:88;7413:10;7409:2;7402:22;7192:238;7149:281;;:::o;7436:129::-;7470:6;7497:20;;:::i;:::-;7487:30;;7526:33;7554:4;7546:6;7526:33;:::i;:::-;7436:129;;;:::o;7571:311::-;7648:4;7738:18;7730:6;7727:30;7724:56;;;7760:18;;:::i;:::-;7724:56;7810:4;7802:6;7798:17;7790:25;;7870:4;7864;7860:15;7852:23;;7571:311;;;:::o;7888:117::-;7997:1;7994;7987:12;8028:710;8124:5;8149:81;8165:64;8222:6;8165:64;:::i;:::-;8149:81;:::i;:::-;8140:90;;8250:5;8279:6;8272:5;8265:21;8313:4;8306:5;8302:16;8295:23;;8366:4;8358:6;8354:17;8346:6;8342:30;8395:3;8387:6;8384:15;8381:122;;;8414:79;;:::i;:::-;8381:122;8529:6;8512:220;8546:6;8541:3;8538:15;8512:220;;;8621:3;8650:37;8683:3;8671:10;8650:37;:::i;:::-;8645:3;8638:50;8717:4;8712:3;8708:14;8701:21;;8588:144;8572:4;8567:3;8563:14;8556:21;;8512:220;;;8516:21;8130:608;;8028:710;;;;;:::o;8761:370::-;8832:5;8881:3;8874:4;8866:6;8862:17;8858:27;8848:122;;8889:79;;:::i;:::-;8848:122;9006:6;8993:20;9031:94;9121:3;9113:6;9106:4;9098:6;9094:17;9031:94;:::i;:::-;9022:103;;8838:293;8761:370;;;;:::o;9137:539::-;9221:6;9270:2;9258:9;9249:7;9245:23;9241:32;9238:119;;;9276:79;;:::i;:::-;9238:119;9424:1;9413:9;9409:17;9396:31;9454:18;9446:6;9443:30;9440:117;;;9476:79;;:::i;:::-;9440:117;9581:78;9651:7;9642:6;9631:9;9627:22;9581:78;:::i;:::-;9571:88;;9367:302;9137:539;;;;:::o;9682:145::-;9780:6;9814:5;9808:12;9798:22;;9682:145;;;:::o;9833:215::-;9963:11;9997:6;9992:3;9985:19;10037:4;10032:3;10028:14;10013:29;;9833:215;;;;:::o;10054:163::-;10152:4;10175:3;10167:11;;10205:4;10200:3;10196:14;10188:22;;10054:163;;;:::o;10223:108::-;10300:24;10318:5;10300:24;:::i;:::-;10295:3;10288:37;10223:108;;:::o;10337:101::-;10373:7;10413:18;10406:5;10402:30;10391:41;;10337:101;;;:::o;10444:105::-;10519:23;10536:5;10519:23;:::i;:::-;10514:3;10507:36;10444:105;;:::o;10555:99::-;10626:21;10641:5;10626:21;:::i;:::-;10621:3;10614:34;10555:99;;:::o;10732:687::-;10881:4;10876:3;10872:14;10968:4;10961:5;10957:16;10951:23;10987:63;11044:4;11039:3;11035:14;11021:12;10987:63;:::i;:::-;10896:164;11152:4;11145:5;11141:16;11135:23;11171:61;11226:4;11221:3;11217:14;11203:12;11171:61;:::i;:::-;11070:172;11326:4;11319:5;11315:16;11309:23;11345:57;11396:4;11391:3;11387:14;11373:12;11345:57;:::i;:::-;11252:160;10850:569;10732:687;;:::o;11425:303::-;11556:10;11577:108;11681:3;11673:6;11577:108;:::i;:::-;11717:4;11712:3;11708:14;11694:28;;11425:303;;;;:::o;11734:144::-;11835:4;11867;11862:3;11858:14;11850:22;;11734:144;;;:::o;11960:980::-;12141:3;12170:85;12249:5;12170:85;:::i;:::-;12271:117;12381:6;12376:3;12271:117;:::i;:::-;12264:124;;12412:87;12493:5;12412:87;:::i;:::-;12522:7;12553:1;12538:377;12563:6;12560:1;12557:13;12538:377;;;12639:6;12633:13;12666:125;12787:3;12772:13;12666:125;:::i;:::-;12659:132;;12814:91;12898:6;12814:91;:::i;:::-;12804:101;;12598:317;12585:1;12582;12578:9;12573:14;;12538:377;;;12542:14;12931:3;12924:10;;12146:794;;;11960:980;;;;:::o;12946:497::-;13151:4;13189:2;13178:9;13174:18;13166:26;;13238:9;13232:4;13228:20;13224:1;13213:9;13209:17;13202:47;13266:170;13431:4;13422:6;13266:170;:::i;:::-;13258:178;;12946:497;;;;:::o;13449:117::-;13558:1;13555;13548:12;13572:308;13634:4;13724:18;13716:6;13713:30;13710:56;;;13746:18;;:::i;:::-;13710:56;13784:29;13806:6;13784:29;:::i;:::-;13776:37;;13868:4;13862;13858:15;13850:23;;13572:308;;;:::o;13886:154::-;13970:6;13965:3;13960;13947:30;14032:1;14023:6;14018:3;14014:16;14007:27;13886:154;;;:::o;14046:412::-;14124:5;14149:66;14165:49;14207:6;14165:49;:::i;:::-;14149:66;:::i;:::-;14140:75;;14238:6;14231:5;14224:21;14276:4;14269:5;14265:16;14314:3;14305:6;14300:3;14296:16;14293:25;14290:112;;;14321:79;;:::i;:::-;14290:112;14411:41;14445:6;14440:3;14435;14411:41;:::i;:::-;14130:328;14046:412;;;;;:::o;14478:340::-;14534:5;14583:3;14576:4;14568:6;14564:17;14560:27;14550:122;;14591:79;;:::i;:::-;14550:122;14708:6;14695:20;14733:79;14808:3;14800:6;14793:4;14785:6;14781:17;14733:79;:::i;:::-;14724:88;;14540:278;14478:340;;;;:::o;14824:834::-;14912:6;14920;14969:2;14957:9;14948:7;14944:23;14940:32;14937:119;;;14975:79;;:::i;:::-;14937:119;15123:1;15112:9;15108:17;15095:31;15153:18;15145:6;15142:30;15139:117;;;15175:79;;:::i;:::-;15139:117;15280:63;15335:7;15326:6;15315:9;15311:22;15280:63;:::i;:::-;15270:73;;15066:287;15420:2;15409:9;15405:18;15392:32;15451:18;15443:6;15440:30;15437:117;;;15473:79;;:::i;:::-;15437:117;15578:63;15633:7;15624:6;15613:9;15609:22;15578:63;:::i;:::-;15568:73;;15363:288;14824:834;;;;;:::o;15664:114::-;15731:6;15765:5;15759:12;15749:22;;15664:114;;;:::o;15784:184::-;15883:11;15917:6;15912:3;15905:19;15957:4;15952:3;15948:14;15933:29;;15784:184;;;;:::o;15974:132::-;16041:4;16064:3;16056:11;;16094:4;16089:3;16085:14;16077:22;;15974:132;;;:::o;16112:108::-;16189:24;16207:5;16189:24;:::i;:::-;16184:3;16177:37;16112:108;;:::o;16226:179::-;16295:10;16316:46;16358:3;16350:6;16316:46;:::i;:::-;16394:4;16389:3;16385:14;16371:28;;16226:179;;;;:::o;16411:113::-;16481:4;16513;16508:3;16504:14;16496:22;;16411:113;;;:::o;16560:732::-;16679:3;16708:54;16756:5;16708:54;:::i;:::-;16778:86;16857:6;16852:3;16778:86;:::i;:::-;16771:93;;16888:56;16938:5;16888:56;:::i;:::-;16967:7;16998:1;16983:284;17008:6;17005:1;17002:13;16983:284;;;17084:6;17078:13;17111:63;17170:3;17155:13;17111:63;:::i;:::-;17104:70;;17197:60;17250:6;17197:60;:::i;:::-;17187:70;;17043:224;17030:1;17027;17023:9;17018:14;;16983:284;;;16987:14;17283:3;17276:10;;16684:608;;;16560:732;;;;:::o;17298:373::-;17441:4;17479:2;17468:9;17464:18;17456:26;;17528:9;17522:4;17518:20;17514:1;17503:9;17499:17;17492:47;17556:108;17659:4;17650:6;17556:108;:::i;:::-;17548:116;;17298:373;;;;:::o;17677:619::-;17754:6;17762;17770;17819:2;17807:9;17798:7;17794:23;17790:32;17787:119;;;17825:79;;:::i;:::-;17787:119;17945:1;17970:53;18015:7;18006:6;17995:9;17991:22;17970:53;:::i;:::-;17960:63;;17916:117;18072:2;18098:53;18143:7;18134:6;18123:9;18119:22;18098:53;:::i;:::-;18088:63;;18043:118;18200:2;18226:53;18271:7;18262:6;18251:9;18247:22;18226:53;:::i;:::-;18216:63;;18171:118;17677:619;;;;;:::o;18302:468::-;18367:6;18375;18424:2;18412:9;18403:7;18399:23;18395:32;18392:119;;;18430:79;;:::i;:::-;18392:119;18550:1;18575:53;18620:7;18611:6;18600:9;18596:22;18575:53;:::i;:::-;18565:63;;18521:117;18677:2;18703:50;18745:7;18736:6;18725:9;18721:22;18703:50;:::i;:::-;18693:60;;18648:115;18302:468;;;;;:::o;18776:307::-;18837:4;18927:18;18919:6;18916:30;18913:56;;;18949:18;;:::i;:::-;18913:56;18987:29;19009:6;18987:29;:::i;:::-;18979:37;;19071:4;19065;19061:15;19053:23;;18776:307;;;:::o;19089:410::-;19166:5;19191:65;19207:48;19248:6;19207:48;:::i;:::-;19191:65;:::i;:::-;19182:74;;19279:6;19272:5;19265:21;19317:4;19310:5;19306:16;19355:3;19346:6;19341:3;19337:16;19334:25;19331:112;;;19362:79;;:::i;:::-;19331:112;19452:41;19486:6;19481:3;19476;19452:41;:::i;:::-;19172:327;19089:410;;;;;:::o;19518:338::-;19573:5;19622:3;19615:4;19607:6;19603:17;19599:27;19589:122;;19630:79;;:::i;:::-;19589:122;19747:6;19734:20;19772:78;19846:3;19838:6;19831:4;19823:6;19819:17;19772:78;:::i;:::-;19763:87;;19579:277;19518:338;;;;:::o;19862:943::-;19957:6;19965;19973;19981;20030:3;20018:9;20009:7;20005:23;20001:33;19998:120;;;20037:79;;:::i;:::-;19998:120;20157:1;20182:53;20227:7;20218:6;20207:9;20203:22;20182:53;:::i;:::-;20172:63;;20128:117;20284:2;20310:53;20355:7;20346:6;20335:9;20331:22;20310:53;:::i;:::-;20300:63;;20255:118;20412:2;20438:53;20483:7;20474:6;20463:9;20459:22;20438:53;:::i;:::-;20428:63;;20383:118;20568:2;20557:9;20553:18;20540:32;20599:18;20591:6;20588:30;20585:117;;;20621:79;;:::i;:::-;20585:117;20726:62;20780:7;20771:6;20760:9;20756:22;20726:62;:::i;:::-;20716:72;;20511:287;19862:943;;;;;;;:::o;20883:697::-;21042:4;21037:3;21033:14;21129:4;21122:5;21118:16;21112:23;21148:63;21205:4;21200:3;21196:14;21182:12;21148:63;:::i;:::-;21057:164;21313:4;21306:5;21302:16;21296:23;21332:61;21387:4;21382:3;21378:14;21364:12;21332:61;:::i;:::-;21231:172;21487:4;21480:5;21476:16;21470:23;21506:57;21557:4;21552:3;21548:14;21534:12;21506:57;:::i;:::-;21413:160;21011:569;20883:697;;:::o;21586:346::-;21741:4;21779:2;21768:9;21764:18;21756:26;;21792:133;21922:1;21911:9;21907:17;21898:6;21792:133;:::i;:::-;21586:346;;;;:::o;21938:474::-;22006:6;22014;22063:2;22051:9;22042:7;22038:23;22034:32;22031:119;;;22069:79;;:::i;:::-;22031:119;22189:1;22214:53;22259:7;22250:6;22239:9;22235:22;22214:53;:::i;:::-;22204:63;;22160:117;22316:2;22342:53;22387:7;22378:6;22367:9;22363:22;22342:53;:::i;:::-;22332:63;;22287:118;21938:474;;;;;:::o;22418:117::-;22527:1;22524;22517:12;22558:568;22631:8;22641:6;22691:3;22684:4;22676:6;22672:17;22668:27;22658:122;;22699:79;;:::i;:::-;22658:122;22812:6;22799:20;22789:30;;22842:18;22834:6;22831:30;22828:117;;;22864:79;;:::i;:::-;22828:117;22978:4;22970:6;22966:17;22954:29;;23032:3;23024:4;23016:6;23012:17;23002:8;22998:32;22995:41;22992:128;;;23039:79;;:::i;:::-;22992:128;22558:568;;;;;:::o;23149:::-;23222:8;23232:6;23282:3;23275:4;23267:6;23263:17;23259:27;23249:122;;23290:79;;:::i;:::-;23249:122;23403:6;23390:20;23380:30;;23433:18;23425:6;23422:30;23419:117;;;23455:79;;:::i;:::-;23419:117;23569:4;23561:6;23557:17;23545:29;;23623:3;23615:4;23607:6;23603:17;23593:8;23589:32;23586:41;23583:128;;;23630:79;;:::i;:::-;23583:128;23149:568;;;;;:::o;23723:934::-;23845:6;23853;23861;23869;23918:2;23906:9;23897:7;23893:23;23889:32;23886:119;;;23924:79;;:::i;:::-;23886:119;24072:1;24061:9;24057:17;24044:31;24102:18;24094:6;24091:30;24088:117;;;24124:79;;:::i;:::-;24088:117;24237:80;24309:7;24300:6;24289:9;24285:22;24237:80;:::i;:::-;24219:98;;;;24015:312;24394:2;24383:9;24379:18;24366:32;24425:18;24417:6;24414:30;24411:117;;;24447:79;;:::i;:::-;24411:117;24560:80;24632:7;24623:6;24612:9;24608:22;24560:80;:::i;:::-;24542:98;;;;24337:313;23723:934;;;;;;;:::o;24663:180::-;24711:77;24708:1;24701:88;24808:4;24805:1;24798:15;24832:4;24829:1;24822:15;24849:320;24893:6;24930:1;24924:4;24920:12;24910:22;;24977:1;24971:4;24967:12;24998:18;24988:81;;25054:4;25046:6;25042:17;25032:27;;24988:81;25116:2;25108:6;25105:14;25085:18;25082:38;25079:84;;25135:18;;:::i;:::-;25079:84;24900:269;24849:320;;;:::o;25175:182::-;25315:34;25311:1;25303:6;25299:14;25292:58;25175:182;:::o;25363:366::-;25505:3;25526:67;25590:2;25585:3;25526:67;:::i;:::-;25519:74;;25602:93;25691:3;25602:93;:::i;:::-;25720:2;25715:3;25711:12;25704:19;;25363:366;;;:::o;25735:419::-;25901:4;25939:2;25928:9;25924:18;25916:26;;25988:9;25982:4;25978:20;25974:1;25963:9;25959:17;25952:47;26016:131;26142:4;26016:131;:::i;:::-;26008:139;;25735:419;;;:::o;26160:332::-;26281:4;26319:2;26308:9;26304:18;26296:26;;26332:71;26400:1;26389:9;26385:17;26376:6;26332:71;:::i;:::-;26413:72;26481:2;26470:9;26466:18;26457:6;26413:72;:::i;:::-;26160:332;;;;;:::o;26498:137::-;26552:5;26583:6;26577:13;26568:22;;26599:30;26623:5;26599:30;:::i;:::-;26498:137;;;;:::o;26641:345::-;26708:6;26757:2;26745:9;26736:7;26732:23;26728:32;26725:119;;;26763:79;;:::i;:::-;26725:119;26883:1;26908:61;26961:7;26952:6;26941:9;26937:22;26908:61;:::i;:::-;26898:71;;26854:125;26641:345;;;;:::o;26992:180::-;27040:77;27037:1;27030:88;27137:4;27134:1;27127:15;27161:4;27158:1;27151:15;27178:161;27318:13;27314:1;27306:6;27302:14;27295:37;27178:161;:::o;27345:366::-;27487:3;27508:67;27572:2;27567:3;27508:67;:::i;:::-;27501:74;;27584:93;27673:3;27584:93;:::i;:::-;27702:2;27697:3;27693:12;27686:19;;27345:366;;;:::o;27717:419::-;27883:4;27921:2;27910:9;27906:18;27898:26;;27970:9;27964:4;27960:20;27956:1;27945:9;27941:17;27934:47;27998:131;28124:4;27998:131;:::i;:::-;27990:139;;27717:419;;;:::o;28142:165::-;28282:17;28278:1;28270:6;28266:14;28259:41;28142:165;:::o;28313:366::-;28455:3;28476:67;28540:2;28535:3;28476:67;:::i;:::-;28469:74;;28552:93;28641:3;28552:93;:::i;:::-;28670:2;28665:3;28661:12;28654:19;;28313:366;;;:::o;28685:419::-;28851:4;28889:2;28878:9;28874:18;28866:26;;28938:9;28932:4;28928:20;28924:1;28913:9;28909:17;28902:47;28966:131;29092:4;28966:131;:::i;:::-;28958:139;;28685:419;;;:::o;29110:180::-;29158:77;29155:1;29148:88;29255:4;29252:1;29245:15;29279:4;29276:1;29269:15;29296:305;29336:3;29355:20;29373:1;29355:20;:::i;:::-;29350:25;;29389:20;29407:1;29389:20;:::i;:::-;29384:25;;29543:1;29475:66;29471:74;29468:1;29465:81;29462:107;;;29549:18;;:::i;:::-;29462:107;29593:1;29590;29586:9;29579:16;;29296:305;;;;:::o;29607:167::-;29747:19;29743:1;29735:6;29731:14;29724:43;29607:167;:::o;29780:366::-;29922:3;29943:67;30007:2;30002:3;29943:67;:::i;:::-;29936:74;;30019:93;30108:3;30019:93;:::i;:::-;30137:2;30132:3;30128:12;30121:19;;29780:366;;;:::o;30152:419::-;30318:4;30356:2;30345:9;30341:18;30333:26;;30405:9;30399:4;30395:20;30391:1;30380:9;30376:17;30369:47;30433:131;30559:4;30433:131;:::i;:::-;30425:139;;30152:419;;;:::o;30577:167::-;30717:19;30713:1;30705:6;30701:14;30694:43;30577:167;:::o;30750:366::-;30892:3;30913:67;30977:2;30972:3;30913:67;:::i;:::-;30906:74;;30989:93;31078:3;30989:93;:::i;:::-;31107:2;31102:3;31098:12;31091:19;;30750:366;;;:::o;31122:419::-;31288:4;31326:2;31315:9;31311:18;31303:26;;31375:9;31369:4;31365:20;31361:1;31350:9;31346:17;31339:47;31403:131;31529:4;31403:131;:::i;:::-;31395:139;;31122:419;;;:::o;31547:168::-;31687:20;31683:1;31675:6;31671:14;31664:44;31547:168;:::o;31721:366::-;31863:3;31884:67;31948:2;31943:3;31884:67;:::i;:::-;31877:74;;31960:93;32049:3;31960:93;:::i;:::-;32078:2;32073:3;32069:12;32062:19;;31721:366;;;:::o;32093:419::-;32259:4;32297:2;32286:9;32282:18;32274:26;;32346:9;32340:4;32336:20;32332:1;32321:9;32317:17;32310:47;32374:131;32500:4;32374:131;:::i;:::-;32366:139;;32093:419;;;:::o;32518:348::-;32558:7;32581:20;32599:1;32581:20;:::i;:::-;32576:25;;32615:20;32633:1;32615:20;:::i;:::-;32610:25;;32803:1;32735:66;32731:74;32728:1;32725:81;32720:1;32713:9;32706:17;32702:105;32699:131;;;32810:18;;:::i;:::-;32699:131;32858:1;32855;32851:9;32840:20;;32518:348;;;;:::o;32872:172::-;33012:24;33008:1;33000:6;32996:14;32989:48;32872:172;:::o;33050:366::-;33192:3;33213:67;33277:2;33272:3;33213:67;:::i;:::-;33206:74;;33289:93;33378:3;33289:93;:::i;:::-;33407:2;33402:3;33398:12;33391:19;;33050:366;;;:::o;33422:419::-;33588:4;33626:2;33615:9;33611:18;33603:26;;33675:9;33669:4;33665:20;33661:1;33650:9;33646:17;33639:47;33703:131;33829:4;33703:131;:::i;:::-;33695:139;;33422:419;;;:::o;33847:148::-;33949:11;33986:3;33971:18;;33847:148;;;;:::o;34001:141::-;34050:4;34073:3;34065:11;;34096:3;34093:1;34086:14;34130:4;34127:1;34117:18;34109:26;;34001:141;;;:::o;34172:845::-;34275:3;34312:5;34306:12;34341:36;34367:9;34341:36;:::i;:::-;34393:89;34475:6;34470:3;34393:89;:::i;:::-;34386:96;;34513:1;34502:9;34498:17;34529:1;34524:137;;;;34675:1;34670:341;;;;34491:520;;34524:137;34608:4;34604:9;34593;34589:25;34584:3;34577:38;34644:6;34639:3;34635:16;34628:23;;34524:137;;34670:341;34737:38;34769:5;34737:38;:::i;:::-;34797:1;34811:154;34825:6;34822:1;34819:13;34811:154;;;34899:7;34893:14;34889:1;34884:3;34880:11;34873:35;34949:1;34940:7;34936:15;34925:26;;34847:4;34844:1;34840:12;34835:17;;34811:154;;;34994:6;34989:3;34985:16;34978:23;;34677:334;;34491:520;;34279:738;;34172:845;;;;:::o;35023:377::-;35129:3;35157:39;35190:5;35157:39;:::i;:::-;35212:89;35294:6;35289:3;35212:89;:::i;:::-;35205:96;;35310:52;35355:6;35350:3;35343:4;35336:5;35332:16;35310:52;:::i;:::-;35387:6;35382:3;35378:16;35371:23;;35133:267;35023:377;;;;:::o;35406:583::-;35628:3;35650:92;35738:3;35729:6;35650:92;:::i;:::-;35643:99;;35759:95;35850:3;35841:6;35759:95;:::i;:::-;35752:102;;35871:92;35959:3;35950:6;35871:92;:::i;:::-;35864:99;;35980:3;35973:10;;35406:583;;;;;;:::o;35995:163::-;36135:15;36131:1;36123:6;36119:14;36112:39;35995:163;:::o;36164:366::-;36306:3;36327:67;36391:2;36386:3;36327:67;:::i;:::-;36320:74;;36403:93;36492:3;36403:93;:::i;:::-;36521:2;36516:3;36512:12;36505:19;;36164:366;;;:::o;36536:419::-;36702:4;36740:2;36729:9;36725:18;36717:26;;36789:9;36783:4;36779:20;36775:1;36764:9;36760:17;36753:47;36817:131;36943:4;36817:131;:::i;:::-;36809:139;;36536:419;;;:::o;36961:170::-;37101:22;37097:1;37089:6;37085:14;37078:46;36961:170;:::o;37137:366::-;37279:3;37300:67;37364:2;37359:3;37300:67;:::i;:::-;37293:74;;37376:93;37465:3;37376:93;:::i;:::-;37494:2;37489:3;37485:12;37478:19;;37137:366;;;:::o;37509:419::-;37675:4;37713:2;37702:9;37698:18;37690:26;;37762:9;37756:4;37752:20;37748:1;37737:9;37733:17;37726:47;37790:131;37916:4;37790:131;:::i;:::-;37782:139;;37509:419;;;:::o;37934:233::-;37973:3;37996:24;38014:5;37996:24;:::i;:::-;37987:33;;38042:66;38035:5;38032:77;38029:103;;38112:18;;:::i;:::-;38029:103;38159:1;38152:5;38148:13;38141:20;;37934:233;;;:::o;38173:225::-;38313:34;38309:1;38301:6;38297:14;38290:58;38382:8;38377:2;38369:6;38365:15;38358:33;38173:225;:::o;38404:366::-;38546:3;38567:67;38631:2;38626:3;38567:67;:::i;:::-;38560:74;;38643:93;38732:3;38643:93;:::i;:::-;38761:2;38756:3;38752:12;38745:19;;38404:366;;;:::o;38776:419::-;38942:4;38980:2;38969:9;38965:18;38957:26;;39029:9;39023:4;39019:20;39015:1;39004:9;39000:17;38993:47;39057:131;39183:4;39057:131;:::i;:::-;39049:139;;38776:419;;;:::o;39201:98::-;39252:6;39286:5;39280:12;39270:22;;39201:98;;;:::o;39305:168::-;39388:11;39422:6;39417:3;39410:19;39462:4;39457:3;39453:14;39438:29;;39305:168;;;;:::o;39479:360::-;39565:3;39593:38;39625:5;39593:38;:::i;:::-;39647:70;39710:6;39705:3;39647:70;:::i;:::-;39640:77;;39726:52;39771:6;39766:3;39759:4;39752:5;39748:16;39726:52;:::i;:::-;39803:29;39825:6;39803:29;:::i;:::-;39798:3;39794:39;39787:46;;39569:270;39479:360;;;;:::o;39845:640::-;40040:4;40078:3;40067:9;40063:19;40055:27;;40092:71;40160:1;40149:9;40145:17;40136:6;40092:71;:::i;:::-;40173:72;40241:2;40230:9;40226:18;40217:6;40173:72;:::i;:::-;40255;40323:2;40312:9;40308:18;40299:6;40255:72;:::i;:::-;40374:9;40368:4;40364:20;40359:2;40348:9;40344:18;40337:48;40402:76;40473:4;40464:6;40402:76;:::i;:::-;40394:84;;39845:640;;;;;;;:::o;40491:141::-;40547:5;40578:6;40572:13;40563:22;;40594:32;40620:5;40594:32;:::i;:::-;40491:141;;;;:::o;40638:349::-;40707:6;40756:2;40744:9;40735:7;40731:23;40727:32;40724:119;;;40762:79;;:::i;:::-;40724:119;40882:1;40907:63;40962:7;40953:6;40942:9;40938:22;40907:63;:::i;:::-;40897:73;;40853:127;40638:349;;;;:::o

Swarm Source

ipfs://8483f716b0aa14e3644feb7b4f810b407e7503b607ad89191d4bb57022bdd059
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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