ETH Price: $3,464.03 (+3.91%)

Token

DigiMiners ($MINE)
 

Overview

Max Total Supply

7,777 $MINE

Holders

2,550

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
46days.eth
Balance
2 $MINE
0xf3772aC6A4A92D74d2e20512bDf36C56Fe82a445
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:
DigiMiners

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-10
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;


/**
 * @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) {
        return _values(set._inner);
    }

    // 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 on 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;
    }
}


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

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

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

  /**
   * The `quantity` minted with ERC2309 exceeds the safety limit.
   */
  error MintERC2309QuantityExceedsLimit();

  /**
   * The `extraData` cannot be set on an unintialized ownership slot.
   */
  error OwnershipNotInitializedForExtraData();

  // =============================================================
  //                            STRUCTS
  // =============================================================

  struct TokenOwnership {
    // The address of the owner.
    address addr;
    // Stores the start time of ownership with minimal overhead for tokenomics.
    uint64 startTimestamp;
    // Whether the token has been burned.
    bool burned;
    // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
    uint24 extraData;
  }

  // =============================================================
  //                         TOKEN COUNTERS
  // =============================================================

  /**
   * @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() external view returns (uint256);

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

  /**
   * @dev Returns true if this contract implements the interface defined by
   * `interfaceId`. See the corresponding
   * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
   * to learn more about how these ids are created.
   *
   * This function call must use less than 30000 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`,
   * 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,
    bytes calldata data
  ) external payable;

  /**
   * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId
  ) external payable;

  /**
   * @dev Transfers `tokenId` 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 payable;

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

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

  // =============================================================
  //                           IERC2309
  // =============================================================

  /**
   * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
   * (inclusive) is transferred from `from` to `to`, as defined in the
   * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
   *
   * See {_mintERC2309} for more details.
   */
  event ConsecutiveTransfer(
    uint256 indexed fromTokenId,
    uint256 toTokenId,
    address indexed from,
    address indexed to
  );
}

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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
  // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
  struct TokenApprovalRef {
    address value;
  }

  // =============================================================
  //                           CONSTANTS
  // =============================================================

  // 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 bit position of `extraData` in packed ownership.
  uint256 private constant _BITPOS_EXTRA_DATA = 232;

  // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
  uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

  // The mask of the lower 160 bits for addresses.
  uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

  // The maximum `quantity` that can be minted with {_mintERC2309}.
  // This limit is to prevent overflows on the address data entries.
  // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
  // is required to cause an overflow, which is unrealistic.
  uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

  // The `Transfer` event signature is given by:
  // `keccak256(bytes("Transfer(address,address,uint256)"))`.
  bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
    0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

  // =============================================================
  //                            STORAGE
  // =============================================================

  // The next token ID 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`
  // - [232..255] `extraData`
  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 => TokenApprovalRef) private _tokenApprovals;

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

  // =============================================================
  //                          CONSTRUCTOR
  // =============================================================

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

  // =============================================================
  //                   TOKEN COUNTING OPERATIONS
  // =============================================================

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

  /**
   * @dev Returns the next token ID to be minted.
   */
  function _nextTokenId() internal view virtual 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 virtual 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 virtual 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 virtual returns (uint256) {
    return _burnCounter;
  }

  // =============================================================
  //                    ADDRESS DATA OPERATIONS
  // =============================================================

  /**
   * @dev Returns the number of tokens in `owner`'s account.
   */
  function balanceOf(address owner)
    public
    view
    virtual
    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 auxiliary 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 auxiliary 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 virtual {
    uint256 packed = _packedAddressData[owner];
    uint256 auxCasted;
    // Cast `aux` with assembly to avoid redundant masking.
    assembly {
      auxCasted := aux
    }
    packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
    _packedAddressData[owner] = packed;
  }

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

  /**
   * @dev Returns true if this contract implements the interface defined by
   * `interfaceId`. See the corresponding
   * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
   * to learn more about how these ids are created.
   *
   * This function call must use less than 30000 gas.
   */
  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: [ERC165](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.
  }

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

  /**
   * @dev Returns the token collection name.
   */
  function name() public view virtual override returns (string memory) {
    return _name;
  }

  /**
   * @dev Returns the token collection symbol.
   */
  function symbol() public view virtual override returns (string memory) {
    return _symbol;
  }

  /**
   * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
   */
  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, it can be overridden in child contracts.
   */
  function _baseURI() internal view virtual returns (string memory) {
    return "";
  }

  // =============================================================
  //                     OWNERSHIPS OPERATIONS
  // =============================================================

  /**
   * @dev Returns the owner of the `tokenId` token.
   *
   * Requirements:
   *
   * - `tokenId` must exist.
   */
  function ownerOf(uint256 tokenId)
    public
    view
    virtual
    override
    returns (address)
  {
    return address(uint160(_packedOwnershipOf(tokenId)));
  }

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

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

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

  /**
   * 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 initialized ownership slot
            // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
            // before an unintialized ownership slot
            // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
            // Hence, `curr` will not underflow.
            //
            // We can directly compare the packed value.
            // If the address is zero, packed will be zero.
            while (packed == 0) {
              packed = _packedOwnerships[--curr];
            }
            return packed;
          }
        }
    }
    revert OwnerQueryForNonexistentToken();
  }

  /**
   * @dev 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;
    ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
  }

  /**
   * @dev Packs ownership data into a single uint256.
   */
  function _packOwnershipData(address owner, uint256 flags)
    private
    view
    returns (uint256 result)
  {
    assembly {
      // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
      owner := and(owner, _BITMASK_ADDRESS)
      // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
      result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
    }
  }

  /**
   * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
   */
  function _nextInitializedFlag(uint256 quantity)
    private
    pure
    returns (uint256 result)
  {
    // For branchless setting of the `nextInitialized` flag.
    assembly {
      // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
      result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
    }
  }

  // =============================================================
  //                      APPROVAL OPERATIONS
  // =============================================================

  /**
   * @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)
    public
    payable
    virtual
    override
  {
    address owner = ownerOf(tokenId);

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

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

  /**
   * @dev Returns the account approved for `tokenId` token.
   *
   * Requirements:
   *
   * - `tokenId` must exist.
   */
  function getApproved(uint256 tokenId)
    public
    view
    virtual
    override
    returns (address)
  {
    if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

    return _tokenApprovals[tokenId].value;
  }

  /**
   * @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)
    public
    virtual
    override
  {
    _operatorApprovals[_msgSenderERC721A()][operator] = approved;
    emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
  }

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

  /**
   * @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. See {_mint}.
   */
  function _exists(uint256 tokenId) internal view virtual returns (bool) {
    return
      _startTokenId() <= tokenId &&
      tokenId < _currentIndex && // If within bounds,
      _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
  }

  /**
   * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
   */
  function _isSenderApprovedOrOwner(
    address approvedAddress,
    address owner,
    address msgSender
  ) private pure returns (bool result) {
    assembly {
      // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
      owner := and(owner, _BITMASK_ADDRESS)
      // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
      msgSender := and(msgSender, _BITMASK_ADDRESS)
      // `msgSender == owner || msgSender == approvedAddress`.
      result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
    }
  }

  /**
   * @dev Returns the storage slot and value for the approved address of `tokenId`.
   */
  function _getApprovedSlotAndAddress(uint256 tokenId)
    private
    view
    returns (uint256 approvedAddressSlot, address approvedAddress)
  {
    TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
    // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
    assembly {
      approvedAddressSlot := tokenApproval.slot
      approvedAddress := sload(approvedAddressSlot)
    }
  }

  // =============================================================
  //                      TRANSFER OPERATIONS
  // =============================================================

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * 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
  ) public payable virtual override {
    uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

    // The nested ifs save around 20+ gas over a compound boolean condition.
    if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
      if (!isApprovedForAll(from, _msgSenderERC721A()))
        revert TransferCallerNotOwnerNorApproved();

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

    _beforeTokenTransfers(from, to, tokenId, 1);

    // Clear approvals from the previous owner.
    assembly {
      if approvedAddress {
        // This is equivalent to `delete _tokenApprovals[tokenId]`.
        sstore(approvedAddressSlot, 0)
      }
    }

    // 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] = _packOwnershipData(
        to,
        _BITMASK_NEXT_INITIALIZED |
          _nextExtraData(from, to, prevOwnershipPacked)
      );

      // 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 `safeTransferFrom(from, to, tokenId, '')`.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public payable virtual override {
    safeTransferFrom(from, to, tokenId, "");
  }

  /**
   * @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 memory _data
  ) public payable virtual override {
    transferFrom(from, to, tokenId);
    if (to.code.length != 0)
      if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
        revert TransferToNonERC721ReceiverImplementer();
      }
  }

  /**
   * @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
   *
   * `from` - Previous owner of the given token ID.
   * `to` - Target address that will receive the token.
   * `tokenId` - Token ID to be transferred.
   * `_data` - Optional data to send along with the call.
   *
   * Returns 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))
        }
      }
    }
  }

  // =============================================================
  //                        MINT OPERATIONS
  // =============================================================

  /**
   * @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 for each mint.
   */
  function _mint(address to, uint256 quantity) internal virtual {
    uint256 startTokenId = _currentIndex;
    if (quantity == 0) revert MintZeroQuantity();

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

    // Overflows are incredibly unrealistic.
    // `balance` and `numberMinted` have a maximum limit of 2**64.
    // `tokenId` has a maximum limit of 2**256.
    unchecked {
      // Updates:
      // - `balance += quantity`.
      // - `numberMinted += quantity`.
      //
      // We can directly add to the `balance` and `numberMinted`.
      _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] = _packOwnershipData(
        to,
        _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
      );

      uint256 toMasked;
      uint256 end = startTokenId + quantity;

      // Use assembly to loop and emit the `Transfer` event for gas savings.
      // The duplicated `log4` removes an extra check and reduces stack juggling.
      // The assembly, together with the surrounding Solidity code, have been
      // delicately arranged to nudge the compiler into producing optimized opcodes.
      assembly {
        // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
        toMasked := and(to, _BITMASK_ADDRESS)
        // Emit the `Transfer` event.
        log4(
          0, // Start of data (0, since no data).
          0, // End of data (0, since no data).
          _TRANSFER_EVENT_SIGNATURE, // Signature.
          0, // `address(0)`.
          toMasked, // `to`.
          startTokenId // `tokenId`.
        )

        // The `iszero(eq(,))` check ensures that large values of `quantity`
        // that overflows uint256 will make the loop run out of gas.
        // The compiler will optimize the `iszero` away for performance.
        for {
          let tokenId := add(startTokenId, 1)
        } iszero(eq(tokenId, end)) {
          tokenId := add(tokenId, 1)
        } {
          // Emit the `Transfer` event. Similar to above.
          log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
        }
      }
      if (toMasked == 0) revert MintToZeroAddress();

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

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * This function is intended for efficient minting only during contract creation.
   *
   * It emits only one {ConsecutiveTransfer} as defined in
   * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
   * instead of a sequence of {Transfer} event(s).
   *
   * Calling this function outside of contract creation WILL make your contract
   * non-compliant with the ERC721 standard.
   * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
   * {ConsecutiveTransfer} event is only permissible during contract creation.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `quantity` must be greater than 0.
   *
   * Emits a {ConsecutiveTransfer} event.
   */
  function _mintERC2309(address to, uint256 quantity) internal virtual {
    uint256 startTokenId = _currentIndex;
    if (to == address(0)) revert MintToZeroAddress();
    if (quantity == 0) revert MintZeroQuantity();
    if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT)
      revert MintERC2309QuantityExceedsLimit();

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

    // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
    unchecked {
      // Updates:
      // - `balance += quantity`.
      // - `numberMinted += quantity`.
      //
      // We can directly add to the `balance` and `numberMinted`.
      _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] = _packOwnershipData(
        to,
        _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
      );

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

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

  /**
   * @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.
   *
   * See {_mint}.
   *
   * Emits a {Transfer} event for each mint.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal virtual {
    _mint(to, quantity);

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

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

  // =============================================================
  //                        BURN OPERATIONS
  // =============================================================

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

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

    if (approvalCheck) {
      // The nested ifs save around 20+ gas over a compound boolean condition.
      if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
        if (!isApprovedForAll(from, _msgSenderERC721A()))
          revert TransferCallerNotOwnerNorApproved();
    }

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

    // Clear approvals from the previous owner.
    assembly {
      if approvedAddress {
        // This is equivalent to `delete _tokenApprovals[tokenId]`.
        sstore(approvedAddressSlot, 0)
      }
    }

    // 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] = _packOwnershipData(
        from,
        (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) |
          _nextExtraData(from, address(0), prevOwnershipPacked)
      );

      // 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++;
    }
  }

  // =============================================================
  //                     EXTRA DATA OPERATIONS
  // =============================================================

  /**
   * @dev Directly sets the extra data for the ownership data `index`.
   */
  function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
    uint256 packed = _packedOwnerships[index];
    if (packed == 0) revert OwnershipNotInitializedForExtraData();
    uint256 extraDataCasted;
    // Cast `extraData` with assembly to avoid redundant masking.
    assembly {
      extraDataCasted := extraData
    }
    packed =
      (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) |
      (extraDataCasted << _BITPOS_EXTRA_DATA);
    _packedOwnerships[index] = packed;
  }

  /**
   * @dev Called during each token transfer to set the 24bit `extraData` field.
   * Intended to be overridden by the cosumer contract.
   *
   * `previousExtraData` - the value of `extraData` before transfer.
   *
   * 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 _extraData(
    address from,
    address to,
    uint24 previousExtraData
  ) internal view virtual returns (uint24) {}

  /**
   * @dev Returns the next extra data for the packed ownership data.
   * The returned result is shifted into position.
   */
  function _nextExtraData(
    address from,
    address to,
    uint256 prevOwnershipPacked
  ) private view returns (uint256) {
    uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
    return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
  }

  // =============================================================
  //                       OTHER OPERATIONS
  // =============================================================

  /**
   * @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
    virtual
    returns (string memory str)
  {
    assembly {
      // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
      // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
      // We will need 1 word for the trailing zeros padding, 1 word for the length,
      // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
      let m := add(mload(0x40), 0xa0)
      // Update the free memory pointer to allocate.
      mstore(0x40, m)
      // Assign the `str` to the end.
      str := sub(m, 0x20)
      // Zeroize the slot after the string.
      mstore(str, 0)

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

      // We write the string from rightmost digit to leftmost digit.
      // The following is essentially a do-while loop that also handles the zero case.
      // prettier-ignore
      for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

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

library MerkleProof {
  /**
   * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
   * defined by `root`. For this, a `proof` must be provided, containing
   * sibling hashes on the branch from the leaf to the root of the tree. Each
   * pair of leaves and each pair of pre-images are assumed to be sorted.
   */
  function verify(
    bytes32[] memory proof,
    bytes32 root,
    bytes32 leaf
  ) internal pure returns (bool) {
    return processProof(proof, leaf) == root;
  }

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

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

library SafeMath {
  /**
   * @dev Returns the addition of two unsigned integers, with an overflow flag.
   *
   * _Available since v3.4._
   */
  function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
      uint256 c = a + b;
      if (c < a) return (false, 0);
      return (true, c);
    }
  }

  /**
   * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
   *
   * _Available since v3.4._
   */
  function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
      if (b > a) return (false, 0);
      return (true, a - b);
    }
  }

  /**
   * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
   *
   * _Available since v3.4._
   */
  function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
      // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
      // benefit is lost if 'b' is also tested.
      // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
      if (a == 0) return (true, 0);
      uint256 c = a * b;
      if (c / a != b) return (false, 0);
      return (true, c);
    }
  }

  /**
   * @dev Returns the division of two unsigned integers, with a division by zero flag.
   *
   * _Available since v3.4._
   */
  function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
      if (b == 0) return (false, 0);
      return (true, a / b);
    }
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
   *
   * _Available since v3.4._
   */
  function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
      if (b == 0) return (false, 0);
      return (true, a % b);
    }
  }

  /**
   * @dev Returns the addition of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `+` operator.
   *
   * Requirements:
   *
   * - Addition cannot overflow.
   */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    return a + b;
  }

  /**
   * @dev Returns the subtraction of two unsigned integers, reverting on
   * overflow (when the result is negative).
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   *
   * - Subtraction cannot overflow.
   */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    return a - b;
  }

  /**
   * @dev Returns the multiplication of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `*` operator.
   *
   * Requirements:
   *
   * - Multiplication cannot overflow.
   */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    return a * b;
  }

  /**
   * @dev Returns the integer division of two unsigned integers, reverting on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator.
   *
   * Requirements:
   *
   * - The divisor cannot be zero.
   */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    return a / b;
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * reverting when dividing by zero.
   *
   * Counterpart to Solidity's `%` operator. This function uses a `revert`
   * opcode (which leaves remaining gas untouched) while Solidity uses an
   * invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   *
   * - The divisor cannot be zero.
   */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    return a % b;
  }

  /**
   * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
   * overflow (when the result is negative).
   *
   * CAUTION: This function is deprecated because it requires allocating memory for the error
   * message unnecessarily. For custom revert reasons use {trySub}.
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   *
   * - Subtraction cannot overflow.
   */
  function sub(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    unchecked {
      require(b <= a, errorMessage);
      return a - b;
    }
  }

  /**
   * @dev Returns the integer division of two unsigned integers, reverting with custom message on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator. Note: this function uses a
   * `revert` opcode (which leaves remaining gas untouched) while Solidity
   * uses an invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   *
   * - The divisor cannot be zero.
   */
  function div(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    unchecked {
      require(b > 0, errorMessage);
      return a / b;
    }
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * reverting with custom message when dividing by zero.
   *
   * CAUTION: This function is deprecated because it requires allocating memory for the error
   * message unnecessarily. For custom revert reasons use {tryMod}.
   *
   * Counterpart to Solidity's `%` operator. This function uses a `revert`
   * opcode (which leaves remaining gas untouched) while Solidity uses an
   * invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   *
   * - The divisor cannot be zero.
   */
  function mod(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    unchecked {
      require(b > 0, errorMessage);
      return a % b;
    }
  }
}

library Counters {
  struct Counter {
    // This variable should never be directly accessed by users of the library: interactions must be restricted to
    // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
    // this feature: see https://github.com/ethereum/solidity/issues/4637
    uint256 _value; // default: 0
  }

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

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

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

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

library Strings {
  bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
  uint8 private constant _ADDRESS_LENGTH = 20;

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

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

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

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

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

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

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

abstract contract Ownable is Context {
  address private _owner;

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

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

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

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

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

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

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

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

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

    return account.code.length > 0;
  }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  /**
   * @dev Returns the address that signed a hashed message (`hash`) with
   * `signature` or error string. This address can then be used for verification purposes.
   *
   * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
   * this function rejects them by requiring the `s` value to be in the lower
   * half order, and the `v` value to be either 27 or 28.
   *
   * IMPORTANT: `hash` _must_ be the result of a hash operation for the
   * verification to be secure: it is possible to craft signatures that
   * recover to arbitrary addresses for non-hashed data. A safe way to ensure
   * this is by receiving a hash of the original message (which may otherwise
   * be too long), and then calling {toEthSignedMessageHash} on it.
   *
   * Documentation for signature generation:
   * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
   * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
   *
   * _Available since v4.3._
   */
  function tryRecover(bytes32 hash, bytes memory signature)
    internal
    pure
    returns (address, RecoverError)
  {
    // Check the signature length
    // - case 65: r,s,v signature (standard)
    // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
    if (signature.length == 65) {
      bytes32 r;
      bytes32 s;
      uint8 v;
      // ecrecover takes the signature parameters, and the only way to get them
      // currently is to use assembly.
      /// @solidity memory-safe-assembly
      assembly {
        r := mload(add(signature, 0x20))
        s := mload(add(signature, 0x40))
        v := byte(0, mload(add(signature, 0x60)))
      }
      return tryRecover(hash, v, r, s);
    } else if (signature.length == 64) {
      bytes32 r;
      bytes32 vs;
      // ecrecover takes the signature parameters, and the only way to get them
      // currently is to use assembly.
      /// @solidity memory-safe-assembly
      assembly {
        r := mload(add(signature, 0x20))
        vs := mload(add(signature, 0x40))
      }
      return tryRecover(hash, r, vs);
    } else {
      return (address(0), RecoverError.InvalidSignatureLength);
    }
  }

  /**
   * @dev Returns the address that signed a hashed message (`hash`) with
   * `signature`. This address can then be used for verification purposes.
   *
   * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
   * this function rejects them by requiring the `s` value to be in the lower
   * half order, and the `v` value to be either 27 or 28.
   *
   * IMPORTANT: `hash` _must_ be the result of a hash operation for the
   * verification to be secure: it is possible to craft signatures that
   * recover to arbitrary addresses for non-hashed data. A safe way to ensure
   * this is by receiving a hash of the original message (which may otherwise
   * be too long), and then calling {toEthSignedMessageHash} on it.
   */
  function recover(bytes32 hash, bytes memory signature)
    internal
    pure
    returns (address)
  {
    (address recovered, RecoverError error) = tryRecover(hash, signature);
    _throwError(error);
    return recovered;
  }

  /**
   * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
   *
   * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
   *
   * _Available since v4.3._
   */
  function tryRecover(
    bytes32 hash,
    bytes32 r,
    bytes32 vs
  ) internal pure returns (address, RecoverError) {
    bytes32 s = vs &
      bytes32(
        0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
      );
    uint8 v = uint8((uint256(vs) >> 255) + 27);
    return tryRecover(hash, v, r, s);
  }

  /**
   * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
   *
   * _Available since v4.2._
   */
  function recover(
    bytes32 hash,
    bytes32 r,
    bytes32 vs
  ) internal pure returns (address) {
    (address recovered, RecoverError error) = tryRecover(hash, r, vs);
    _throwError(error);
    return recovered;
  }

  /**
   * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
   * `r` and `s` signature fields separately.
   *
   * _Available since v4.3._
   */
  function tryRecover(
    bytes32 hash,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) internal pure returns (address, RecoverError) {
    // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
    // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
    // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
    // signatures from current libraries generate a unique signature with an s-value in the lower half order.
    //
    // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
    // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
    // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
    // these malleable signatures as well.
    if (
      uint256(s) >
      0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0
    ) {
      return (address(0), RecoverError.InvalidSignatureS);
    }
    if (v != 27 && v != 28) {
      return (address(0), RecoverError.InvalidSignatureV);
    }

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

    return (signer, RecoverError.NoError);
  }

  /**
   * @dev Overload of {ECDSA-recover} that receives the `v`,
   * `r` and `s` signature fields separately.
   */
  function recover(
    bytes32 hash,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) internal pure returns (address) {
    (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
    _throwError(error);
    return recovered;
  }

  /**
   * @dev Returns an Ethereum Signed Message, created from a `hash`. This
   * produces hash corresponding to the one signed with the
   * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
   * JSON-RPC method as part of EIP-191.
   *
   * See {recover}.
   */
  function toEthSignedMessageHash(bytes32 hash)
    internal
    pure
    returns (bytes32)
  {
    // 32 is the length in bytes of hash,
    // enforced by the type signature above
    return
      keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
  }

  /**
   * @dev Returns an Ethereum Signed Message, created from `s`. This
   * produces hash corresponding to the one signed with the
   * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
   * JSON-RPC method as part of EIP-191.
   *
   * See {recover}.
   */
  function toEthSignedMessageHash(bytes memory s)
    internal
    pure
    returns (bytes32)
  {
    return
      keccak256(
        abi.encodePacked(
          "\x19Ethereum Signed Message:\n",
          Strings.toString(s.length),
          s
        )
      );
  }

  /**
   * @dev Returns an Ethereum Signed Typed Data, created from a
   * `domainSeparator` and a `structHash`. This produces hash corresponding
   * to the one signed with the
   * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
   * JSON-RPC method as part of EIP-712.
   *
   * See {recover}.
   */
  function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash)
    internal
    pure
    returns (bytes32)
  {
    return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
  }
}
pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

contract DigiMiners is ERC721A, Ownable, ReentrancyGuard {

  using SafeMath for uint256;
  using ECDSA for bytes32;

  using EnumerableSet for EnumerableSet.UintSet;
  uint256 public ALLOWLIST_SALE_START_TIME;
  uint256 public ALLOWLIST_SALE_END_TIME;
  uint256 public PUBLIC_SALE_START_TIME;
  uint256 public PUBLIC_SALE_END_TIME;

  uint256 public MAX_SUPPLY = 10000;
  uint256 public allowListLimitPerwallet = 1;
  uint256 public allowListLimit = 2500;
  uint256 public totalAllowlistMinted;
  uint256 public totalPublicMinted;
  uint256 public MAX_PUBLIC_LIMIT;

  bytes32 public root;

  address private _signerAddress;

  string private baseURI_;

  mapping(address => uint256) private allowlistMinted;
  mapping(address => bool) private publicMinted;
  mapping (address => EnumerableSet.UintSet) private _holderTokens;
  mapping(bytes=>bool) public signUsed;
  event AllowListSaleTimeChanged(uint256 startTime, uint256 endTime);
  event PublicSaleTimeChanged(uint256 startTime, uint256 endTime);

  constructor() ERC721A("DigiMiners", "$MINE") {
    _signerAddress = 0xc37CF7E6573C6fEf0fDeE4aB0115f20E5B24e0b7;
  }


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

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

  function whenAllowlistSaleIsOn() public view returns (bool) {
    if (
      block.timestamp > ALLOWLIST_SALE_START_TIME &&
      block.timestamp < ALLOWLIST_SALE_END_TIME
    ) {
      return true;
    } else {
      return false;
    }
  }

  function whenPublicSaleIsOn() public view returns (bool) {
    if (
      block.timestamp > PUBLIC_SALE_START_TIME &&
      block.timestamp < PUBLIC_SALE_END_TIME
    ) {
      return true;
    } else {
      return false;
    }
  }

  function setPublicLimit(uint256 _limit) public onlyOwner {
    MAX_PUBLIC_LIMIT = _limit;
  }

  function checkAllowListMinted(address _wallet) public view returns (uint256) {
    return allowlistMinted[_wallet];
  }

  function checkPublicMinted(address _wallet) public view returns (bool) {
    return publicMinted[_wallet];
  }

  function setSigner(address _signer) public onlyOwner {
    _signerAddress = _signer;
  }

  function setAllowlistLimit(uint256 _limit) public onlyOwner {
    allowListLimit = _limit;
  }

  function startAllowlistPhase(uint256 startTime, uint256 endTime)
    public
    onlyOwner
  {
    ALLOWLIST_SALE_START_TIME = startTime;
    ALLOWLIST_SALE_END_TIME = endTime;
    emit AllowListSaleTimeChanged(startTime, endTime);
  }

  function changePublicSaleTime(uint256 startTime, uint256 endTime)
    public
    onlyOwner
  {
    PUBLIC_SALE_START_TIME = startTime;
    PUBLIC_SALE_END_TIME = endTime;
    emit PublicSaleTimeChanged(startTime, endTime);
  }

  function allowListMint(bytes32[] calldata proof) public nonReentrant {
    require(whenAllowlistSaleIsOn() == true, "DIGI: Allowlist Sale Not Started Yet");
    require(
      isValid(proof, keccak256(abi.encodePacked(msg.sender))) == true,
      "DIGI: Not a Part of Allowlist"
    );
    allowlistMinted[msg.sender] += 1;
    require(
      allowlistMinted[msg.sender] <= allowListLimitPerwallet,
      "DIGI: You Already Minted Enough"
    );
    totalAllowlistMinted += 1;
    require(
      totalAllowlistMinted <= allowListLimit,
      "DIGI: Allowlist Limit Reached "
    );
    require(totalSupply().add(1) <= MAX_SUPPLY, "DIGI: Exceeding Max Limit");
    _safeMint(msg.sender, 1);
  }

  function publicMint(bytes calldata signature) public nonReentrant {
    require(whenPublicSaleIsOn() == true, "DIGI: Public Sale Not Started Yet");
    require(publicMinted[msg.sender] == false, "DIGI: You Already minted");
    publicMinted[msg.sender] = true;
    require(signUsed[signature]==false, "DIGI: Signature is Used");
    require(
      _signerAddress == checkSign(signature, msg.sender), "DIGI: Invalid Signature"
    );
    signUsed[signature] = true;
    totalPublicMinted += 1;
    require(totalPublicMinted <= MAX_PUBLIC_LIMIT, "DIGI: Public Limit Reached");
    require(totalSupply().add(1) <= MAX_SUPPLY, "DIGI: Exceeding Max Limit");
    _safeMint(msg.sender, 1);
  }
  
  function checkSign(bytes calldata signature, address wallet) public pure returns(address) {
    return
        keccak256(
          abi.encodePacked(
            "\x19Ethereum Signed Message:\n32",
            keccak256(abi.encodePacked(wallet))
          )
        ).recover(signature);
  }

  function getSignData(address wallet) public pure returns(bytes32){
       return keccak256(abi.encodePacked(wallet));
  }

  function ownerMint(uint256 quantity) public onlyOwner {
    require(totalSupply().add(quantity) <= MAX_SUPPLY, "DIGI: Exceeding Max Limit");
    _safeMint(msg.sender, quantity);
  }

  function isValid(bytes32[] memory proof, bytes32 leaf)
    public
    view
    returns (bool)
  {
    return MerkleProof.verify(proof, root, leaf);
  }


  function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {
        return _holderTokens[owner].at(index);
  }

  function getTokenHolding(address owner) public view returns(uint256[] memory) {
    uint256 len = _holderTokens[owner].length();
    uint256[] memory tokens = new uint256[](len);
    for(uint256 i=0;i<len;i++){
      uint256 tokenId = tokenOfOwnerByIndex(owner,i);
      tokens[i] = tokenId;
    }
    return tokens;
  }


  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual override {
    for(uint256 i = 0;i<quantity;i++){
      if(from!=address(0)){
        _holderTokens[from].remove(startTokenId.add(i));
      }
        _holderTokens[to].add(startTokenId.add(i));
    }
  }


  function setRoot(bytes32 _root) public onlyOwner {
    root = _root;
  }

  function withdraw() public onlyOwner {
    payable(owner()).transfer(balanceOf(address(this)));
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"AllowListSaleTimeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"PublicSaleTimeChanged","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":"ALLOWLIST_SALE_END_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ALLOWLIST_SALE_START_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_END_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_START_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListLimitPerwallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"allowListMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"changePublicSaleTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"checkAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"checkPublicMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"wallet","type":"address"}],"name":"checkSign","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","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":"wallet","type":"address"}],"name":"getSignData","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getTokenHolding","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"publicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setAllowlistLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setPublicLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"signUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"startAllowlistPhase","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":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllowlistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPublicMinted","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whenAllowlistSaleIsOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whenPublicSaleIsOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612710600e556001600f556109c46010553480156200002257600080fd5b506040518060400160405280600a81526020017f446967694d696e657273000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f244d494e450000000000000000000000000000000000000000000000000000008152508160029081620000a091906200049f565b508060039081620000b291906200049f565b50620000c36200014e60201b60201c565b6000819055505050620000eb620000df6200015760201b60201c565b6200015f60201b60201c565b600160098190555073c37cf7e6573c6fef0fdee4ab0115f20e5b24e0b7601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000586565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002a757607f821691505b602082108103620002bd57620002bc6200025f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002e8565b620003338683620002e8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003806200037a62000374846200034b565b62000355565b6200034b565b9050919050565b6000819050919050565b6200039c836200035f565b620003b4620003ab8262000387565b848454620002f5565b825550505050565b600090565b620003cb620003bc565b620003d881848462000391565b505050565b5b818110156200040057620003f4600082620003c1565b600181019050620003de565b5050565b601f8211156200044f576200041981620002c3565b6200042484620002d8565b8101602085101562000434578190505b6200044c6200044385620002d8565b830182620003dd565b50505b505050565b600082821c905092915050565b6000620004746000198460080262000454565b1980831691505092915050565b60006200048f838362000461565b9150826002028217905092915050565b620004aa8262000225565b67ffffffffffffffff811115620004c657620004c562000230565b5b620004d282546200028e565b620004df82828562000404565b600060209050601f83116001811462000517576000841562000502578287015190505b6200050e858262000481565b8655506200057e565b601f1984166200052786620002c3565b60005b8281101562000551578489015182556001820191506020850194506020810190506200052a565b868310156200057157848901516200056d601f89168262000461565b8355505b6001600288020188555050505b505050505050565b614da180620005966000396000f3fe6080604052600436106102ae5760003560e01c8063715018a611610175578063bb77b4a8116100dc578063de6892c811610095578063ebf0c7171161006f578063ebf0c71714610ac6578063f19e75d414610af1578063f2fde38b14610b1a578063fc948a4e14610b43576102ae565b8063de6892c814610a37578063e5b6943d14610a60578063e985e9c514610a89576102ae565b8063bb77b4a814610925578063c87b56dd14610950578063d5b349411461098d578063d86bce71146109b8578063dab5f340146109e3578063dcefac7f14610a0c576102ae565b8063acf8c03a1161012e578063acf8c03a146107ec578063ad84b22414610829578063b04c0e0c14610852578063b489578c1461088f578063b88d4fde146108cc578063b8a20ed0146108e8576102ae565b8063715018a6146106f05780638a1ed5e5146107075780638da5cb5b1461074457806395d89b411461076f578063a04b84151461079a578063a22cb465146107c3576102ae565b806332cb6b0c116102195780635346ef6d116101d25780635346ef6d146105d057806355f804b3146105fb5780635cfe6b84146106245780636352211e1461064d5780636c19e7831461068a57806370a08231146106b3576102ae565b806332cb6b0c146104f15780633828914a1461051c5780633b3ac4f8146105475780633ccfd60b146105725780633dd8dcf01461058957806342842e0e146105b4576102ae565b806318160ddd1161026b57806318160ddd146103dc5780631afbe0e114610407578063236376171461044457806323b872dd1461046d5780632b4f3f2b146104895780632f745c59146104b4576102ae565b806301ffc9a7146102b357806306fdde03146102f0578063081812fc1461031b57806308cb78c514610358578063095ea7b3146103955780630d307fa2146103b1575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d5919061332e565b610b6e565b6040516102e79190613376565b60405180910390f35b3480156102fc57600080fd5b50610305610c00565b6040516103129190613421565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613479565b610c92565b60405161034f91906134e7565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190613593565b610d11565b60405161038c91906134e7565b60405180910390f35b6103af60048036038101906103aa91906135f3565b610dbf565b005b3480156103bd57600080fd5b506103c6610f03565b6040516103d39190613642565b60405180910390f35b3480156103e857600080fd5b506103f1610f09565b6040516103fe9190613642565b60405180910390f35b34801561041357600080fd5b5061042e6004803603810190610429919061365d565b610f20565b60405161043b9190613748565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190613479565b611012565b005b6104876004803603810190610482919061376a565b611024565b005b34801561049557600080fd5b5061049e611346565b6040516104ab9190613376565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d691906135f3565b611370565b6040516104e89190613642565b60405180910390f35b3480156104fd57600080fd5b506105066113cb565b6040516105139190613642565b60405180910390f35b34801561052857600080fd5b506105316113d1565b60405161053e9190613642565b60405180910390f35b34801561055357600080fd5b5061055c6113d7565b6040516105699190613642565b60405180910390f35b34801561057e57600080fd5b506105876113dd565b005b34801561059557600080fd5b5061059e61143d565b6040516105ab9190613642565b60405180910390f35b6105ce60048036038101906105c9919061376a565b611443565b005b3480156105dc57600080fd5b506105e5611463565b6040516105f29190613642565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d91906138ed565b611469565b005b34801561063057600080fd5b5061064b6004803603810190610646919061398c565b611484565b005b34801561065957600080fd5b50610674600480360381019061066f9190613479565b611743565b60405161068191906134e7565b60405180910390f35b34801561069657600080fd5b506106b160048036038101906106ac919061365d565b611755565b005b3480156106bf57600080fd5b506106da60048036038101906106d5919061365d565b6117a1565b6040516106e79190613642565b60405180910390f35b3480156106fc57600080fd5b50610705611859565b005b34801561071357600080fd5b5061072e60048036038101906107299190613a7a565b61186d565b60405161073b9190613376565b60405180910390f35b34801561075057600080fd5b506107596118a3565b60405161076691906134e7565b60405180910390f35b34801561077b57600080fd5b506107846118cd565b6040516107919190613421565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc9190613ac3565b61195f565b005b3480156107cf57600080fd5b506107ea60048036038101906107e59190613b2f565b6119b2565b005b3480156107f857600080fd5b50610813600480360381019061080e919061365d565b611abd565b6040516108209190613376565b60405180910390f35b34801561083557600080fd5b50610850600480360381019061084b9190613479565b611b13565b005b34801561085e57600080fd5b506108796004803603810190610874919061365d565b611b25565b6040516108869190613b88565b60405180910390f35b34801561089b57600080fd5b506108b660048036038101906108b1919061365d565b611b55565b6040516108c39190613642565b60405180910390f35b6108e660048036038101906108e19190613ba3565b611b9e565b005b3480156108f457600080fd5b5061090f600480360381019061090a9190613d15565b611c11565b60405161091c9190613376565b60405180910390f35b34801561093157600080fd5b5061093a611c28565b6040516109479190613642565b60405180910390f35b34801561095c57600080fd5b5061097760048036038101906109729190613479565b611c2e565b6040516109849190613421565b60405180910390f35b34801561099957600080fd5b506109a2611ccc565b6040516109af9190613642565b60405180910390f35b3480156109c457600080fd5b506109cd611cd2565b6040516109da9190613642565b60405180910390f35b3480156109ef57600080fd5b50610a0a6004803603810190610a059190613d71565b611cd8565b005b348015610a1857600080fd5b50610a21611cea565b604051610a2e9190613642565b60405180910390f35b348015610a4357600080fd5b50610a5e6004803603810190610a599190613d9e565b611cf0565b005b348015610a6c57600080fd5b50610a876004803603810190610a829190613ac3565b61204f565b005b348015610a9557600080fd5b50610ab06004803603810190610aab9190613deb565b6120a2565b604051610abd9190613376565b60405180910390f35b348015610ad257600080fd5b50610adb612136565b604051610ae89190613b88565b60405180910390f35b348015610afd57600080fd5b50610b186004803603810190610b139190613479565b61213c565b005b348015610b2657600080fd5b50610b416004803603810190610b3c919061365d565b6121af565b005b348015610b4f57600080fd5b50610b58612232565b604051610b659190613376565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bc957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bf95750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610c0f90613e5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3b90613e5a565b8015610c885780601f10610c5d57610100808354040283529160200191610c88565b820191906000526020600020905b815481529060010190602001808311610c6b57829003601f168201915b5050505050905090565b6000610c9d8261225c565b610cd3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610db684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083604051602001610d6c9190613ed3565b60405160208183030381529060405280519060200120604051602001610d929190613f66565b604051602081830303815290604052805190602001206122bb90919063ffffffff16565b90509392505050565b6000610dca82611743565b90508073ffffffffffffffffffffffffffffffffffffffff16610deb6122e2565b73ffffffffffffffffffffffffffffffffffffffff1614610e4e57610e1781610e126122e2565b6120a2565b610e4d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60135481565b6000610f136122ea565b6001546000540303905090565b60606000610f6b601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206122f3565b905060008167ffffffffffffffff811115610f8957610f886137c2565b5b604051908082528060200260200182016040528015610fb75781602001602082028036833780820191505090505b50905060005b82811015611007576000610fd18683611370565b905080838381518110610fe757610fe6613f8c565b5b602002602001018181525050508080610fff90613fea565b915050610fbd565b508092505050919050565b61101a612308565b8060138190555050565b600061102f82612386565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611096576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806110a284612452565b915091506110b881876110b36122e2565b612479565b611104576110cd866110c86122e2565b6120a2565b611103576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361116a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61117786868660016124bd565b801561118257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506112508561122c8888876125df565b7c020000000000000000000000000000000000000000000000000000000017612607565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036112d657600060018501905060006004600083815260200190815260200160002054036112d45760005481146112d3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461133e8686866001612632565b505050505050565b6000600a544211801561135a5750600b5442105b15611368576001905061136d565b600090505b90565b60006113c382601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061263890919063ffffffff16565b905092915050565b600e5481565b60125481565b600a5481565b6113e5612308565b6113ed6118a3565b73ffffffffffffffffffffffffffffffffffffffff166108fc61140f306117a1565b9081150290604051600060405180830381858888f1935050505015801561143a573d6000803e3d6000fd5b50565b600b5481565b61145e83838360405180602001604052806000815250611b9e565b505050565b60105481565b611471612308565b806016908161148091906141de565b5050565b61148c612652565b60011515611498611346565b1515146114da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d190614322565b60405180910390fd5b6001151561154f838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050336040516020016115349190613ed3565b60405160208183030381529060405280519060200120611c11565b151514611591576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115889061438e565b60405180910390fd5b6001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115e191906143ae565b92505081905550600f54601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561166c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116639061442e565b60405180910390fd5b60016011600082825461167f91906143ae565b9250508190555060105460115411156116cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c49061449a565b60405180910390fd5b600e546116eb60016116dd610f09565b6126a190919063ffffffff16565b111561172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390614506565b60405180910390fd5b6117373360016126b7565b61173f6126d5565b5050565b600061174e82612386565b9050919050565b61175d612308565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611808576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611861612308565b61186b60006126df565b565b601a818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546118dc90613e5a565b80601f016020809104026020016040519081016040528092919081815260200182805461190890613e5a565b80156119555780601f1061192a57610100808354040283529160200191611955565b820191906000526020600020905b81548152906001019060200180831161193857829003601f168201915b5050505050905090565b611967612308565b81600a8190555080600b819055507fda999b11e6cfa9a612d58a7d65d1ea29003c9bf56113d2def65dbed3c5e6948b82826040516119a6929190614526565b60405180910390a15050565b80600760006119bf6122e2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a6c6122e2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ab19190613376565b60405180910390a35050565b6000601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611b1b612308565b8060108190555050565b600081604051602001611b389190613ed3565b604051602081830303815290604052805190602001209050919050565b6000601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ba9848484611024565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611c0b57611bd4848484846127a5565b611c0a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6000611c2083601454846128f5565b905092915050565b600f5481565b6060611c398261225c565b611c6f576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c7961290c565b90506000815103611c995760405180602001604052806000815250611cc4565b80611ca38461299e565b604051602001611cb4929190614580565b6040516020818303038152906040525b915050919050565b600d5481565b60115481565b611ce0612308565b8060148190555050565b600c5481565b611cf8612652565b60011515611d04612232565b151514611d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3d90614616565b60405180910390fd5b60001515601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd090614682565b60405180910390fd5b6001601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060001515601a8383604051611e479291906146d2565b908152602001604051809103902060009054906101000a900460ff16151514611ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9c90614737565b60405180910390fd5b611eb0828233610d11565b73ffffffffffffffffffffffffffffffffffffffff16601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f36906147a3565b60405180910390fd5b6001601a8383604051611f539291906146d2565b908152602001604051809103902060006101000a81548160ff021916908315150217905550600160126000828254611f8b91906143ae565b925050819055506013546012541115611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd09061480f565b60405180910390fd5b600e54611ff76001611fe9610f09565b6126a190919063ffffffff16565b1115612038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202f90614506565b60405180910390fd5b6120433360016126b7565b61204b6126d5565b5050565b612057612308565b81600c8190555080600d819055507f53bb3f0edf5961602b6c985f8d776a7241ad4458cb383fe8233e64154647d08d8282604051612096929190614526565b60405180910390a15050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60145481565b612144612308565b600e5461216182612153610f09565b6126a190919063ffffffff16565b11156121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990614506565b60405180910390fd5b6121ac33826126b7565b50565b6121b7612308565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221d906148a1565b60405180910390fd5b61222f816126df565b50565b6000600c54421180156122465750600d5442105b156122545760019050612259565b600090505b90565b6000816122676122ea565b11158015612276575060005482105b80156122b4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008060006122ca85856129ee565b915091506122d781612a6f565b819250505092915050565b600033905090565b60006001905090565b600061230182600001612c3b565b9050919050565b612310612c4c565b73ffffffffffffffffffffffffffffffffffffffff1661232e6118a3565b73ffffffffffffffffffffffffffffffffffffffff1614612384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237b9061490d565b60405180910390fd5b565b600080829050806123956122ea565b1161241b5760005481101561241a5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612418575b6000810361240e5760046000836001900393508381526020019081526020016000205490506123e4565b809250505061244d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b60005b818110156125d857600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146125615761255f61251282856126a190919063ffffffff16565b601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c5490919063ffffffff16565b505b6125c461257782856126a190919063ffffffff16565b601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c6e90919063ffffffff16565b5080806125d090613fea565b9150506124c0565b5050505050565b60008060e883901c905060e86125f6868684612c88565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006126478360000183612c91565b60001c905092915050565b600260095403612697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268e90614979565b60405180910390fd5b6002600981905550565b600081836126af91906143ae565b905092915050565b6126d1828260405180602001604052806000815250612cbc565b5050565b6001600981905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127cb6122e2565b8786866040518563ffffffff1660e01b81526004016127ed94939291906149ee565b6020604051808303816000875af192505050801561282957506040513d601f19601f820116820180604052508101906128269190614a4f565b60015b6128a2573d8060008114612859576040519150601f19603f3d011682016040523d82523d6000602084013e61285e565b606091505b50600081510361289a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000826129028584612d59565b1490509392505050565b60606016805461291b90613e5a565b80601f016020809104026020016040519081016040528092919081815260200182805461294790613e5a565b80156129945780601f1061296957610100808354040283529160200191612994565b820191906000526020600020905b81548152906001019060200180831161297757829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156129d957600184039350600a81066030018453600a81049050806129b7575b50828103602084039350808452505050919050565b6000806041835103612a2f5760008060006020860151925060408601519150606086015160001a9050612a2387828585612dce565b94509450505050612a68565b6040835103612a5f576000806020850151915060408501519050612a54868383612eda565b935093505050612a68565b60006002915091505b9250929050565b60006004811115612a8357612a82614a7c565b5b816004811115612a9657612a95614a7c565b5b0315612c385760016004811115612ab057612aaf614a7c565b5b816004811115612ac357612ac2614a7c565b5b03612b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afa90614af7565b60405180910390fd5b60026004811115612b1757612b16614a7c565b5b816004811115612b2a57612b29614a7c565b5b03612b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6190614b63565b60405180910390fd5b60036004811115612b7e57612b7d614a7c565b5b816004811115612b9157612b90614a7c565b5b03612bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc890614bf5565b60405180910390fd5b600480811115612be457612be3614a7c565b5b816004811115612bf757612bf6614a7c565b5b03612c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2e90614c87565b60405180910390fd5b5b50565b600081600001805490509050919050565b600033905090565b6000612c66836000018360001b612f39565b905092915050565b6000612c80836000018360001b61304d565b905092915050565b60009392505050565b6000826000018281548110612ca957612ca8613f8c565b5b9060005260206000200154905092915050565b612cc683836130bd565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612d5457600080549050600083820390505b612d0660008683806001019450866127a5565b612d3c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612cf3578160005414612d5157600080fd5b50505b505050565b60008082905060005b8451811015612dc3576000858281518110612d8057612d7f613f8c565b5b60200260200101519050808311612da257612d9b8382613278565b9250612daf565b612dac8184613278565b92505b508080612dbb90613fea565b915050612d62565b508091505092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612e09576000600391509150612ed1565b601b8560ff1614158015612e215750601c8560ff1614155b15612e33576000600491509150612ed1565b600060018787878760405160008152602001604052604051612e589493929190614cc3565b6020604051602081039080840390855afa158015612e7a573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ec857600060019250925050612ed1565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c612f1d91906143ae565b9050612f2b87828885612dce565b935093505050935093915050565b60008083600101600084815260200190815260200160002054905060008114613041576000600182612f6b9190614d08565b9050600060018660000180549050612f839190614d08565b9050818114612ff2576000866000018281548110612fa457612fa3613f8c565b5b9060005260206000200154905080876000018481548110612fc857612fc7613f8c565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061300657613005614d3c565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613047565b60009150505b92915050565b6000613059838361328f565b6130b25782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506130b7565b600090505b92915050565b600080549050600082036130fd576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61310a60008483856124bd565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506131818361317260008660006125df565b61317b856132b2565b17612607565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461322257808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506131e7565b506000820361325d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506132736000848385612632565b505050565b600082600052816020526040600020905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61330b816132d6565b811461331657600080fd5b50565b60008135905061332881613302565b92915050565b600060208284031215613344576133436132cc565b5b600061335284828501613319565b91505092915050565b60008115159050919050565b6133708161335b565b82525050565b600060208201905061338b6000830184613367565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133cb5780820151818401526020810190506133b0565b60008484015250505050565b6000601f19601f8301169050919050565b60006133f382613391565b6133fd818561339c565b935061340d8185602086016133ad565b613416816133d7565b840191505092915050565b6000602082019050818103600083015261343b81846133e8565b905092915050565b6000819050919050565b61345681613443565b811461346157600080fd5b50565b6000813590506134738161344d565b92915050565b60006020828403121561348f5761348e6132cc565b5b600061349d84828501613464565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134d1826134a6565b9050919050565b6134e1816134c6565b82525050565b60006020820190506134fc60008301846134d8565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261352757613526613502565b5b8235905067ffffffffffffffff81111561354457613543613507565b5b6020830191508360018202830111156135605761355f61350c565b5b9250929050565b613570816134c6565b811461357b57600080fd5b50565b60008135905061358d81613567565b92915050565b6000806000604084860312156135ac576135ab6132cc565b5b600084013567ffffffffffffffff8111156135ca576135c96132d1565b5b6135d686828701613511565b935093505060206135e98682870161357e565b9150509250925092565b6000806040838503121561360a576136096132cc565b5b60006136188582860161357e565b925050602061362985828601613464565b9150509250929050565b61363c81613443565b82525050565b60006020820190506136576000830184613633565b92915050565b600060208284031215613673576136726132cc565b5b60006136818482850161357e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136bf81613443565b82525050565b60006136d183836136b6565b60208301905092915050565b6000602082019050919050565b60006136f58261368a565b6136ff8185613695565b935061370a836136a6565b8060005b8381101561373b57815161372288826136c5565b975061372d836136dd565b92505060018101905061370e565b5085935050505092915050565b6000602082019050818103600083015261376281846136ea565b905092915050565b600080600060608486031215613783576137826132cc565b5b60006137918682870161357e565b93505060206137a28682870161357e565b92505060406137b386828701613464565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137fa826133d7565b810181811067ffffffffffffffff82111715613819576138186137c2565b5b80604052505050565b600061382c6132c2565b905061383882826137f1565b919050565b600067ffffffffffffffff821115613858576138576137c2565b5b613861826133d7565b9050602081019050919050565b82818337600083830152505050565b600061389061388b8461383d565b613822565b9050828152602081018484840111156138ac576138ab6137bd565b5b6138b784828561386e565b509392505050565b600082601f8301126138d4576138d3613502565b5b81356138e484826020860161387d565b91505092915050565b600060208284031215613903576139026132cc565b5b600082013567ffffffffffffffff811115613921576139206132d1565b5b61392d848285016138bf565b91505092915050565b60008083601f84011261394c5761394b613502565b5b8235905067ffffffffffffffff81111561396957613968613507565b5b6020830191508360208202830111156139855761398461350c565b5b9250929050565b600080602083850312156139a3576139a26132cc565b5b600083013567ffffffffffffffff8111156139c1576139c06132d1565b5b6139cd85828601613936565b92509250509250929050565b600067ffffffffffffffff8211156139f4576139f36137c2565b5b6139fd826133d7565b9050602081019050919050565b6000613a1d613a18846139d9565b613822565b905082815260208101848484011115613a3957613a386137bd565b5b613a4484828561386e565b509392505050565b600082601f830112613a6157613a60613502565b5b8135613a71848260208601613a0a565b91505092915050565b600060208284031215613a9057613a8f6132cc565b5b600082013567ffffffffffffffff811115613aae57613aad6132d1565b5b613aba84828501613a4c565b91505092915050565b60008060408385031215613ada57613ad96132cc565b5b6000613ae885828601613464565b9250506020613af985828601613464565b9150509250929050565b613b0c8161335b565b8114613b1757600080fd5b50565b600081359050613b2981613b03565b92915050565b60008060408385031215613b4657613b456132cc565b5b6000613b548582860161357e565b9250506020613b6585828601613b1a565b9150509250929050565b6000819050919050565b613b8281613b6f565b82525050565b6000602082019050613b9d6000830184613b79565b92915050565b60008060008060808587031215613bbd57613bbc6132cc565b5b6000613bcb8782880161357e565b9450506020613bdc8782880161357e565b9350506040613bed87828801613464565b925050606085013567ffffffffffffffff811115613c0e57613c0d6132d1565b5b613c1a87828801613a4c565b91505092959194509250565b600067ffffffffffffffff821115613c4157613c406137c2565b5b602082029050602081019050919050565b613c5b81613b6f565b8114613c6657600080fd5b50565b600081359050613c7881613c52565b92915050565b6000613c91613c8c84613c26565b613822565b90508083825260208201905060208402830185811115613cb457613cb361350c565b5b835b81811015613cdd5780613cc98882613c69565b845260208401935050602081019050613cb6565b5050509392505050565b600082601f830112613cfc57613cfb613502565b5b8135613d0c848260208601613c7e565b91505092915050565b60008060408385031215613d2c57613d2b6132cc565b5b600083013567ffffffffffffffff811115613d4a57613d496132d1565b5b613d5685828601613ce7565b9250506020613d6785828601613c69565b9150509250929050565b600060208284031215613d8757613d866132cc565b5b6000613d9584828501613c69565b91505092915050565b60008060208385031215613db557613db46132cc565b5b600083013567ffffffffffffffff811115613dd357613dd26132d1565b5b613ddf85828601613511565b92509250509250929050565b60008060408385031215613e0257613e016132cc565b5b6000613e108582860161357e565b9250506020613e218582860161357e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e7257607f821691505b602082108103613e8557613e84613e2b565b5b50919050565b60008160601b9050919050565b6000613ea382613e8b565b9050919050565b6000613eb582613e98565b9050919050565b613ecd613ec8826134c6565b613eaa565b82525050565b6000613edf8284613ebc565b60148201915081905092915050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000613f2f601c83613eee565b9150613f3a82613ef9565b601c82019050919050565b6000819050919050565b613f60613f5b82613b6f565b613f45565b82525050565b6000613f7182613f22565b9150613f7d8284613f4f565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ff582613443565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361402757614026613fbb565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614057565b61409e8683614057565b95508019841693508086168417925050509392505050565b6000819050919050565b60006140db6140d66140d184613443565b6140b6565b613443565b9050919050565b6000819050919050565b6140f5836140c0565b614109614101826140e2565b848454614064565b825550505050565b600090565b61411e614111565b6141298184846140ec565b505050565b5b8181101561414d57614142600082614116565b60018101905061412f565b5050565b601f8211156141925761416381614032565b61416c84614047565b8101602085101561417b578190505b61418f61418785614047565b83018261412e565b50505b505050565b600082821c905092915050565b60006141b560001984600802614197565b1980831691505092915050565b60006141ce83836141a4565b9150826002028217905092915050565b6141e782613391565b67ffffffffffffffff811115614200576141ff6137c2565b5b61420a8254613e5a565b614215828285614151565b600060209050601f8311600181146142485760008415614236578287015190505b61424085826141c2565b8655506142a8565b601f19841661425686614032565b60005b8281101561427e57848901518255600182019150602085019450602081019050614259565b8683101561429b5784890151614297601f8916826141a4565b8355505b6001600288020188555050505b505050505050565b7f444947493a20416c6c6f776c6973742053616c65204e6f74205374617274656460008201527f2059657400000000000000000000000000000000000000000000000000000000602082015250565b600061430c60248361339c565b9150614317826142b0565b604082019050919050565b6000602082019050818103600083015261433b816142ff565b9050919050565b7f444947493a204e6f7420612050617274206f6620416c6c6f776c697374000000600082015250565b6000614378601d8361339c565b915061438382614342565b602082019050919050565b600060208201905081810360008301526143a78161436b565b9050919050565b60006143b982613443565b91506143c483613443565b92508282019050808211156143dc576143db613fbb565b5b92915050565b7f444947493a20596f7520416c7265616479204d696e74656420456e6f75676800600082015250565b6000614418601f8361339c565b9150614423826143e2565b602082019050919050565b600060208201905081810360008301526144478161440b565b9050919050565b7f444947493a20416c6c6f776c697374204c696d69742052656163686564200000600082015250565b6000614484601e8361339c565b915061448f8261444e565b602082019050919050565b600060208201905081810360008301526144b381614477565b9050919050565b7f444947493a20457863656564696e67204d6178204c696d697400000000000000600082015250565b60006144f060198361339c565b91506144fb826144ba565b602082019050919050565b6000602082019050818103600083015261451f816144e3565b9050919050565b600060408201905061453b6000830185613633565b6145486020830184613633565b9392505050565b600061455a82613391565b6145648185613eee565b93506145748185602086016133ad565b80840191505092915050565b600061458c828561454f565b9150614598828461454f565b91508190509392505050565b7f444947493a205075626c69632053616c65204e6f74205374617274656420596560008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b600061460060218361339c565b915061460b826145a4565b604082019050919050565b6000602082019050818103600083015261462f816145f3565b9050919050565b7f444947493a20596f7520416c7265616479206d696e7465640000000000000000600082015250565b600061466c60188361339c565b915061467782614636565b602082019050919050565b6000602082019050818103600083015261469b8161465f565b9050919050565b600081905092915050565b60006146b983856146a2565b93506146c683858461386e565b82840190509392505050565b60006146df8284866146ad565b91508190509392505050565b7f444947493a205369676e61747572652069732055736564000000000000000000600082015250565b600061472160178361339c565b915061472c826146eb565b602082019050919050565b6000602082019050818103600083015261475081614714565b9050919050565b7f444947493a20496e76616c6964205369676e6174757265000000000000000000600082015250565b600061478d60178361339c565b915061479882614757565b602082019050919050565b600060208201905081810360008301526147bc81614780565b9050919050565b7f444947493a205075626c6963204c696d69742052656163686564000000000000600082015250565b60006147f9601a8361339c565b9150614804826147c3565b602082019050919050565b60006020820190508181036000830152614828816147ec565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061488b60268361339c565b91506148968261482f565b604082019050919050565b600060208201905081810360008301526148ba8161487e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148f760208361339c565b9150614902826148c1565b602082019050919050565b60006020820190508181036000830152614926816148ea565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614963601f8361339c565b915061496e8261492d565b602082019050919050565b6000602082019050818103600083015261499281614956565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006149c082614999565b6149ca81856149a4565b93506149da8185602086016133ad565b6149e3816133d7565b840191505092915050565b6000608082019050614a0360008301876134d8565b614a1060208301866134d8565b614a1d6040830185613633565b8181036060830152614a2f81846149b5565b905095945050505050565b600081519050614a4981613302565b92915050565b600060208284031215614a6557614a646132cc565b5b6000614a7384828501614a3a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614ae160188361339c565b9150614aec82614aab565b602082019050919050565b60006020820190508181036000830152614b1081614ad4565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614b4d601f8361339c565b9150614b5882614b17565b602082019050919050565b60006020820190508181036000830152614b7c81614b40565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bdf60228361339c565b9150614bea82614b83565b604082019050919050565b60006020820190508181036000830152614c0e81614bd2565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c7160228361339c565b9150614c7c82614c15565b604082019050919050565b60006020820190508181036000830152614ca081614c64565b9050919050565b600060ff82169050919050565b614cbd81614ca7565b82525050565b6000608082019050614cd86000830187613b79565b614ce56020830186614cb4565b614cf26040830185613b79565b614cff6060830184613b79565b95945050505050565b6000614d1382613443565b9150614d1e83613443565b9250828203905081811115614d3657614d35613fbb565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220019f0f3d703191f0f551769253eed5f4d62d07620fcbc6a8ba1131e2cb7e3a6e64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c8063715018a611610175578063bb77b4a8116100dc578063de6892c811610095578063ebf0c7171161006f578063ebf0c71714610ac6578063f19e75d414610af1578063f2fde38b14610b1a578063fc948a4e14610b43576102ae565b8063de6892c814610a37578063e5b6943d14610a60578063e985e9c514610a89576102ae565b8063bb77b4a814610925578063c87b56dd14610950578063d5b349411461098d578063d86bce71146109b8578063dab5f340146109e3578063dcefac7f14610a0c576102ae565b8063acf8c03a1161012e578063acf8c03a146107ec578063ad84b22414610829578063b04c0e0c14610852578063b489578c1461088f578063b88d4fde146108cc578063b8a20ed0146108e8576102ae565b8063715018a6146106f05780638a1ed5e5146107075780638da5cb5b1461074457806395d89b411461076f578063a04b84151461079a578063a22cb465146107c3576102ae565b806332cb6b0c116102195780635346ef6d116101d25780635346ef6d146105d057806355f804b3146105fb5780635cfe6b84146106245780636352211e1461064d5780636c19e7831461068a57806370a08231146106b3576102ae565b806332cb6b0c146104f15780633828914a1461051c5780633b3ac4f8146105475780633ccfd60b146105725780633dd8dcf01461058957806342842e0e146105b4576102ae565b806318160ddd1161026b57806318160ddd146103dc5780631afbe0e114610407578063236376171461044457806323b872dd1461046d5780632b4f3f2b146104895780632f745c59146104b4576102ae565b806301ffc9a7146102b357806306fdde03146102f0578063081812fc1461031b57806308cb78c514610358578063095ea7b3146103955780630d307fa2146103b1575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d5919061332e565b610b6e565b6040516102e79190613376565b60405180910390f35b3480156102fc57600080fd5b50610305610c00565b6040516103129190613421565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613479565b610c92565b60405161034f91906134e7565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190613593565b610d11565b60405161038c91906134e7565b60405180910390f35b6103af60048036038101906103aa91906135f3565b610dbf565b005b3480156103bd57600080fd5b506103c6610f03565b6040516103d39190613642565b60405180910390f35b3480156103e857600080fd5b506103f1610f09565b6040516103fe9190613642565b60405180910390f35b34801561041357600080fd5b5061042e6004803603810190610429919061365d565b610f20565b60405161043b9190613748565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190613479565b611012565b005b6104876004803603810190610482919061376a565b611024565b005b34801561049557600080fd5b5061049e611346565b6040516104ab9190613376565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d691906135f3565b611370565b6040516104e89190613642565b60405180910390f35b3480156104fd57600080fd5b506105066113cb565b6040516105139190613642565b60405180910390f35b34801561052857600080fd5b506105316113d1565b60405161053e9190613642565b60405180910390f35b34801561055357600080fd5b5061055c6113d7565b6040516105699190613642565b60405180910390f35b34801561057e57600080fd5b506105876113dd565b005b34801561059557600080fd5b5061059e61143d565b6040516105ab9190613642565b60405180910390f35b6105ce60048036038101906105c9919061376a565b611443565b005b3480156105dc57600080fd5b506105e5611463565b6040516105f29190613642565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d91906138ed565b611469565b005b34801561063057600080fd5b5061064b6004803603810190610646919061398c565b611484565b005b34801561065957600080fd5b50610674600480360381019061066f9190613479565b611743565b60405161068191906134e7565b60405180910390f35b34801561069657600080fd5b506106b160048036038101906106ac919061365d565b611755565b005b3480156106bf57600080fd5b506106da60048036038101906106d5919061365d565b6117a1565b6040516106e79190613642565b60405180910390f35b3480156106fc57600080fd5b50610705611859565b005b34801561071357600080fd5b5061072e60048036038101906107299190613a7a565b61186d565b60405161073b9190613376565b60405180910390f35b34801561075057600080fd5b506107596118a3565b60405161076691906134e7565b60405180910390f35b34801561077b57600080fd5b506107846118cd565b6040516107919190613421565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc9190613ac3565b61195f565b005b3480156107cf57600080fd5b506107ea60048036038101906107e59190613b2f565b6119b2565b005b3480156107f857600080fd5b50610813600480360381019061080e919061365d565b611abd565b6040516108209190613376565b60405180910390f35b34801561083557600080fd5b50610850600480360381019061084b9190613479565b611b13565b005b34801561085e57600080fd5b506108796004803603810190610874919061365d565b611b25565b6040516108869190613b88565b60405180910390f35b34801561089b57600080fd5b506108b660048036038101906108b1919061365d565b611b55565b6040516108c39190613642565b60405180910390f35b6108e660048036038101906108e19190613ba3565b611b9e565b005b3480156108f457600080fd5b5061090f600480360381019061090a9190613d15565b611c11565b60405161091c9190613376565b60405180910390f35b34801561093157600080fd5b5061093a611c28565b6040516109479190613642565b60405180910390f35b34801561095c57600080fd5b5061097760048036038101906109729190613479565b611c2e565b6040516109849190613421565b60405180910390f35b34801561099957600080fd5b506109a2611ccc565b6040516109af9190613642565b60405180910390f35b3480156109c457600080fd5b506109cd611cd2565b6040516109da9190613642565b60405180910390f35b3480156109ef57600080fd5b50610a0a6004803603810190610a059190613d71565b611cd8565b005b348015610a1857600080fd5b50610a21611cea565b604051610a2e9190613642565b60405180910390f35b348015610a4357600080fd5b50610a5e6004803603810190610a599190613d9e565b611cf0565b005b348015610a6c57600080fd5b50610a876004803603810190610a829190613ac3565b61204f565b005b348015610a9557600080fd5b50610ab06004803603810190610aab9190613deb565b6120a2565b604051610abd9190613376565b60405180910390f35b348015610ad257600080fd5b50610adb612136565b604051610ae89190613b88565b60405180910390f35b348015610afd57600080fd5b50610b186004803603810190610b139190613479565b61213c565b005b348015610b2657600080fd5b50610b416004803603810190610b3c919061365d565b6121af565b005b348015610b4f57600080fd5b50610b58612232565b604051610b659190613376565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bc957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bf95750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610c0f90613e5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3b90613e5a565b8015610c885780601f10610c5d57610100808354040283529160200191610c88565b820191906000526020600020905b815481529060010190602001808311610c6b57829003601f168201915b5050505050905090565b6000610c9d8261225c565b610cd3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610db684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083604051602001610d6c9190613ed3565b60405160208183030381529060405280519060200120604051602001610d929190613f66565b604051602081830303815290604052805190602001206122bb90919063ffffffff16565b90509392505050565b6000610dca82611743565b90508073ffffffffffffffffffffffffffffffffffffffff16610deb6122e2565b73ffffffffffffffffffffffffffffffffffffffff1614610e4e57610e1781610e126122e2565b6120a2565b610e4d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60135481565b6000610f136122ea565b6001546000540303905090565b60606000610f6b601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206122f3565b905060008167ffffffffffffffff811115610f8957610f886137c2565b5b604051908082528060200260200182016040528015610fb75781602001602082028036833780820191505090505b50905060005b82811015611007576000610fd18683611370565b905080838381518110610fe757610fe6613f8c565b5b602002602001018181525050508080610fff90613fea565b915050610fbd565b508092505050919050565b61101a612308565b8060138190555050565b600061102f82612386565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611096576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806110a284612452565b915091506110b881876110b36122e2565b612479565b611104576110cd866110c86122e2565b6120a2565b611103576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361116a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61117786868660016124bd565b801561118257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506112508561122c8888876125df565b7c020000000000000000000000000000000000000000000000000000000017612607565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036112d657600060018501905060006004600083815260200190815260200160002054036112d45760005481146112d3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461133e8686866001612632565b505050505050565b6000600a544211801561135a5750600b5442105b15611368576001905061136d565b600090505b90565b60006113c382601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061263890919063ffffffff16565b905092915050565b600e5481565b60125481565b600a5481565b6113e5612308565b6113ed6118a3565b73ffffffffffffffffffffffffffffffffffffffff166108fc61140f306117a1565b9081150290604051600060405180830381858888f1935050505015801561143a573d6000803e3d6000fd5b50565b600b5481565b61145e83838360405180602001604052806000815250611b9e565b505050565b60105481565b611471612308565b806016908161148091906141de565b5050565b61148c612652565b60011515611498611346565b1515146114da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d190614322565b60405180910390fd5b6001151561154f838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050336040516020016115349190613ed3565b60405160208183030381529060405280519060200120611c11565b151514611591576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115889061438e565b60405180910390fd5b6001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115e191906143ae565b92505081905550600f54601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561166c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116639061442e565b60405180910390fd5b60016011600082825461167f91906143ae565b9250508190555060105460115411156116cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c49061449a565b60405180910390fd5b600e546116eb60016116dd610f09565b6126a190919063ffffffff16565b111561172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390614506565b60405180910390fd5b6117373360016126b7565b61173f6126d5565b5050565b600061174e82612386565b9050919050565b61175d612308565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611808576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611861612308565b61186b60006126df565b565b601a818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546118dc90613e5a565b80601f016020809104026020016040519081016040528092919081815260200182805461190890613e5a565b80156119555780601f1061192a57610100808354040283529160200191611955565b820191906000526020600020905b81548152906001019060200180831161193857829003601f168201915b5050505050905090565b611967612308565b81600a8190555080600b819055507fda999b11e6cfa9a612d58a7d65d1ea29003c9bf56113d2def65dbed3c5e6948b82826040516119a6929190614526565b60405180910390a15050565b80600760006119bf6122e2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a6c6122e2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ab19190613376565b60405180910390a35050565b6000601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611b1b612308565b8060108190555050565b600081604051602001611b389190613ed3565b604051602081830303815290604052805190602001209050919050565b6000601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ba9848484611024565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611c0b57611bd4848484846127a5565b611c0a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6000611c2083601454846128f5565b905092915050565b600f5481565b6060611c398261225c565b611c6f576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c7961290c565b90506000815103611c995760405180602001604052806000815250611cc4565b80611ca38461299e565b604051602001611cb4929190614580565b6040516020818303038152906040525b915050919050565b600d5481565b60115481565b611ce0612308565b8060148190555050565b600c5481565b611cf8612652565b60011515611d04612232565b151514611d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3d90614616565b60405180910390fd5b60001515601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd090614682565b60405180910390fd5b6001601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060001515601a8383604051611e479291906146d2565b908152602001604051809103902060009054906101000a900460ff16151514611ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9c90614737565b60405180910390fd5b611eb0828233610d11565b73ffffffffffffffffffffffffffffffffffffffff16601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f36906147a3565b60405180910390fd5b6001601a8383604051611f539291906146d2565b908152602001604051809103902060006101000a81548160ff021916908315150217905550600160126000828254611f8b91906143ae565b925050819055506013546012541115611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd09061480f565b60405180910390fd5b600e54611ff76001611fe9610f09565b6126a190919063ffffffff16565b1115612038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202f90614506565b60405180910390fd5b6120433360016126b7565b61204b6126d5565b5050565b612057612308565b81600c8190555080600d819055507f53bb3f0edf5961602b6c985f8d776a7241ad4458cb383fe8233e64154647d08d8282604051612096929190614526565b60405180910390a15050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60145481565b612144612308565b600e5461216182612153610f09565b6126a190919063ffffffff16565b11156121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990614506565b60405180910390fd5b6121ac33826126b7565b50565b6121b7612308565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221d906148a1565b60405180910390fd5b61222f816126df565b50565b6000600c54421180156122465750600d5442105b156122545760019050612259565b600090505b90565b6000816122676122ea565b11158015612276575060005482105b80156122b4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008060006122ca85856129ee565b915091506122d781612a6f565b819250505092915050565b600033905090565b60006001905090565b600061230182600001612c3b565b9050919050565b612310612c4c565b73ffffffffffffffffffffffffffffffffffffffff1661232e6118a3565b73ffffffffffffffffffffffffffffffffffffffff1614612384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237b9061490d565b60405180910390fd5b565b600080829050806123956122ea565b1161241b5760005481101561241a5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612418575b6000810361240e5760046000836001900393508381526020019081526020016000205490506123e4565b809250505061244d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b60005b818110156125d857600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146125615761255f61251282856126a190919063ffffffff16565b601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c5490919063ffffffff16565b505b6125c461257782856126a190919063ffffffff16565b601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c6e90919063ffffffff16565b5080806125d090613fea565b9150506124c0565b5050505050565b60008060e883901c905060e86125f6868684612c88565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006126478360000183612c91565b60001c905092915050565b600260095403612697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268e90614979565b60405180910390fd5b6002600981905550565b600081836126af91906143ae565b905092915050565b6126d1828260405180602001604052806000815250612cbc565b5050565b6001600981905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127cb6122e2565b8786866040518563ffffffff1660e01b81526004016127ed94939291906149ee565b6020604051808303816000875af192505050801561282957506040513d601f19601f820116820180604052508101906128269190614a4f565b60015b6128a2573d8060008114612859576040519150601f19603f3d011682016040523d82523d6000602084013e61285e565b606091505b50600081510361289a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000826129028584612d59565b1490509392505050565b60606016805461291b90613e5a565b80601f016020809104026020016040519081016040528092919081815260200182805461294790613e5a565b80156129945780601f1061296957610100808354040283529160200191612994565b820191906000526020600020905b81548152906001019060200180831161297757829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156129d957600184039350600a81066030018453600a81049050806129b7575b50828103602084039350808452505050919050565b6000806041835103612a2f5760008060006020860151925060408601519150606086015160001a9050612a2387828585612dce565b94509450505050612a68565b6040835103612a5f576000806020850151915060408501519050612a54868383612eda565b935093505050612a68565b60006002915091505b9250929050565b60006004811115612a8357612a82614a7c565b5b816004811115612a9657612a95614a7c565b5b0315612c385760016004811115612ab057612aaf614a7c565b5b816004811115612ac357612ac2614a7c565b5b03612b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afa90614af7565b60405180910390fd5b60026004811115612b1757612b16614a7c565b5b816004811115612b2a57612b29614a7c565b5b03612b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6190614b63565b60405180910390fd5b60036004811115612b7e57612b7d614a7c565b5b816004811115612b9157612b90614a7c565b5b03612bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc890614bf5565b60405180910390fd5b600480811115612be457612be3614a7c565b5b816004811115612bf757612bf6614a7c565b5b03612c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2e90614c87565b60405180910390fd5b5b50565b600081600001805490509050919050565b600033905090565b6000612c66836000018360001b612f39565b905092915050565b6000612c80836000018360001b61304d565b905092915050565b60009392505050565b6000826000018281548110612ca957612ca8613f8c565b5b9060005260206000200154905092915050565b612cc683836130bd565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612d5457600080549050600083820390505b612d0660008683806001019450866127a5565b612d3c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612cf3578160005414612d5157600080fd5b50505b505050565b60008082905060005b8451811015612dc3576000858281518110612d8057612d7f613f8c565b5b60200260200101519050808311612da257612d9b8382613278565b9250612daf565b612dac8184613278565b92505b508080612dbb90613fea565b915050612d62565b508091505092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612e09576000600391509150612ed1565b601b8560ff1614158015612e215750601c8560ff1614155b15612e33576000600491509150612ed1565b600060018787878760405160008152602001604052604051612e589493929190614cc3565b6020604051602081039080840390855afa158015612e7a573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ec857600060019250925050612ed1565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c612f1d91906143ae565b9050612f2b87828885612dce565b935093505050935093915050565b60008083600101600084815260200190815260200160002054905060008114613041576000600182612f6b9190614d08565b9050600060018660000180549050612f839190614d08565b9050818114612ff2576000866000018281548110612fa457612fa3613f8c565b5b9060005260206000200154905080876000018481548110612fc857612fc7613f8c565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061300657613005614d3c565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613047565b60009150505b92915050565b6000613059838361328f565b6130b25782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506130b7565b600090505b92915050565b600080549050600082036130fd576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61310a60008483856124bd565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506131818361317260008660006125df565b61317b856132b2565b17612607565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461322257808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506131e7565b506000820361325d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506132736000848385612632565b505050565b600082600052816020526040600020905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61330b816132d6565b811461331657600080fd5b50565b60008135905061332881613302565b92915050565b600060208284031215613344576133436132cc565b5b600061335284828501613319565b91505092915050565b60008115159050919050565b6133708161335b565b82525050565b600060208201905061338b6000830184613367565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133cb5780820151818401526020810190506133b0565b60008484015250505050565b6000601f19601f8301169050919050565b60006133f382613391565b6133fd818561339c565b935061340d8185602086016133ad565b613416816133d7565b840191505092915050565b6000602082019050818103600083015261343b81846133e8565b905092915050565b6000819050919050565b61345681613443565b811461346157600080fd5b50565b6000813590506134738161344d565b92915050565b60006020828403121561348f5761348e6132cc565b5b600061349d84828501613464565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134d1826134a6565b9050919050565b6134e1816134c6565b82525050565b60006020820190506134fc60008301846134d8565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261352757613526613502565b5b8235905067ffffffffffffffff81111561354457613543613507565b5b6020830191508360018202830111156135605761355f61350c565b5b9250929050565b613570816134c6565b811461357b57600080fd5b50565b60008135905061358d81613567565b92915050565b6000806000604084860312156135ac576135ab6132cc565b5b600084013567ffffffffffffffff8111156135ca576135c96132d1565b5b6135d686828701613511565b935093505060206135e98682870161357e565b9150509250925092565b6000806040838503121561360a576136096132cc565b5b60006136188582860161357e565b925050602061362985828601613464565b9150509250929050565b61363c81613443565b82525050565b60006020820190506136576000830184613633565b92915050565b600060208284031215613673576136726132cc565b5b60006136818482850161357e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136bf81613443565b82525050565b60006136d183836136b6565b60208301905092915050565b6000602082019050919050565b60006136f58261368a565b6136ff8185613695565b935061370a836136a6565b8060005b8381101561373b57815161372288826136c5565b975061372d836136dd565b92505060018101905061370e565b5085935050505092915050565b6000602082019050818103600083015261376281846136ea565b905092915050565b600080600060608486031215613783576137826132cc565b5b60006137918682870161357e565b93505060206137a28682870161357e565b92505060406137b386828701613464565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137fa826133d7565b810181811067ffffffffffffffff82111715613819576138186137c2565b5b80604052505050565b600061382c6132c2565b905061383882826137f1565b919050565b600067ffffffffffffffff821115613858576138576137c2565b5b613861826133d7565b9050602081019050919050565b82818337600083830152505050565b600061389061388b8461383d565b613822565b9050828152602081018484840111156138ac576138ab6137bd565b5b6138b784828561386e565b509392505050565b600082601f8301126138d4576138d3613502565b5b81356138e484826020860161387d565b91505092915050565b600060208284031215613903576139026132cc565b5b600082013567ffffffffffffffff811115613921576139206132d1565b5b61392d848285016138bf565b91505092915050565b60008083601f84011261394c5761394b613502565b5b8235905067ffffffffffffffff81111561396957613968613507565b5b6020830191508360208202830111156139855761398461350c565b5b9250929050565b600080602083850312156139a3576139a26132cc565b5b600083013567ffffffffffffffff8111156139c1576139c06132d1565b5b6139cd85828601613936565b92509250509250929050565b600067ffffffffffffffff8211156139f4576139f36137c2565b5b6139fd826133d7565b9050602081019050919050565b6000613a1d613a18846139d9565b613822565b905082815260208101848484011115613a3957613a386137bd565b5b613a4484828561386e565b509392505050565b600082601f830112613a6157613a60613502565b5b8135613a71848260208601613a0a565b91505092915050565b600060208284031215613a9057613a8f6132cc565b5b600082013567ffffffffffffffff811115613aae57613aad6132d1565b5b613aba84828501613a4c565b91505092915050565b60008060408385031215613ada57613ad96132cc565b5b6000613ae885828601613464565b9250506020613af985828601613464565b9150509250929050565b613b0c8161335b565b8114613b1757600080fd5b50565b600081359050613b2981613b03565b92915050565b60008060408385031215613b4657613b456132cc565b5b6000613b548582860161357e565b9250506020613b6585828601613b1a565b9150509250929050565b6000819050919050565b613b8281613b6f565b82525050565b6000602082019050613b9d6000830184613b79565b92915050565b60008060008060808587031215613bbd57613bbc6132cc565b5b6000613bcb8782880161357e565b9450506020613bdc8782880161357e565b9350506040613bed87828801613464565b925050606085013567ffffffffffffffff811115613c0e57613c0d6132d1565b5b613c1a87828801613a4c565b91505092959194509250565b600067ffffffffffffffff821115613c4157613c406137c2565b5b602082029050602081019050919050565b613c5b81613b6f565b8114613c6657600080fd5b50565b600081359050613c7881613c52565b92915050565b6000613c91613c8c84613c26565b613822565b90508083825260208201905060208402830185811115613cb457613cb361350c565b5b835b81811015613cdd5780613cc98882613c69565b845260208401935050602081019050613cb6565b5050509392505050565b600082601f830112613cfc57613cfb613502565b5b8135613d0c848260208601613c7e565b91505092915050565b60008060408385031215613d2c57613d2b6132cc565b5b600083013567ffffffffffffffff811115613d4a57613d496132d1565b5b613d5685828601613ce7565b9250506020613d6785828601613c69565b9150509250929050565b600060208284031215613d8757613d866132cc565b5b6000613d9584828501613c69565b91505092915050565b60008060208385031215613db557613db46132cc565b5b600083013567ffffffffffffffff811115613dd357613dd26132d1565b5b613ddf85828601613511565b92509250509250929050565b60008060408385031215613e0257613e016132cc565b5b6000613e108582860161357e565b9250506020613e218582860161357e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e7257607f821691505b602082108103613e8557613e84613e2b565b5b50919050565b60008160601b9050919050565b6000613ea382613e8b565b9050919050565b6000613eb582613e98565b9050919050565b613ecd613ec8826134c6565b613eaa565b82525050565b6000613edf8284613ebc565b60148201915081905092915050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000613f2f601c83613eee565b9150613f3a82613ef9565b601c82019050919050565b6000819050919050565b613f60613f5b82613b6f565b613f45565b82525050565b6000613f7182613f22565b9150613f7d8284613f4f565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ff582613443565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361402757614026613fbb565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614057565b61409e8683614057565b95508019841693508086168417925050509392505050565b6000819050919050565b60006140db6140d66140d184613443565b6140b6565b613443565b9050919050565b6000819050919050565b6140f5836140c0565b614109614101826140e2565b848454614064565b825550505050565b600090565b61411e614111565b6141298184846140ec565b505050565b5b8181101561414d57614142600082614116565b60018101905061412f565b5050565b601f8211156141925761416381614032565b61416c84614047565b8101602085101561417b578190505b61418f61418785614047565b83018261412e565b50505b505050565b600082821c905092915050565b60006141b560001984600802614197565b1980831691505092915050565b60006141ce83836141a4565b9150826002028217905092915050565b6141e782613391565b67ffffffffffffffff811115614200576141ff6137c2565b5b61420a8254613e5a565b614215828285614151565b600060209050601f8311600181146142485760008415614236578287015190505b61424085826141c2565b8655506142a8565b601f19841661425686614032565b60005b8281101561427e57848901518255600182019150602085019450602081019050614259565b8683101561429b5784890151614297601f8916826141a4565b8355505b6001600288020188555050505b505050505050565b7f444947493a20416c6c6f776c6973742053616c65204e6f74205374617274656460008201527f2059657400000000000000000000000000000000000000000000000000000000602082015250565b600061430c60248361339c565b9150614317826142b0565b604082019050919050565b6000602082019050818103600083015261433b816142ff565b9050919050565b7f444947493a204e6f7420612050617274206f6620416c6c6f776c697374000000600082015250565b6000614378601d8361339c565b915061438382614342565b602082019050919050565b600060208201905081810360008301526143a78161436b565b9050919050565b60006143b982613443565b91506143c483613443565b92508282019050808211156143dc576143db613fbb565b5b92915050565b7f444947493a20596f7520416c7265616479204d696e74656420456e6f75676800600082015250565b6000614418601f8361339c565b9150614423826143e2565b602082019050919050565b600060208201905081810360008301526144478161440b565b9050919050565b7f444947493a20416c6c6f776c697374204c696d69742052656163686564200000600082015250565b6000614484601e8361339c565b915061448f8261444e565b602082019050919050565b600060208201905081810360008301526144b381614477565b9050919050565b7f444947493a20457863656564696e67204d6178204c696d697400000000000000600082015250565b60006144f060198361339c565b91506144fb826144ba565b602082019050919050565b6000602082019050818103600083015261451f816144e3565b9050919050565b600060408201905061453b6000830185613633565b6145486020830184613633565b9392505050565b600061455a82613391565b6145648185613eee565b93506145748185602086016133ad565b80840191505092915050565b600061458c828561454f565b9150614598828461454f565b91508190509392505050565b7f444947493a205075626c69632053616c65204e6f74205374617274656420596560008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b600061460060218361339c565b915061460b826145a4565b604082019050919050565b6000602082019050818103600083015261462f816145f3565b9050919050565b7f444947493a20596f7520416c7265616479206d696e7465640000000000000000600082015250565b600061466c60188361339c565b915061467782614636565b602082019050919050565b6000602082019050818103600083015261469b8161465f565b9050919050565b600081905092915050565b60006146b983856146a2565b93506146c683858461386e565b82840190509392505050565b60006146df8284866146ad565b91508190509392505050565b7f444947493a205369676e61747572652069732055736564000000000000000000600082015250565b600061472160178361339c565b915061472c826146eb565b602082019050919050565b6000602082019050818103600083015261475081614714565b9050919050565b7f444947493a20496e76616c6964205369676e6174757265000000000000000000600082015250565b600061478d60178361339c565b915061479882614757565b602082019050919050565b600060208201905081810360008301526147bc81614780565b9050919050565b7f444947493a205075626c6963204c696d69742052656163686564000000000000600082015250565b60006147f9601a8361339c565b9150614804826147c3565b602082019050919050565b60006020820190508181036000830152614828816147ec565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061488b60268361339c565b91506148968261482f565b604082019050919050565b600060208201905081810360008301526148ba8161487e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148f760208361339c565b9150614902826148c1565b602082019050919050565b60006020820190508181036000830152614926816148ea565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614963601f8361339c565b915061496e8261492d565b602082019050919050565b6000602082019050818103600083015261499281614956565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006149c082614999565b6149ca81856149a4565b93506149da8185602086016133ad565b6149e3816133d7565b840191505092915050565b6000608082019050614a0360008301876134d8565b614a1060208301866134d8565b614a1d6040830185613633565b8181036060830152614a2f81846149b5565b905095945050505050565b600081519050614a4981613302565b92915050565b600060208284031215614a6557614a646132cc565b5b6000614a7384828501614a3a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614ae160188361339c565b9150614aec82614aab565b602082019050919050565b60006020820190508181036000830152614b1081614ad4565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614b4d601f8361339c565b9150614b5882614b17565b602082019050919050565b60006020820190508181036000830152614b7c81614b40565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bdf60228361339c565b9150614bea82614b83565b604082019050919050565b60006020820190508181036000830152614c0e81614bd2565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c7160228361339c565b9150614c7c82614c15565b604082019050919050565b60006020820190508181036000830152614ca081614c64565b9050919050565b600060ff82169050919050565b614cbd81614ca7565b82525050565b6000608082019050614cd86000830187613b79565b614ce56020830186614cb4565b614cf26040830185613b79565b614cff6060830184613b79565b95945050505050565b6000614d1382613443565b9150614d1e83613443565b9250828203905081811115614d3657614d35613fbb565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220019f0f3d703191f0f551769253eed5f4d62d07620fcbc6a8ba1131e2cb7e3a6e64736f6c63430008110033

Deployed Bytecode Sourcemap

93618:6138:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30341:627;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31217:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37332:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97940:299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36796:393;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94168:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27144:299;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98878:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95486:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40789:2575;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94983:250;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98729:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93965:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94131:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93793:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99652:101;;;;;;;;;;;;;:::i;:::-;;93838:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43452:173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94050:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94890:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;96516:711;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32581:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95832:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28244:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73020:97;;;;;;;;;;;;;:::i;:::-;;94474:36;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72408:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31379:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96030:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37884:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95714:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95928:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;98245:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95587:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44191:359;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;98564:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94003:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31575:357;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93923:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94091;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99572:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93881:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97233:699;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;96277:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38271:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94206:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98374:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73262:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95239:241;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30341:627;30451:4;30767:10;30752:25;;:11;:25;;;;:96;;;;30838:10;30823:25;;:11;:25;;;;30752:96;:167;;;;30909:10;30894:25;;:11;:25;;;;30752:167;30738:181;;30341:627;;;:::o;31217:94::-;31271:13;31300:5;31293:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31217:94;:::o;37332:236::-;37433:7;37457:16;37465:7;37457;:16::i;:::-;37452:64;;37482:34;;;;;;;;;;;;;;37452:64;37532:15;:24;37548:7;37532:24;;;;;;;;;;;:30;;;;;;;;;;;;37525:37;;37332:236;;;:::o;97940:299::-;98021:7;98053:180;98223:9;;98053:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98182:6;98165:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;98155:35;;;;;;98075:128;;;;;;;;:::i;:::-;;;;;;;;;;;;;98053:161;;;;;;:169;;:180;;;;:::i;:::-;98037:196;;97940:299;;;;;:::o;36796:393::-;36904:13;36920:16;36928:7;36920;:16::i;:::-;36904:32;;36972:5;36949:28;;:19;:17;:19::i;:::-;:28;;;36945:155;;36991:44;37008:5;37015:19;:17;:19::i;:::-;36991:16;:44::i;:::-;36986:114;;37055:35;;;;;;;;;;;;;;36986:114;36945:155;37141:2;37108:15;:24;37124:7;37108:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37175:7;37171:2;37155:28;;37164:5;37155:28;;;;;;;;;;;;36897:292;36796:393;;:::o;94168:31::-;;;;:::o;27144:299::-;27205:7;27415:15;:13;:15::i;:::-;27400:12;;27384:13;;:28;:46;27377:53;;27144:299;:::o;98878:328::-;98938:16;98963:11;98977:29;:13;:20;98991:5;98977:20;;;;;;;;;;;;;;;:27;:29::i;:::-;98963:43;;99013:23;99053:3;99039:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99013:44;;99068:9;99064:117;99082:3;99080:1;:5;99064:117;;;99099:15;99117:28;99137:5;99143:1;99117:19;:28::i;:::-;99099:46;;99166:7;99154:6;99161:1;99154:9;;;;;;;;:::i;:::-;;;;;;;:19;;;;;99090:91;99086:3;;;;;:::i;:::-;;;;99064:117;;;;99194:6;99187:13;;;;98878:328;;;:::o;95486:95::-;72308:13;:11;:13::i;:::-;95569:6:::1;95550:16;:25;;;;95486:95:::0;:::o;40789:2575::-;40913:27;40943;40962:7;40943:18;:27::i;:::-;40913:57;;41024:4;40983:45;;40999:19;40983:45;;;40979:93;;41044:28;;;;;;;;;;;;;;40979:93;41090:27;41126:23;41159:35;41186:7;41159:26;:35::i;:::-;41081:113;;;;41286:68;41311:15;41328:4;41334:19;:17;:19::i;:::-;41286:24;:68::i;:::-;41281:183;;41368:43;41385:4;41391:19;:17;:19::i;:::-;41368:16;:43::i;:::-;41363:101;;41429:35;;;;;;;;;;;;;;41363:101;41281:183;41491:1;41477:16;;:2;:16;;;41473:52;;41502:23;;;;;;;;;;;;;;41473:52;41534:43;41556:4;41562:2;41566:7;41575:1;41534:21;:43::i;:::-;41656:15;41653:138;;;41780:1;41759:19;41752:30;41653:138;42139:18;:24;42158:4;42139:24;;;;;;;;;;;;;;;;42137:26;;;;;;;;;;;;42202:18;:22;42221:2;42202:22;;;;;;;;;;;;;;;;42200:24;;;;;;;;;;;42488:135;42517:2;42569:45;42584:4;42590:2;42594:19;42569:14;:45::i;:::-;23713:8;42530:84;42488:18;:135::i;:::-;42459:17;:26;42477:7;42459:26;;;;;;;;;;;:164;;;;42782:1;23713:8;42731:19;:47;:52;42727:535;;42796:19;42828:1;42818:7;:11;42796:33;;42969:1;42935:17;:30;42953:11;42935:30;;;;;;;;;;;;:35;42931:322;;43053:13;;43038:11;:28;43034:208;;43209:19;43176:17;:30;43194:11;43176:30;;;;;;;;;;;:52;;;;43034:208;42931:322;42785:477;42727:535;43301:7;43297:2;43282:27;;43291:4;43282:27;;;;;;;;;;;;43316:42;43337:4;43343:2;43347:7;43356:1;43316:20;:42::i;:::-;40906:2458;;;40789:2575;;;:::o;94983:250::-;95037:4;95080:25;;95062:15;:43;:95;;;;;95134:23;;95116:15;:41;95062:95;95050:178;;;95181:4;95174:11;;;;95050:178;95215:5;95208:12;;94983:250;;:::o;98729:143::-;98809:7;98836:30;98860:5;98836:13;:20;98850:5;98836:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;98829:37;;98729:143;;;;:::o;93965:33::-;;;;:::o;94131:32::-;;;;:::o;93793:40::-;;;;:::o;99652:101::-;72308:13;:11;:13::i;:::-;99704:7:::1;:5;:7::i;:::-;99696:25;;:51;99722:24;99740:4;99722:9;:24::i;:::-;99696:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;99652:101::o:0;93838:38::-;;;;:::o;43452:173::-;43580:39;43597:4;43603:2;43607:7;43580:39;;;;;;;;;;;;:16;:39::i;:::-;43452:173;;;:::o;94050:36::-;;;;:::o;94890:83::-;72308:13;:11;:13::i;:::-;94964:3:::1;94953:8;:14;;;;;;:::i;:::-;;94890:83:::0;:::o;96516:711::-;92723:21;:19;:21::i;:::-;96627:4:::1;96600:31;;:23;:21;:23::i;:::-;:31;;;96592:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;96754:4;96695:63;;:55;96703:5;;96695:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96737:10;96720:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;96710:39;;;;;;96695:7;:55::i;:::-;:63;;;96679:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;96843:1;96812:15;:27;96828:10;96812:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;96898:23;;96867:15;:27;96883:10;96867:27;;;;;;;;;;;;;;;;:54;;96851:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;97001:1;96977:20;;:25;;;;;;;:::i;:::-;;;;;;;;97049:14;;97025:20;;:38;;97009:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;97150:10;;97126:20;97144:1;97126:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;:34;;97118:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;97197:24;97207:10;97219:1;97197:9;:24::i;:::-;92767:20:::0;:18;:20::i;:::-;96516:711;;:::o;32581:174::-;32678:7;32720:27;32739:7;32720:18;:27::i;:::-;32697:52;;32581:174;;;:::o;95832:90::-;72308:13;:11;:13::i;:::-;95909:7:::1;95892:14;;:24;;;;;;;;;;;;;;;;;;95832:90:::0;:::o;28244:251::-;28341:7;28381:1;28364:19;;:5;:19;;;28360:60;;28392:28;;;;;;;;;;;;;;28360:60;22689:13;28434:18;:25;28453:5;28434:25;;;;;;;;;;;;;;;;:55;28427:62;;28244:251;;;:::o;73020:97::-;72308:13;:11;:13::i;:::-;73081:30:::1;73108:1;73081:18;:30::i;:::-;73020:97::o:0;94474:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72408:81::-;72454:7;72477:6;;;;;;;;;;;72470:13;;72408:81;:::o;31379:98::-;31435:13;31464:7;31457:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31379:98;:::o;96030:241::-;72308:13;:11;:13::i;:::-;96160:9:::1;96132:25;:37;;;;96202:7;96176:23;:33;;;;96221:44;96246:9;96257:7;96221:44;;;;;;;:::i;:::-;;;;;;;;96030:241:::0;;:::o;37884:242::-;38045:8;37993:18;:39;38012:19;:17;:19::i;:::-;37993:39;;;;;;;;;;;;;;;:49;38033:8;37993:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;38101:8;38065:55;;38080:19;:17;:19::i;:::-;38065:55;;;38111:8;38065:55;;;;;;:::i;:::-;;;;;;;;37884:242;;:::o;95714:112::-;95779:4;95799:12;:21;95812:7;95799:21;;;;;;;;;;;;;;;;;;;;;;;;;95792:28;;95714:112;;;:::o;95928:96::-;72308:13;:11;:13::i;:::-;96012:6:::1;95995:14;:23;;;;95928:96:::0;:::o;98245:123::-;98302:7;98354:6;98337:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;98327:35;;;;;;98320:42;;98245:123;;;:::o;95587:121::-;95655:7;95678:15;:24;95694:7;95678:24;;;;;;;;;;;;;;;;95671:31;;95587:121;;;:::o;44191:359::-;44344:31;44357:4;44363:2;44367:7;44344:12;:31::i;:::-;44404:1;44386:2;:14;;;:19;44382:163;;44419:56;44450:4;44456:2;44460:7;44469:5;44419:30;:56::i;:::-;44414:131;;44495:40;;;;;;;;;;;;;;44414:131;44382:163;44191:359;;;;:::o;98564:157::-;98655:4;98678:37;98697:5;98704:4;;98710;98678:18;:37::i;:::-;98671:44;;98564:157;;;;:::o;94003:42::-;;;;:::o;31575:357::-;31673:13;31703:16;31711:7;31703;:16::i;:::-;31698:59;;31728:29;;;;;;;;;;;;;;31698:59;31766:21;31790:10;:8;:10::i;:::-;31766:34;;31846:1;31827:7;31821:21;:26;:105;;;;;;;;;;;;;;;;;31883:7;31892:18;31902:7;31892:9;:18::i;:::-;31866:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31821:105;31807:119;;;31575:357;;;:::o;93923:35::-;;;;:::o;94091:::-;;;;:::o;99572:74::-;72308:13;:11;:13::i;:::-;99635:5:::1;99628:4;:12;;;;99572:74:::0;:::o;93881:37::-;;;;:::o;97233:699::-;92723:21;:19;:21::i;:::-;97338:4:::1;97314:28;;:20;:18;:20::i;:::-;:28;;;97306:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;97423:5;97395:33;;:12;:24;97408:10;97395:24;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;97387:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;97491:4;97464:12;:24;97477:10;97464:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;97531:5;97510:26;;:8;97519:9;;97510:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:26;;;97502:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;97605:32;97615:9;;97626:10;97605:9;:32::i;:::-;97587:50;;:14;;;;;;;;;;;:50;;;97571:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;97700:4;97678:8;97687:9;;97678:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;97732:1;97711:17;;:22;;;;;;;:::i;:::-;;;;;;;;97769:16;;97748:17;;:37;;97740:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;97855:10;;97831:20;97849:1;97831:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;:34;;97823:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;97902:24;97912:10;97924:1;97902:9;:24::i;:::-;92767:20:::0;:18;:20::i;:::-;97233:699;;:::o;96277:233::-;72308:13;:11;:13::i;:::-;96405:9:::1;96380:22;:34;;;;96444:7;96421:20;:30;;;;96463:41;96485:9;96496:7;96463:41;;;;;;;:::i;:::-;;;;;;;;96277:233:::0;;:::o;38271:186::-;38393:4;38416:18;:25;38435:5;38416:25;;;;;;;;;;;;;;;:35;38442:8;38416:35;;;;;;;;;;;;;;;;;;;;;;;;;38409:42;;38271:186;;;;:::o;94206:19::-;;;;:::o;98374:184::-;72308:13;:11;:13::i;:::-;98474:10:::1;;98443:27;98461:8;98443:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:41;;98435:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;98521:31;98531:10;98543:8;98521:9;:31::i;:::-;98374:184:::0;:::o;73262:191::-;72308:13;:11;:13::i;:::-;73367:1:::1;73347:22;;:8;:22;;::::0;73339:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;73419:28;73438:8;73419:18;:28::i;:::-;73262:191:::0;:::o;95239:241::-;95290:4;95333:22;;95315:15;:40;:89;;;;;95384:20;;95366:15;:38;95315:89;95303:172;;;95428:4;95421:11;;;;95303:172;95462:5;95455:12;;95239:241;;:::o;38699:258::-;38764:4;38810:7;38791:15;:13;:15::i;:::-;:26;;:60;;;;;38838:13;;38828:7;:23;38791:60;:141;;;;;38931:1;23441:8;38883:17;:26;38901:7;38883:26;;;;;;;;;;;;:44;:49;38791:141;38777:155;;38699:258;;;:::o;85564:235::-;85657:7;85677:17;85696:18;85718:27;85729:4;85735:9;85718:10;:27::i;:::-;85676:69;;;;85752:18;85764:5;85752:11;:18::i;:::-;85784:9;85777:16;;;;85564:235;;;;:::o;59103:99::-;59163:7;59186:10;59179:17;;59103:99;:::o;26692:86::-;26748:7;26771:1;26764:8;;26692:86;:::o;11502:114::-;11562:7;11589:19;11597:3;:10;;11589:7;:19::i;:::-;11582:26;;11502:114;;;:::o;72559:126::-;72630:12;:10;:12::i;:::-;72619:23;;:7;:5;:7::i;:::-;:23;;;72611:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72559:126::o;33742:1037::-;33809:7;33825:12;33840:7;33825:22;;33898:4;33879:15;:13;:15::i;:::-;:23;33875:847;;33924:13;;33917:4;:20;33913:809;;;33952:14;33969:17;:23;33987:4;33969:23;;;;;;;;;;;;33952:40;;34066:1;23441:8;34038:6;:24;:29;34034:677;;34583:87;34600:1;34590:6;:11;34583:87;;34629:17;:25;34647:6;;;;;;;34629:25;;;;;;;;;;;;34620:34;;34583:87;;;34691:6;34684:13;;;;;;34034:677;33939:783;33913:809;33875:847;34742:31;;;;;;;;;;;;;;33742:1037;;;;:::o;39762:441::-;39852:27;39881:23;39916:38;39957:15;:24;39973:7;39957:24;;;;;;;;;;;39916:65;;40120:18;40097:41;;40171:19;40165:26;40146:45;;40088:110;39762:441;;;:::o;39058:599::-;39193:11;39342:16;39335:5;39331:28;39322:37;;39490:16;39479:9;39475:32;39462:45;;39628:15;39617:9;39614:30;39606:5;39595:9;39592:20;39589:56;39579:66;;39058:599;;;;;:::o;99214:350::-;99373:9;99369:190;99389:8;99387:1;:10;99369:190;;;99428:1;99414:16;;:4;:16;;;99411:88;;99442:47;99469:19;99486:1;99469:12;:16;;:19;;;;:::i;:::-;99442:13;:19;99456:4;99442:19;;;;;;;;;;;;;;;:26;;:47;;;;:::i;:::-;;99411:88;99509:42;99531:19;99548:1;99531:12;:16;;:19;;;;:::i;:::-;99509:13;:17;99523:2;99509:17;;;;;;;;;;;;;;;:21;;:42;;;;:::i;:::-;;99398:3;;;;;:::i;:::-;;;;99369:190;;;;99214:350;;;;:::o;58454:287::-;58575:7;58591:16;23833:3;58617:19;:41;;58591:68;;23833:3;58681:31;58692:4;58698:2;58702:9;58681:10;:31::i;:::-;58673:40;;:62;;58666:69;;;58454:287;;;;;:::o;35311:434::-;35406:14;35561:16;35554:5;35550:28;35541:37;;35726:5;35712:11;35687:23;35683:41;35680:52;35673:5;35670:63;35660:73;;35311:434;;;;:::o;45950:140::-;;;;;:::o;11970:137::-;12041:7;12076:22;12080:3;:10;;12092:5;12076:3;:22::i;:::-;12068:31;;12061:38;;11970:137;;;;:::o;92803:293::-;92205:1;92937:7;;:19;92929:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;92205:1;93070:7;:18;;;;92803:293::o;64758:92::-;64816:7;64843:1;64839;:5;;;;:::i;:::-;64832:12;;64758:92;;;;:::o;53412:106::-;53485:27;53495:2;53499:8;53485:27;;;;;;;;;;;;:9;:27::i;:::-;53412:106;;:::o;93104:213::-;92161:1;93287:7;:22;;;;93104:213::o;73603:177::-;73673:16;73692:6;;;;;;;;;;;73673:25;;73714:8;73705:6;;:17;;;;;;;;;;;;;;;;;;73765:8;73734:40;;73755:8;73734:40;;;;;;;;;;;;73666:114;73603:177;:::o;46508:659::-;46653:4;46702:2;46677:45;;;46733:19;:17;:19::i;:::-;46763:4;46778:7;46796:5;46677:133;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46666:496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46987:1;46970:6;:13;:18;46966:189;;47008:40;;;;;;;;;;;;;;46966:189;47127:6;47121:13;47112:6;47108:2;47104:15;47097:38;46666:496;46866:54;;;46856:64;;;:6;:64;;;;46849:71;;;46508:659;;;;;;:::o;61276:170::-;61387:4;61436;61407:25;61420:5;61427:4;61407:12;:25::i;:::-;:33;61400:40;;61276:170;;;;;:::o;94781:103::-;94841:13;94870:8;94863:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94781:103;:::o;59296:1626::-;59381:17;59784:4;59777;59771:11;59767:22;59864:1;59858:4;59851:15;59927:4;59924:1;59920:12;59913:19;;59997:1;59992:3;59985:14;60089:3;60304:5;60286:428;60312:1;60286:428;;;60352:1;60347:3;60343:11;60336:18;;60523:2;60517:4;60513:13;60509:2;60505:22;60500:3;60492:36;60617:2;60611:4;60607:13;60599:21;;60684:4;60286:428;60674:25;60286:428;60290:21;60747:3;60742;60738:13;60850:4;60845:3;60841:14;60834:21;;60903:6;60898:3;60891:19;59419:1498;;;59296:1626;;;:::o;83548:1244::-;83644:7;83653:12;83885:2;83865:9;:16;:22;83861:926;;83898:9;83916;83934:7;84159:4;84148:9;84144:20;84138:27;84133:32;;84201:4;84190:9;84186:20;84180:27;84175:32;;84251:4;84240:9;84236:20;84230:27;84227:1;84222:36;84217:41;;84282:25;84293:4;84299:1;84302;84305;84282:10;:25::i;:::-;84275:32;;;;;;;;;83861:926;84345:2;84325:9;:16;:22;84321:466;;84358:9;84376:10;84604:4;84593:9;84589:20;84583:27;84578:32;;84647:4;84636:9;84632:20;84626:27;84620:33;;84677:23;84688:4;84694:1;84697:2;84677:10;:23::i;:::-;84670:30;;;;;;;;84321:466;84739:1;84743:35;84723:56;;;;83548:1244;;;;;;:::o;81917:587::-;81991:20;81982:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;81978:521;82022:7;81978:521;82079:29;82070:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;82066:433;;82119:34;;;;;;;;;;:::i;:::-;;;;;;;;82066:433;82180:35;82171:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;82167:332;;82226:41;;;;;;;;;;:::i;:::-;;;;;;;;82167:332;82294:30;82285:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;82281:218;;82335:44;;;;;;;;;;:::i;:::-;;;;;;;;82281:218;82406:30;82397:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;82393:106;;82447:44;;;;;;;;;;:::i;:::-;;;;;;;;82393:106;81917:587;;:::o;4404:109::-;4460:7;4487:3;:11;;:18;;;;4480:25;;4404:109;;;:::o;71667:92::-;71720:7;71743:10;71736:17;;71667:92;:::o;11047:137::-;11117:4;11141:35;11149:3;:10;;11169:5;11161:14;;11141:7;:35::i;:::-;11134:42;;11047:137;;;;:::o;10740:131::-;10807:4;10831:32;10836:3;:10;;10856:5;10848:14;;10831:4;:32::i;:::-;10824:39;;10740:131;;;;:::o;58179:133::-;58302:6;58179:133;;;;;:::o;4867:120::-;4934:7;4961:3;:11;;4973:5;4961:18;;;;;;;;:::i;:::-;;;;;;;;;;4954:25;;4867:120;;;;:::o;52767:569::-;52880:19;52886:2;52890:8;52880:5;:19::i;:::-;52949:1;52931:2;:14;;;:19;52927:397;;52963:11;52977:13;;52963:27;;53001:13;53023:8;53017:3;:14;53001:30;;53042:193;53063:62;53102:1;53106:2;53110:7;;;;;;53119:5;53063:30;:62::i;:::-;53058:145;;53149:40;;;;;;;;;;;;;;53058:145;53230:3;53222:5;:11;53042:193;;53301:3;53284:13;;:20;53280:34;;53306:8;;;53280:34;52952:372;;52927:397;52767:569;;;:::o;61790:619::-;61888:7;61907:20;61930:4;61907:27;;61946:9;61941:437;61965:5;:12;61961:1;:16;61941:437;;;61993:20;62016:5;62022:1;62016:8;;;;;;;;:::i;:::-;;;;;;;;61993:31;;62053:12;62037;:28;62033:338;;62164:42;62179:12;62193;62164:14;:42::i;:::-;62149:57;;62033:338;;;62319:42;62334:12;62348;62319:14;:42::i;:::-;62304:57;;62033:338;61984:394;61979:3;;;;;:::i;:::-;;;;61941:437;;;;62391:12;62384:19;;;61790:619;;;;:::o;86947:1543::-;87060:7;87069:12;87969:66;87957:1;87949:10;;:86;87937:174;;;88068:1;88072:30;88052:51;;;;;;87937:174;88126:2;88121:1;:7;;;;:18;;;;;88137:2;88132:1;:7;;;;88121:18;88117:92;;;88166:1;88170:30;88150:51;;;;;;88117:92;88298:14;88315:24;88325:4;88331:1;88334;88337;88315:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88298:41;;88368:1;88350:20;;:6;:20;;;88346:93;;88397:1;88401:29;88381:50;;;;;;;88346:93;88455:6;88463:20;88447:37;;;;;86947:1543;;;;;;;;:::o;86046:341::-;86146:7;86155:12;86176:9;86218:66;86200:93;;86188:2;:105;86176:117;;86300:7;86339:2;86332:3;86325:2;86317:11;;:18;;86316:25;;;;:::i;:::-;86300:42;;86356:25;86367:4;86373:1;86376;86379;86356:10;:25::i;:::-;86349:32;;;;;;86046:341;;;;;;:::o;2683:1420::-;2749:4;2867:18;2888:3;:12;;:19;2901:5;2888:19;;;;;;;;;;;;2867:40;;2938:1;2924:10;:15;2920:1176;;3299:21;3336:1;3323:10;:14;;;;:::i;:::-;3299:38;;3352:17;3393:1;3372:3;:11;;:18;;;;:22;;;;:::i;:::-;3352:42;;3428:13;3415:9;:26;3411:405;;3462:17;3482:3;:11;;3494:9;3482:22;;;;;;;;:::i;:::-;;;;;;;;;;3462:42;;3636:9;3607:3;:11;;3619:13;3607:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3747:10;3721:3;:12;;:23;3734:9;3721:23;;;;;;;;;;;:36;;;;3443:373;3411:405;3897:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3992:3;:12;;:19;4005:5;3992:19;;;;;;;;;;;3985:26;;;4035:4;4028:11;;;;;;;2920:1176;4079:5;4072:12;;;2683:1420;;;;;:::o;2093:414::-;2156:4;2178:21;2188:3;2193:5;2178:9;:21::i;:::-;2173:327;;2216:3;:11;;2233:5;2216:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2399:3;:11;;:18;;;;2377:3;:12;;:19;2390:5;2377:19;;;;;;;;;;;:40;;;;2439:4;2432:11;;;;2173:327;2483:5;2476:12;;2093:414;;;;;:::o;47601:2578::-;47670:20;47693:13;;47670:36;;47729:1;47717:8;:13;47713:44;;47739:18;;;;;;;;;;;;;;47713:44;47766:61;47796:1;47800:2;47804:12;47818:8;47766:21;:61::i;:::-;48258:1;22823:2;48228:1;:26;;48227:32;48215:8;:45;48189:18;:22;48208:2;48189:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;48501:117;48530:2;48576:33;48599:1;48603:2;48607:1;48576:14;:33::i;:::-;48543:30;48564:8;48543:20;:30::i;:::-;:66;48501:18;:117::i;:::-;48467:17;:31;48485:12;48467:31;;;;;;;;;;;:151;;;;48629:16;48654:11;48683:8;48668:12;:23;48654:37;;49158:16;49154:2;49150:25;49138:37;;49454:12;49424:8;49393:1;49341:25;49292:1;49241;49224:267;49775:1;49761:12;49757:20;49725:282;49808:3;49799:7;49796:16;49725:282;;49988:7;49978:8;49975:1;49948:25;49945:1;49942;49937:59;49851:1;49842:7;49838:15;49827:26;;49725:282;;;49729:59;50040:1;50028:8;:13;50024:45;;50050:19;;;;;;;;;;;;;;50024:45;50096:3;50080:13;:19;;;;47999:2108;;50113:60;50142:1;50146:2;50150:12;50164:8;50113:20;:60::i;:::-;47663:2516;47601:2578;;:::o;62415:214::-;62498:13;62554:1;62548:4;62541:15;62577:1;62571:4;62564:15;62612:4;62606;62596:21;62587:30;;62415:214;;;;:::o;4189:129::-;4262:4;4309:1;4286:3;:12;;:19;4299:5;4286:19;;;;;;;;;;;;:24;;4279:31;;4189:129;;;;:::o;35839:316::-;35924:14;36140:1;36130:8;36127:15;36101:24;36097:46;36087:56;;35839:316;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:117::-;4246:1;4243;4236:12;4260:117;4369:1;4366;4359:12;4383:117;4492:1;4489;4482:12;4519:552;4576:8;4586:6;4636:3;4629:4;4621:6;4617:17;4613:27;4603:122;;4644:79;;:::i;:::-;4603:122;4757:6;4744:20;4734:30;;4787:18;4779:6;4776:30;4773:117;;;4809:79;;:::i;:::-;4773:117;4923:4;4915:6;4911:17;4899:29;;4977:3;4969:4;4961:6;4957:17;4947:8;4943:32;4940:41;4937:128;;;4984:79;;:::i;:::-;4937:128;4519:552;;;;;:::o;5077:122::-;5150:24;5168:5;5150:24;:::i;:::-;5143:5;5140:35;5130:63;;5189:1;5186;5179:12;5130:63;5077:122;:::o;5205:139::-;5251:5;5289:6;5276:20;5267:29;;5305:33;5332:5;5305:33;:::i;:::-;5205:139;;;;:::o;5350:672::-;5429:6;5437;5445;5494:2;5482:9;5473:7;5469:23;5465:32;5462:119;;;5500:79;;:::i;:::-;5462:119;5648:1;5637:9;5633:17;5620:31;5678:18;5670:6;5667:30;5664:117;;;5700:79;;:::i;:::-;5664:117;5813:64;5869:7;5860:6;5849:9;5845:22;5813:64;:::i;:::-;5795:82;;;;5591:296;5926:2;5952:53;5997:7;5988:6;5977:9;5973:22;5952:53;:::i;:::-;5942:63;;5897:118;5350:672;;;;;:::o;6028:474::-;6096:6;6104;6153:2;6141:9;6132:7;6128:23;6124:32;6121:119;;;6159:79;;:::i;:::-;6121:119;6279:1;6304:53;6349:7;6340:6;6329:9;6325:22;6304:53;:::i;:::-;6294:63;;6250:117;6406:2;6432:53;6477:7;6468:6;6457:9;6453:22;6432:53;:::i;:::-;6422:63;;6377:118;6028:474;;;;;:::o;6508:118::-;6595:24;6613:5;6595:24;:::i;:::-;6590:3;6583:37;6508:118;;:::o;6632:222::-;6725:4;6763:2;6752:9;6748:18;6740:26;;6776:71;6844:1;6833:9;6829:17;6820:6;6776:71;:::i;:::-;6632:222;;;;:::o;6860:329::-;6919:6;6968:2;6956:9;6947:7;6943:23;6939:32;6936:119;;;6974:79;;:::i;:::-;6936:119;7094:1;7119:53;7164:7;7155:6;7144:9;7140:22;7119:53;:::i;:::-;7109:63;;7065:117;6860:329;;;;:::o;7195:114::-;7262:6;7296:5;7290:12;7280:22;;7195:114;;;:::o;7315:184::-;7414:11;7448:6;7443:3;7436:19;7488:4;7483:3;7479:14;7464:29;;7315:184;;;;:::o;7505:132::-;7572:4;7595:3;7587:11;;7625:4;7620:3;7616:14;7608:22;;7505:132;;;:::o;7643:108::-;7720:24;7738:5;7720:24;:::i;:::-;7715:3;7708:37;7643:108;;:::o;7757:179::-;7826:10;7847:46;7889:3;7881:6;7847:46;:::i;:::-;7925:4;7920:3;7916:14;7902:28;;7757:179;;;;:::o;7942:113::-;8012:4;8044;8039:3;8035:14;8027:22;;7942:113;;;:::o;8091:732::-;8210:3;8239:54;8287:5;8239:54;:::i;:::-;8309:86;8388:6;8383:3;8309:86;:::i;:::-;8302:93;;8419:56;8469:5;8419:56;:::i;:::-;8498:7;8529:1;8514:284;8539:6;8536:1;8533:13;8514:284;;;8615:6;8609:13;8642:63;8701:3;8686:13;8642:63;:::i;:::-;8635:70;;8728:60;8781:6;8728:60;:::i;:::-;8718:70;;8574:224;8561:1;8558;8554:9;8549:14;;8514:284;;;8518:14;8814:3;8807:10;;8215:608;;;8091:732;;;;:::o;8829:373::-;8972:4;9010:2;8999:9;8995:18;8987:26;;9059:9;9053:4;9049:20;9045:1;9034:9;9030:17;9023:47;9087:108;9190:4;9181:6;9087:108;:::i;:::-;9079:116;;8829:373;;;;:::o;9208:619::-;9285:6;9293;9301;9350:2;9338:9;9329:7;9325:23;9321:32;9318:119;;;9356:79;;:::i;:::-;9318:119;9476:1;9501:53;9546:7;9537:6;9526:9;9522:22;9501:53;:::i;:::-;9491:63;;9447:117;9603:2;9629:53;9674:7;9665:6;9654:9;9650:22;9629:53;:::i;:::-;9619:63;;9574:118;9731:2;9757:53;9802:7;9793:6;9782:9;9778:22;9757:53;:::i;:::-;9747:63;;9702:118;9208:619;;;;;:::o;9833:117::-;9942:1;9939;9932:12;9956:180;10004:77;10001:1;9994:88;10101:4;10098:1;10091:15;10125:4;10122:1;10115:15;10142:281;10225:27;10247:4;10225:27;:::i;:::-;10217:6;10213:40;10355:6;10343:10;10340:22;10319:18;10307:10;10304:34;10301:62;10298:88;;;10366:18;;:::i;:::-;10298:88;10406:10;10402:2;10395:22;10185:238;10142:281;;:::o;10429:129::-;10463:6;10490:20;;:::i;:::-;10480:30;;10519:33;10547:4;10539:6;10519:33;:::i;:::-;10429:129;;;:::o;10564:308::-;10626:4;10716:18;10708:6;10705:30;10702:56;;;10738:18;;:::i;:::-;10702:56;10776:29;10798:6;10776:29;:::i;:::-;10768:37;;10860:4;10854;10850:15;10842:23;;10564:308;;;:::o;10878:146::-;10975:6;10970:3;10965;10952:30;11016:1;11007:6;11002:3;10998:16;10991:27;10878:146;;;:::o;11030:425::-;11108:5;11133:66;11149:49;11191:6;11149:49;:::i;:::-;11133:66;:::i;:::-;11124:75;;11222:6;11215:5;11208:21;11260:4;11253:5;11249:16;11298:3;11289:6;11284:3;11280:16;11277:25;11274:112;;;11305:79;;:::i;:::-;11274:112;11395:54;11442:6;11437:3;11432;11395:54;:::i;:::-;11114:341;11030:425;;;;;:::o;11475:340::-;11531:5;11580:3;11573:4;11565:6;11561:17;11557:27;11547:122;;11588:79;;:::i;:::-;11547:122;11705:6;11692:20;11730:79;11805:3;11797:6;11790:4;11782:6;11778:17;11730:79;:::i;:::-;11721:88;;11537:278;11475:340;;;;:::o;11821:509::-;11890:6;11939:2;11927:9;11918:7;11914:23;11910:32;11907:119;;;11945:79;;:::i;:::-;11907:119;12093:1;12082:9;12078:17;12065:31;12123:18;12115:6;12112:30;12109:117;;;12145:79;;:::i;:::-;12109:117;12250:63;12305:7;12296:6;12285:9;12281:22;12250:63;:::i;:::-;12240:73;;12036:287;11821:509;;;;:::o;12353:568::-;12426:8;12436:6;12486:3;12479:4;12471:6;12467:17;12463:27;12453:122;;12494:79;;:::i;:::-;12453:122;12607:6;12594:20;12584:30;;12637:18;12629:6;12626:30;12623:117;;;12659:79;;:::i;:::-;12623:117;12773:4;12765:6;12761:17;12749:29;;12827:3;12819:4;12811:6;12807:17;12797:8;12793:32;12790:41;12787:128;;;12834:79;;:::i;:::-;12787:128;12353:568;;;;;:::o;12927:559::-;13013:6;13021;13070:2;13058:9;13049:7;13045:23;13041:32;13038:119;;;13076:79;;:::i;:::-;13038:119;13224:1;13213:9;13209:17;13196:31;13254:18;13246:6;13243:30;13240:117;;;13276:79;;:::i;:::-;13240:117;13389:80;13461:7;13452:6;13441:9;13437:22;13389:80;:::i;:::-;13371:98;;;;13167:312;12927:559;;;;;:::o;13492:307::-;13553:4;13643:18;13635:6;13632:30;13629:56;;;13665:18;;:::i;:::-;13629:56;13703:29;13725:6;13703:29;:::i;:::-;13695:37;;13787:4;13781;13777:15;13769:23;;13492:307;;;:::o;13805:423::-;13882:5;13907:65;13923:48;13964:6;13923:48;:::i;:::-;13907:65;:::i;:::-;13898:74;;13995:6;13988:5;13981:21;14033:4;14026:5;14022:16;14071:3;14062:6;14057:3;14053:16;14050:25;14047:112;;;14078:79;;:::i;:::-;14047:112;14168:54;14215:6;14210:3;14205;14168:54;:::i;:::-;13888:340;13805:423;;;;;:::o;14247:338::-;14302:5;14351:3;14344:4;14336:6;14332:17;14328:27;14318:122;;14359:79;;:::i;:::-;14318:122;14476:6;14463:20;14501:78;14575:3;14567:6;14560:4;14552:6;14548:17;14501:78;:::i;:::-;14492:87;;14308:277;14247:338;;;;:::o;14591:507::-;14659:6;14708:2;14696:9;14687:7;14683:23;14679:32;14676:119;;;14714:79;;:::i;:::-;14676:119;14862:1;14851:9;14847:17;14834:31;14892:18;14884:6;14881:30;14878:117;;;14914:79;;:::i;:::-;14878:117;15019:62;15073:7;15064:6;15053:9;15049:22;15019:62;:::i;:::-;15009:72;;14805:286;14591:507;;;;:::o;15104:474::-;15172:6;15180;15229:2;15217:9;15208:7;15204:23;15200:32;15197:119;;;15235:79;;:::i;:::-;15197:119;15355:1;15380:53;15425:7;15416:6;15405:9;15401:22;15380:53;:::i;:::-;15370:63;;15326:117;15482:2;15508:53;15553:7;15544:6;15533:9;15529:22;15508:53;:::i;:::-;15498:63;;15453:118;15104:474;;;;;:::o;15584:116::-;15654:21;15669:5;15654:21;:::i;:::-;15647:5;15644:32;15634:60;;15690:1;15687;15680:12;15634:60;15584:116;:::o;15706:133::-;15749:5;15787:6;15774:20;15765:29;;15803:30;15827:5;15803:30;:::i;:::-;15706:133;;;;:::o;15845:468::-;15910:6;15918;15967:2;15955:9;15946:7;15942:23;15938:32;15935:119;;;15973:79;;:::i;:::-;15935:119;16093:1;16118:53;16163:7;16154:6;16143:9;16139:22;16118:53;:::i;:::-;16108:63;;16064:117;16220:2;16246:50;16288:7;16279:6;16268:9;16264:22;16246:50;:::i;:::-;16236:60;;16191:115;15845:468;;;;;:::o;16319:77::-;16356:7;16385:5;16374:16;;16319:77;;;:::o;16402:118::-;16489:24;16507:5;16489:24;:::i;:::-;16484:3;16477:37;16402:118;;:::o;16526:222::-;16619:4;16657:2;16646:9;16642:18;16634:26;;16670:71;16738:1;16727:9;16723:17;16714:6;16670:71;:::i;:::-;16526:222;;;;:::o;16754:943::-;16849:6;16857;16865;16873;16922:3;16910:9;16901:7;16897:23;16893:33;16890:120;;;16929:79;;:::i;:::-;16890:120;17049:1;17074:53;17119:7;17110:6;17099:9;17095:22;17074:53;:::i;:::-;17064:63;;17020:117;17176:2;17202:53;17247:7;17238:6;17227:9;17223:22;17202:53;:::i;:::-;17192:63;;17147:118;17304:2;17330:53;17375:7;17366:6;17355:9;17351:22;17330:53;:::i;:::-;17320:63;;17275:118;17460:2;17449:9;17445:18;17432:32;17491:18;17483:6;17480:30;17477:117;;;17513:79;;:::i;:::-;17477:117;17618:62;17672:7;17663:6;17652:9;17648:22;17618:62;:::i;:::-;17608:72;;17403:287;16754:943;;;;;;;:::o;17703:311::-;17780:4;17870:18;17862:6;17859:30;17856:56;;;17892:18;;:::i;:::-;17856:56;17942:4;17934:6;17930:17;17922:25;;18002:4;17996;17992:15;17984:23;;17703:311;;;:::o;18020:122::-;18093:24;18111:5;18093:24;:::i;:::-;18086:5;18083:35;18073:63;;18132:1;18129;18122:12;18073:63;18020:122;:::o;18148:139::-;18194:5;18232:6;18219:20;18210:29;;18248:33;18275:5;18248:33;:::i;:::-;18148:139;;;;:::o;18310:710::-;18406:5;18431:81;18447:64;18504:6;18447:64;:::i;:::-;18431:81;:::i;:::-;18422:90;;18532:5;18561:6;18554:5;18547:21;18595:4;18588:5;18584:16;18577:23;;18648:4;18640:6;18636:17;18628:6;18624:30;18677:3;18669:6;18666:15;18663:122;;;18696:79;;:::i;:::-;18663:122;18811:6;18794:220;18828:6;18823:3;18820:15;18794:220;;;18903:3;18932:37;18965:3;18953:10;18932:37;:::i;:::-;18927:3;18920:50;18999:4;18994:3;18990:14;18983:21;;18870:144;18854:4;18849:3;18845:14;18838:21;;18794:220;;;18798:21;18412:608;;18310:710;;;;;:::o;19043:370::-;19114:5;19163:3;19156:4;19148:6;19144:17;19140:27;19130:122;;19171:79;;:::i;:::-;19130:122;19288:6;19275:20;19313:94;19403:3;19395:6;19388:4;19380:6;19376:17;19313:94;:::i;:::-;19304:103;;19120:293;19043:370;;;;:::o;19419:684::-;19512:6;19520;19569:2;19557:9;19548:7;19544:23;19540:32;19537:119;;;19575:79;;:::i;:::-;19537:119;19723:1;19712:9;19708:17;19695:31;19753:18;19745:6;19742:30;19739:117;;;19775:79;;:::i;:::-;19739:117;19880:78;19950:7;19941:6;19930:9;19926:22;19880:78;:::i;:::-;19870:88;;19666:302;20007:2;20033:53;20078:7;20069:6;20058:9;20054:22;20033:53;:::i;:::-;20023:63;;19978:118;19419:684;;;;;:::o;20109:329::-;20168:6;20217:2;20205:9;20196:7;20192:23;20188:32;20185:119;;;20223:79;;:::i;:::-;20185:119;20343:1;20368:53;20413:7;20404:6;20393:9;20389:22;20368:53;:::i;:::-;20358:63;;20314:117;20109:329;;;;:::o;20444:527::-;20514:6;20522;20571:2;20559:9;20550:7;20546:23;20542:32;20539:119;;;20577:79;;:::i;:::-;20539:119;20725:1;20714:9;20710:17;20697:31;20755:18;20747:6;20744:30;20741:117;;;20777:79;;:::i;:::-;20741:117;20890:64;20946:7;20937:6;20926:9;20922:22;20890:64;:::i;:::-;20872:82;;;;20668:296;20444:527;;;;;:::o;20977:474::-;21045:6;21053;21102:2;21090:9;21081:7;21077:23;21073:32;21070:119;;;21108:79;;:::i;:::-;21070:119;21228:1;21253:53;21298:7;21289:6;21278:9;21274:22;21253:53;:::i;:::-;21243:63;;21199:117;21355:2;21381:53;21426:7;21417:6;21406:9;21402:22;21381:53;:::i;:::-;21371:63;;21326:118;20977:474;;;;;:::o;21457:180::-;21505:77;21502:1;21495:88;21602:4;21599:1;21592:15;21626:4;21623:1;21616:15;21643:320;21687:6;21724:1;21718:4;21714:12;21704:22;;21771:1;21765:4;21761:12;21792:18;21782:81;;21848:4;21840:6;21836:17;21826:27;;21782:81;21910:2;21902:6;21899:14;21879:18;21876:38;21873:84;;21929:18;;:::i;:::-;21873:84;21694:269;21643:320;;;:::o;21969:94::-;22002:8;22050:5;22046:2;22042:14;22021:35;;21969:94;;;:::o;22069:::-;22108:7;22137:20;22151:5;22137:20;:::i;:::-;22126:31;;22069:94;;;:::o;22169:100::-;22208:7;22237:26;22257:5;22237:26;:::i;:::-;22226:37;;22169:100;;;:::o;22275:157::-;22380:45;22400:24;22418:5;22400:24;:::i;:::-;22380:45;:::i;:::-;22375:3;22368:58;22275:157;;:::o;22438:256::-;22550:3;22565:75;22636:3;22627:6;22565:75;:::i;:::-;22665:2;22660:3;22656:12;22649:19;;22685:3;22678:10;;22438:256;;;;:::o;22700:148::-;22802:11;22839:3;22824:18;;22700:148;;;;:::o;22854:214::-;22994:66;22990:1;22982:6;22978:14;22971:90;22854:214;:::o;23074:402::-;23234:3;23255:85;23337:2;23332:3;23255:85;:::i;:::-;23248:92;;23349:93;23438:3;23349:93;:::i;:::-;23467:2;23462:3;23458:12;23451:19;;23074:402;;;:::o;23482:79::-;23521:7;23550:5;23539:16;;23482:79;;;:::o;23567:157::-;23672:45;23692:24;23710:5;23692:24;:::i;:::-;23672:45;:::i;:::-;23667:3;23660:58;23567:157;;:::o;23730:522::-;23943:3;23965:148;24109:3;23965:148;:::i;:::-;23958:155;;24123:75;24194:3;24185:6;24123:75;:::i;:::-;24223:2;24218:3;24214:12;24207:19;;24243:3;24236:10;;23730:522;;;;:::o;24258:180::-;24306:77;24303:1;24296:88;24403:4;24400:1;24393:15;24427:4;24424:1;24417:15;24444:180;24492:77;24489:1;24482:88;24589:4;24586:1;24579:15;24613:4;24610:1;24603:15;24630:233;24669:3;24692:24;24710:5;24692:24;:::i;:::-;24683:33;;24738:66;24731:5;24728:77;24725:103;;24808:18;;:::i;:::-;24725:103;24855:1;24848:5;24844:13;24837:20;;24630:233;;;:::o;24869:141::-;24918:4;24941:3;24933:11;;24964:3;24961:1;24954:14;24998:4;24995:1;24985:18;24977:26;;24869:141;;;:::o;25016:93::-;25053:6;25100:2;25095;25088:5;25084:14;25080:23;25070:33;;25016:93;;;:::o;25115:107::-;25159:8;25209:5;25203:4;25199:16;25178:37;;25115:107;;;;:::o;25228:393::-;25297:6;25347:1;25335:10;25331:18;25370:97;25400:66;25389:9;25370:97;:::i;:::-;25488:39;25518:8;25507:9;25488:39;:::i;:::-;25476:51;;25560:4;25556:9;25549:5;25545:21;25536:30;;25609:4;25599:8;25595:19;25588:5;25585:30;25575:40;;25304:317;;25228:393;;;;;:::o;25627:60::-;25655:3;25676:5;25669:12;;25627:60;;;:::o;25693:142::-;25743:9;25776:53;25794:34;25803:24;25821:5;25803:24;:::i;:::-;25794:34;:::i;:::-;25776:53;:::i;:::-;25763:66;;25693:142;;;:::o;25841:75::-;25884:3;25905:5;25898:12;;25841:75;;;:::o;25922:269::-;26032:39;26063:7;26032:39;:::i;:::-;26093:91;26142:41;26166:16;26142:41;:::i;:::-;26134:6;26127:4;26121:11;26093:91;:::i;:::-;26087:4;26080:105;25998:193;25922:269;;;:::o;26197:73::-;26242:3;26197:73;:::o;26276:189::-;26353:32;;:::i;:::-;26394:65;26452:6;26444;26438:4;26394:65;:::i;:::-;26329:136;26276:189;;:::o;26471:186::-;26531:120;26548:3;26541:5;26538:14;26531:120;;;26602:39;26639:1;26632:5;26602:39;:::i;:::-;26575:1;26568:5;26564:13;26555:22;;26531:120;;;26471:186;;:::o;26663:543::-;26764:2;26759:3;26756:11;26753:446;;;26798:38;26830:5;26798:38;:::i;:::-;26882:29;26900:10;26882:29;:::i;:::-;26872:8;26868:44;27065:2;27053:10;27050:18;27047:49;;;27086:8;27071:23;;27047:49;27109:80;27165:22;27183:3;27165:22;:::i;:::-;27155:8;27151:37;27138:11;27109:80;:::i;:::-;26768:431;;26753:446;26663:543;;;:::o;27212:117::-;27266:8;27316:5;27310:4;27306:16;27285:37;;27212:117;;;;:::o;27335:169::-;27379:6;27412:51;27460:1;27456:6;27448:5;27445:1;27441:13;27412:51;:::i;:::-;27408:56;27493:4;27487;27483:15;27473:25;;27386:118;27335:169;;;;:::o;27509:295::-;27585:4;27731:29;27756:3;27750:4;27731:29;:::i;:::-;27723:37;;27793:3;27790:1;27786:11;27780:4;27777:21;27769:29;;27509:295;;;;:::o;27809:1395::-;27926:37;27959:3;27926:37;:::i;:::-;28028:18;28020:6;28017:30;28014:56;;;28050:18;;:::i;:::-;28014:56;28094:38;28126:4;28120:11;28094:38;:::i;:::-;28179:67;28239:6;28231;28225:4;28179:67;:::i;:::-;28273:1;28297:4;28284:17;;28329:2;28321:6;28318:14;28346:1;28341:618;;;;29003:1;29020:6;29017:77;;;29069:9;29064:3;29060:19;29054:26;29045:35;;29017:77;29120:67;29180:6;29173:5;29120:67;:::i;:::-;29114:4;29107:81;28976:222;28311:887;;28341:618;28393:4;28389:9;28381:6;28377:22;28427:37;28459:4;28427:37;:::i;:::-;28486:1;28500:208;28514:7;28511:1;28508:14;28500:208;;;28593:9;28588:3;28584:19;28578:26;28570:6;28563:42;28644:1;28636:6;28632:14;28622:24;;28691:2;28680:9;28676:18;28663:31;;28537:4;28534:1;28530:12;28525:17;;28500:208;;;28736:6;28727:7;28724:19;28721:179;;;28794:9;28789:3;28785:19;28779:26;28837:48;28879:4;28871:6;28867:17;28856:9;28837:48;:::i;:::-;28829:6;28822:64;28744:156;28721:179;28946:1;28942;28934:6;28930:14;28926:22;28920:4;28913:36;28348:611;;;28311:887;;27901:1303;;;27809:1395;;:::o;29210:223::-;29350:34;29346:1;29338:6;29334:14;29327:58;29419:6;29414:2;29406:6;29402:15;29395:31;29210:223;:::o;29439:366::-;29581:3;29602:67;29666:2;29661:3;29602:67;:::i;:::-;29595:74;;29678:93;29767:3;29678:93;:::i;:::-;29796:2;29791:3;29787:12;29780:19;;29439:366;;;:::o;29811:419::-;29977:4;30015:2;30004:9;30000:18;29992:26;;30064:9;30058:4;30054:20;30050:1;30039:9;30035:17;30028:47;30092:131;30218:4;30092:131;:::i;:::-;30084:139;;29811:419;;;:::o;30236:179::-;30376:31;30372:1;30364:6;30360:14;30353:55;30236:179;:::o;30421:366::-;30563:3;30584:67;30648:2;30643:3;30584:67;:::i;:::-;30577:74;;30660:93;30749:3;30660:93;:::i;:::-;30778:2;30773:3;30769:12;30762:19;;30421:366;;;:::o;30793:419::-;30959:4;30997:2;30986:9;30982:18;30974:26;;31046:9;31040:4;31036:20;31032:1;31021:9;31017:17;31010:47;31074:131;31200:4;31074:131;:::i;:::-;31066:139;;30793:419;;;:::o;31218:191::-;31258:3;31277:20;31295:1;31277:20;:::i;:::-;31272:25;;31311:20;31329:1;31311:20;:::i;:::-;31306:25;;31354:1;31351;31347:9;31340:16;;31375:3;31372:1;31369:10;31366:36;;;31382:18;;:::i;:::-;31366:36;31218:191;;;;:::o;31415:181::-;31555:33;31551:1;31543:6;31539:14;31532:57;31415:181;:::o;31602:366::-;31744:3;31765:67;31829:2;31824:3;31765:67;:::i;:::-;31758:74;;31841:93;31930:3;31841:93;:::i;:::-;31959:2;31954:3;31950:12;31943:19;;31602:366;;;:::o;31974:419::-;32140:4;32178:2;32167:9;32163:18;32155:26;;32227:9;32221:4;32217:20;32213:1;32202:9;32198:17;32191:47;32255:131;32381:4;32255:131;:::i;:::-;32247:139;;31974:419;;;:::o;32399:180::-;32539:32;32535:1;32527:6;32523:14;32516:56;32399:180;:::o;32585:366::-;32727:3;32748:67;32812:2;32807:3;32748:67;:::i;:::-;32741:74;;32824:93;32913:3;32824:93;:::i;:::-;32942:2;32937:3;32933:12;32926:19;;32585:366;;;:::o;32957:419::-;33123:4;33161:2;33150:9;33146:18;33138:26;;33210:9;33204:4;33200:20;33196:1;33185:9;33181:17;33174:47;33238:131;33364:4;33238:131;:::i;:::-;33230:139;;32957:419;;;:::o;33382:175::-;33522:27;33518:1;33510:6;33506:14;33499:51;33382:175;:::o;33563:366::-;33705:3;33726:67;33790:2;33785:3;33726:67;:::i;:::-;33719:74;;33802:93;33891:3;33802:93;:::i;:::-;33920:2;33915:3;33911:12;33904:19;;33563:366;;;:::o;33935:419::-;34101:4;34139:2;34128:9;34124:18;34116:26;;34188:9;34182:4;34178:20;34174:1;34163:9;34159:17;34152:47;34216:131;34342:4;34216:131;:::i;:::-;34208:139;;33935:419;;;:::o;34360:332::-;34481:4;34519:2;34508:9;34504:18;34496:26;;34532:71;34600:1;34589:9;34585:17;34576:6;34532:71;:::i;:::-;34613:72;34681:2;34670:9;34666:18;34657:6;34613:72;:::i;:::-;34360:332;;;;;:::o;34698:390::-;34804:3;34832:39;34865:5;34832:39;:::i;:::-;34887:89;34969:6;34964:3;34887:89;:::i;:::-;34880:96;;34985:65;35043:6;35038:3;35031:4;35024:5;35020:16;34985:65;:::i;:::-;35075:6;35070:3;35066:16;35059:23;;34808:280;34698:390;;;;:::o;35094:435::-;35274:3;35296:95;35387:3;35378:6;35296:95;:::i;:::-;35289:102;;35408:95;35499:3;35490:6;35408:95;:::i;:::-;35401:102;;35520:3;35513:10;;35094:435;;;;;:::o;35535:220::-;35675:34;35671:1;35663:6;35659:14;35652:58;35744:3;35739:2;35731:6;35727:15;35720:28;35535:220;:::o;35761:366::-;35903:3;35924:67;35988:2;35983:3;35924:67;:::i;:::-;35917:74;;36000:93;36089:3;36000:93;:::i;:::-;36118:2;36113:3;36109:12;36102:19;;35761:366;;;:::o;36133:419::-;36299:4;36337:2;36326:9;36322:18;36314:26;;36386:9;36380:4;36376:20;36372:1;36361:9;36357:17;36350:47;36414:131;36540:4;36414:131;:::i;:::-;36406:139;;36133:419;;;:::o;36558:174::-;36698:26;36694:1;36686:6;36682:14;36675:50;36558:174;:::o;36738:366::-;36880:3;36901:67;36965:2;36960:3;36901:67;:::i;:::-;36894:74;;36977:93;37066:3;36977:93;:::i;:::-;37095:2;37090:3;37086:12;37079:19;;36738:366;;;:::o;37110:419::-;37276:4;37314:2;37303:9;37299:18;37291:26;;37363:9;37357:4;37353:20;37349:1;37338:9;37334:17;37327:47;37391:131;37517:4;37391:131;:::i;:::-;37383:139;;37110:419;;;:::o;37535:147::-;37636:11;37673:3;37658:18;;37535:147;;;;:::o;37710:327::-;37824:3;37845:88;37926:6;37921:3;37845:88;:::i;:::-;37838:95;;37943:56;37992:6;37987:3;37980:5;37943:56;:::i;:::-;38024:6;38019:3;38015:16;38008:23;;37710:327;;;;;:::o;38043:291::-;38183:3;38205:103;38304:3;38295:6;38287;38205:103;:::i;:::-;38198:110;;38325:3;38318:10;;38043:291;;;;;:::o;38340:173::-;38480:25;38476:1;38468:6;38464:14;38457:49;38340:173;:::o;38519:366::-;38661:3;38682:67;38746:2;38741:3;38682:67;:::i;:::-;38675:74;;38758:93;38847:3;38758:93;:::i;:::-;38876:2;38871:3;38867:12;38860:19;;38519:366;;;:::o;38891:419::-;39057:4;39095:2;39084:9;39080:18;39072:26;;39144:9;39138:4;39134:20;39130:1;39119:9;39115:17;39108:47;39172:131;39298:4;39172:131;:::i;:::-;39164:139;;38891:419;;;:::o;39316:173::-;39456:25;39452:1;39444:6;39440:14;39433:49;39316:173;:::o;39495:366::-;39637:3;39658:67;39722:2;39717:3;39658:67;:::i;:::-;39651:74;;39734:93;39823:3;39734:93;:::i;:::-;39852:2;39847:3;39843:12;39836:19;;39495:366;;;:::o;39867:419::-;40033:4;40071:2;40060:9;40056:18;40048:26;;40120:9;40114:4;40110:20;40106:1;40095:9;40091:17;40084:47;40148:131;40274:4;40148:131;:::i;:::-;40140:139;;39867:419;;;:::o;40292:176::-;40432:28;40428:1;40420:6;40416:14;40409:52;40292:176;:::o;40474:366::-;40616:3;40637:67;40701:2;40696:3;40637:67;:::i;:::-;40630:74;;40713:93;40802:3;40713:93;:::i;:::-;40831:2;40826:3;40822:12;40815:19;;40474:366;;;:::o;40846:419::-;41012:4;41050:2;41039:9;41035:18;41027:26;;41099:9;41093:4;41089:20;41085:1;41074:9;41070:17;41063:47;41127:131;41253:4;41127:131;:::i;:::-;41119:139;;40846:419;;;:::o;41271:225::-;41411:34;41407:1;41399:6;41395:14;41388:58;41480:8;41475:2;41467:6;41463:15;41456:33;41271:225;:::o;41502:366::-;41644:3;41665:67;41729:2;41724:3;41665:67;:::i;:::-;41658:74;;41741:93;41830:3;41741:93;:::i;:::-;41859:2;41854:3;41850:12;41843:19;;41502:366;;;:::o;41874:419::-;42040:4;42078:2;42067:9;42063:18;42055:26;;42127:9;42121:4;42117:20;42113:1;42102:9;42098:17;42091:47;42155:131;42281:4;42155:131;:::i;:::-;42147:139;;41874:419;;;:::o;42299:182::-;42439:34;42435:1;42427:6;42423:14;42416:58;42299:182;:::o;42487:366::-;42629:3;42650:67;42714:2;42709:3;42650:67;:::i;:::-;42643:74;;42726:93;42815:3;42726:93;:::i;:::-;42844:2;42839:3;42835:12;42828:19;;42487:366;;;:::o;42859:419::-;43025:4;43063:2;43052:9;43048:18;43040:26;;43112:9;43106:4;43102:20;43098:1;43087:9;43083:17;43076:47;43140:131;43266:4;43140:131;:::i;:::-;43132:139;;42859:419;;;:::o;43284:181::-;43424:33;43420:1;43412:6;43408:14;43401:57;43284:181;:::o;43471:366::-;43613:3;43634:67;43698:2;43693:3;43634:67;:::i;:::-;43627:74;;43710:93;43799:3;43710:93;:::i;:::-;43828:2;43823:3;43819:12;43812:19;;43471:366;;;:::o;43843:419::-;44009:4;44047:2;44036:9;44032:18;44024:26;;44096:9;44090:4;44086:20;44082:1;44071:9;44067:17;44060:47;44124:131;44250:4;44124:131;:::i;:::-;44116:139;;43843:419;;;:::o;44268:98::-;44319:6;44353:5;44347:12;44337:22;;44268:98;;;:::o;44372:168::-;44455:11;44489:6;44484:3;44477:19;44529:4;44524:3;44520:14;44505:29;;44372:168;;;;:::o;44546:373::-;44632:3;44660:38;44692:5;44660:38;:::i;:::-;44714:70;44777:6;44772:3;44714:70;:::i;:::-;44707:77;;44793:65;44851:6;44846:3;44839:4;44832:5;44828:16;44793:65;:::i;:::-;44883:29;44905:6;44883:29;:::i;:::-;44878:3;44874:39;44867:46;;44636:283;44546:373;;;;:::o;44925:640::-;45120:4;45158:3;45147:9;45143:19;45135:27;;45172:71;45240:1;45229:9;45225:17;45216:6;45172:71;:::i;:::-;45253:72;45321:2;45310:9;45306:18;45297:6;45253:72;:::i;:::-;45335;45403:2;45392:9;45388:18;45379:6;45335:72;:::i;:::-;45454:9;45448:4;45444:20;45439:2;45428:9;45424:18;45417:48;45482:76;45553:4;45544:6;45482:76;:::i;:::-;45474:84;;44925:640;;;;;;;:::o;45571:141::-;45627:5;45658:6;45652:13;45643:22;;45674:32;45700:5;45674:32;:::i;:::-;45571:141;;;;:::o;45718:349::-;45787:6;45836:2;45824:9;45815:7;45811:23;45807:32;45804:119;;;45842:79;;:::i;:::-;45804:119;45962:1;45987:63;46042:7;46033:6;46022:9;46018:22;45987:63;:::i;:::-;45977:73;;45933:127;45718:349;;;;:::o;46073:180::-;46121:77;46118:1;46111:88;46218:4;46215:1;46208:15;46242:4;46239:1;46232:15;46259:174;46399:26;46395:1;46387:6;46383:14;46376:50;46259:174;:::o;46439:366::-;46581:3;46602:67;46666:2;46661:3;46602:67;:::i;:::-;46595:74;;46678:93;46767:3;46678:93;:::i;:::-;46796:2;46791:3;46787:12;46780:19;;46439:366;;;:::o;46811:419::-;46977:4;47015:2;47004:9;47000:18;46992:26;;47064:9;47058:4;47054:20;47050:1;47039:9;47035:17;47028:47;47092:131;47218:4;47092:131;:::i;:::-;47084:139;;46811:419;;;:::o;47236:181::-;47376:33;47372:1;47364:6;47360:14;47353:57;47236:181;:::o;47423:366::-;47565:3;47586:67;47650:2;47645:3;47586:67;:::i;:::-;47579:74;;47662:93;47751:3;47662:93;:::i;:::-;47780:2;47775:3;47771:12;47764:19;;47423:366;;;:::o;47795:419::-;47961:4;47999:2;47988:9;47984:18;47976:26;;48048:9;48042:4;48038:20;48034:1;48023:9;48019:17;48012:47;48076:131;48202:4;48076:131;:::i;:::-;48068:139;;47795:419;;;:::o;48220:221::-;48360:34;48356:1;48348:6;48344:14;48337:58;48429:4;48424:2;48416:6;48412:15;48405:29;48220:221;:::o;48447:366::-;48589:3;48610:67;48674:2;48669:3;48610:67;:::i;:::-;48603:74;;48686:93;48775:3;48686:93;:::i;:::-;48804:2;48799:3;48795:12;48788:19;;48447:366;;;:::o;48819:419::-;48985:4;49023:2;49012:9;49008:18;49000:26;;49072:9;49066:4;49062:20;49058:1;49047:9;49043:17;49036:47;49100:131;49226:4;49100:131;:::i;:::-;49092:139;;48819:419;;;:::o;49244:221::-;49384:34;49380:1;49372:6;49368:14;49361:58;49453:4;49448:2;49440:6;49436:15;49429:29;49244:221;:::o;49471:366::-;49613:3;49634:67;49698:2;49693:3;49634:67;:::i;:::-;49627:74;;49710:93;49799:3;49710:93;:::i;:::-;49828:2;49823:3;49819:12;49812:19;;49471:366;;;:::o;49843:419::-;50009:4;50047:2;50036:9;50032:18;50024:26;;50096:9;50090:4;50086:20;50082:1;50071:9;50067:17;50060:47;50124:131;50250:4;50124:131;:::i;:::-;50116:139;;49843:419;;;:::o;50268:86::-;50303:7;50343:4;50336:5;50332:16;50321:27;;50268:86;;;:::o;50360:112::-;50443:22;50459:5;50443:22;:::i;:::-;50438:3;50431:35;50360:112;;:::o;50478:545::-;50651:4;50689:3;50678:9;50674:19;50666:27;;50703:71;50771:1;50760:9;50756:17;50747:6;50703:71;:::i;:::-;50784:68;50848:2;50837:9;50833:18;50824:6;50784:68;:::i;:::-;50862:72;50930:2;50919:9;50915:18;50906:6;50862:72;:::i;:::-;50944;51012:2;51001:9;50997:18;50988:6;50944:72;:::i;:::-;50478:545;;;;;;;:::o;51029:194::-;51069:4;51089:20;51107:1;51089:20;:::i;:::-;51084:25;;51123:20;51141:1;51123:20;:::i;:::-;51118:25;;51167:1;51164;51160:9;51152:17;;51191:1;51185:4;51182:11;51179:37;;;51196:18;;:::i;:::-;51179:37;51029:194;;;;:::o;51229:180::-;51277:77;51274:1;51267:88;51374:4;51371:1;51364:15;51398:4;51395:1;51388:15

Swarm Source

ipfs://019f0f3d703191f0f551769253eed5f4d62d07620fcbc6a8ba1131e2cb7e3a6e
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.