ETH Price: $3,468.18 (+2.18%)
Gas: 10 Gwei

Token

Angry Cat (Angry Cat)
 

Overview

Max Total Supply

10,000 Angry Cat

Holders

1,700

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 Angry Cat
0x543ecff492b72d041ca1bcb142b749612c9a4dcf
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Angry cat is a cultural identity. A clean collection of 10,000 different cats to build an interesting brand and cat-city.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NFT

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-24
*/

// File: openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol


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

pragma solidity ^0.8.0;

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

// File: IERC721W.sol


pragma solidity ^0.8.0;

/* Blue chip NFT (BCN) is the NFT that supported ERC721 and world famous.
* BCN's holders can mint new NFT through this protocol.
* The new NFT needs to specify the supported BCN's contract addresses and each address's quantity of mintable.
* The address holding the BCN can mint the same amount of new NFT.
* The tokenId used for each mint will be recorded and cannot be used again.
*/
interface IERC721W{
    event MintByBCN(uint256 indexed tokenId, address indexed to, address indexed bcn, uint256 bcnTokenId);
    
    // Get the length of supported BCN list
    // Returns length: The length of supported BCN list
    function lengthOfSupportedBcn() external view returns(uint256 length);
    
    // Get a list of supported BCN addresses
    // Param index: The index in supported BCN list
    // Returns bcn: The BCN address by the index
    function supportedBcnByIndex(uint256 index) external view returns(address bcn);
    
    // Get whether the BCN is supported
    // Param bcn: The BCN address
    // Returns supported: whether the BCN is supported
    function isBcnSupported(address bcn) external view returns(bool supported);
    
    // Get the number of new NFTs that can be mint by one blue chip NFT
    // Param bcn: The BCN address
    // Return total: The total number of new NFTs that can be mint by the blue chip NFT
    // Return remaining: The remaining number of new NFTs that can be mint by the blue chip NFT
    function mintNumberOfBcn(address bcn) external view returns(uint256 total, uint256 remaining);
    
    // Get whether the tokenId of the BCN is used
    // Param bcn & bcnTokenId: The address and tokenId of BCN to be queried
    // Return used: true means used
    function isTokenMintByBcn(address bcn, uint256 bcnTokenId) external view returns(bool used);
    
    // Mint new nft By BCN
    // Param tokenId: New NFT's tokenIf to be mint
    // Param bcn & bcnTokenId: The address and tokenId of BCN to be queried
    // Requirement: tokenId is not mint
    // Requirement: bcn's bcnTokenId is not use
    // Notice: when the call is successful, record bcnTokenId of bcn is used
    // Notice: when the call is successful, emit MintByBCN event
    // Notice: when the call is successful, update the remaining number of mintable 
    function mintByBcn(uint256 tokenId, address bcn, uint256 bcnTokenId) external;
}

// File: ChainlinkVRF/VRFCoordinatorV2Interface.sol


pragma solidity ^0.8.0;

interface VRFCoordinatorV2Interface {
  /**
   * @notice Get configuration relevant for making requests
   * @return minimumRequestConfirmations global min for request confirmations
   * @return maxGasLimit global max for request gas limit
   * @return s_provingKeyHashes list of registered key hashes
   */
  function getRequestConfig()
    external
    view
    returns (
      uint16,
      uint32,
      bytes32[] memory
    );

  /**
   * @notice Request a set of random words.
   * @param keyHash - Corresponds to a particular oracle job which uses
   * that key for generating the VRF proof. Different keyHash's have different gas price
   * ceilings, so you can select a specific one to bound your maximum per request cost.
   * @param subId  - The ID of the VRF subscription. Must be funded
   * with the minimum subscription balance required for the selected keyHash.
   * @param minimumRequestConfirmations - How many blocks you'd like the
   * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS
   * for why you may want to request more. The acceptable range is
   * [minimumRequestBlockConfirmations, 200].
   * @param callbackGasLimit - How much gas you'd like to receive in your
   * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords
   * may be slightly less than this amount because of gas used calling the function
   * (argument decoding etc.), so you may need to request slightly more than you expect
   * to have inside fulfillRandomWords. The acceptable range is
   * [0, maxGasLimit]
   * @param numWords - The number of uint256 random values you'd like to receive
   * in your fulfillRandomWords callback. Note these numbers are expanded in a
   * secure way by the VRFCoordinator from a single random value supplied by the oracle.
   * @return requestId - A unique identifier of the request. Can be used to match
   * a request to a response in fulfillRandomWords.
   */
  function requestRandomWords(
    bytes32 keyHash,
    uint64 subId,
    uint16 minimumRequestConfirmations,
    uint32 callbackGasLimit,
    uint32 numWords
  ) external returns (uint256 requestId);

  /**
   * @notice Create a VRF subscription.
   * @return subId - A unique subscription id.
   * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer.
   * @dev Note to fund the subscription, use transferAndCall. For example
   * @dev  LINKTOKEN.transferAndCall(
   * @dev    address(COORDINATOR),
   * @dev    amount,
   * @dev    abi.encode(subId));
   */
  function createSubscription() external returns (uint64 subId);

  /**
   * @notice Get a VRF subscription.
   * @param subId - ID of the subscription
   * @return balance - LINK balance of the subscription in juels.
   * @return reqCount - number of requests for this subscription, determines fee tier.
   * @return owner - owner of the subscription.
   * @return consumers - list of consumer address which are able to use this subscription.
   */
  function getSubscription(uint64 subId)
    external
    view
    returns (
      uint96 balance,
      uint64 reqCount,
      address owner,
      address[] memory consumers
    );

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @param newOwner - proposed new owner of the subscription
   */
  function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external;

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @dev will revert if original owner of subId has
   * not requested that msg.sender become the new owner.
   */
  function acceptSubscriptionOwnerTransfer(uint64 subId) external;

  /**
   * @notice Add a consumer to a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - New consumer which can use the subscription
   */
  function addConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Remove a consumer from a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - Consumer to remove from the subscription
   */
  function removeConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Cancel a subscription
   * @param subId - ID of the subscription
   * @param to - Where to send the remaining LINK to
   */
  function cancelSubscription(uint64 subId, address to) external;

  /*
   * @notice Check to see if there exists a request commitment consumers
   * for all consumers and keyhashes for a given sub.
   * @param subId - ID of the subscription
   * @return true if there exists at least one unfulfilled request for the subscription, false
   * otherwise.
   */
  function pendingRequestExists(uint64 subId) external view returns (bool);
}
// File: ChainlinkVRF/VRFConsumerBaseV2.sol


pragma solidity ^0.8.4;

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness. It ensures 2 things:
 * @dev 1. The fulfillment came from the VRFCoordinator
 * @dev 2. The consumer contract implements fulfillRandomWords.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constructor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash). Create subscription, fund it
 * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface
 * @dev subscription management functions).
 * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations,
 * @dev callbackGasLimit, numWords),
 * @dev see (VRFCoordinatorInterface for a description of the arguments).
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomWords method.
 *
 * @dev The randomness argument to fulfillRandomWords is a set of random words
 * @dev generated from your requestId and the blockHash of the request.
 *
 * @dev If your contract could have concurrent requests open, you can use the
 * @dev requestId returned from requestRandomWords to track which response is associated
 * @dev with which randomness request.
 * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ.
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request. It is for this reason that
 * @dev that you can signal to an oracle you'd like them to wait longer before
 * @dev responding to the request (however this is not enforced in the contract
 * @dev and so remains effective only in the case of unmodified oracle software).
 */
abstract contract VRFConsumerBaseV2 {
  error OnlyCoordinatorCanFulfill(address have, address want);
  address private immutable vrfCoordinator;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   */
  constructor(address _vrfCoordinator) {
    vrfCoordinator = _vrfCoordinator;
  }

  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomWords the VRF output expanded to the requested number of words
   */
  function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual;

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external {
    if (msg.sender != vrfCoordinator) {
      revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator);
    }
    fulfillRandomWords(requestId, randomWords);
  }
}
// File: openzeppelin-contracts/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: openzeppelin-contracts/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

// File: openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
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) {
        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 {
            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));
    }
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

// File: AngryCat2.sol


pragma solidity ^0.8.0;











interface INEST{
    function nestingTransfer(uint256 tokenId) external view returns (bool allowed);
}

contract NFT is IERC721Metadata, IERC721Enumerable, Ownable, VRFConsumerBaseV2(0x271682DEB8C4E0901D1a1550aD2e64D568E69909), IERC721W{
  using EnumerableSet for EnumerableSet.AddressSet;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;
  uint256 internal constant maxBatchSize = 50;
  string private _name;
  string private _symbol;
  mapping(uint256 => TokenOwnership) private _ownerships;
  mapping(address => AddressData) private _addressData;
  mapping(uint256 => address) private _tokenApprovals;
  mapping(address => mapping(address => bool)) private _operatorApprovals;
  string private _boxUri;
  string private _tokenUri;
  uint256 constant public maxTotalSupply = 10000;
  uint256 private _boxOffset = 10000;
  EnumerableSet.AddressSet private _supportedBcns;
  mapping(address => uint256) private _supplyOfBcn;
  mapping(address => uint256) private _remaingOfBcn;
  mapping(address => mapping(uint256 => bool)) private _isTokenMintByBcn;
  uint256[] private _startTimes;
  address public signer;
  address public nest;
  mapping(address => bool) public whitelistMinted;
  mapping(address => bool) public winnerMinted;
  
  constructor(string memory name_, string memory symbol_, string memory boxUri_, address signer_, uint256[] memory startTimes) {
    _name = name_;
    _symbol = symbol_;
    _boxUri = boxUri_;
    signer = signer_;
    _startTimes = startTimes;
  }

  function totalSupply() public view override returns (uint256) {
    return currentIndex;
  }

  function tokenByIndex(uint256 index) public view override returns (uint256) {
    require(index < totalSupply(), "ERC721A: global index out of bounds");
    return index;
  }

  function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256){
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

  function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool){
    return interfaceId == type(IERC721).interfaceId ||
      interfaceId == type(IERC721Metadata).interfaceId ||
      interfaceId == type(IERC721Enumerable).interfaceId ||
      interfaceId == type(IERC165).interfaceId;
  }

  function balanceOf(address owner) public view override returns (uint256) {
    require(owner != address(0), "ERC721A: balance query for the zero address");
    return uint256(_addressData[owner].balance);
  }

  function numberMinted(address owner) external view returns (uint256) {
    require(owner != address(0), "ERC721A: number minted query for the zero address");
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory){
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");
    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }
    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }
    revert("ERC721A: unable to determine the owner of token");
  }
  
  function ownerOf(uint256 tokenId) public view override returns (address) {
    return ownershipOf(tokenId).addr;
  }

  function name() public view virtual override returns (string memory) {
    return _name;
  }

  function symbol() public view virtual override returns (string memory) {
    return _symbol;
  }

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory){
    require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
    return _boxOffset < 10000 ? string(abi.encodePacked(_tokenUri, Strings.toString((tokenId+_boxOffset) % 10000))) : _boxUri;
  }
  
  function approve(address to, uint256 tokenId) public override {
    address owner = ownerOf(tokenId);
    require(to != owner, "ERC721A: approval to current owner");
    require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all");
    _approve(to, tokenId, owner);
  }

  function getApproved(uint256 tokenId) public view override returns (address) {
    require(_exists(tokenId), "ERC721A: approved query for nonexistent token");
    return _tokenApprovals[tokenId];
  }

  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721A: approve to caller");
    _operatorApprovals[_msgSender()][operator] = approved;
    emit ApprovalForAll(_msgSender(), operator, approved);
  }

  function isApprovedForAll(address owner, address operator) public view virtual override returns (bool){
    return _operatorApprovals[owner][operator];
  }

  function transferFrom(address from, address to, uint256 tokenId) public override {
    _transfer(from, to, tokenId);
  }

  function safeTransferFrom(address from, address to, uint256 tokenId) public override {
    safeTransferFrom(from, to, tokenId, "");
  }

  function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public override {
    _transfer(from, to, tokenId);
    require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer");
  }

  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  function _safeMint(address to, uint256 quantity, bytes memory _data) internal {
    require(quantity + currentIndex <= 10000, "NFT: maxTotalSupply");
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");
    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));
    uint256 updatedIndex = startTokenId;
    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(_checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer");
      updatedIndex++;
    }
    currentIndex = updatedIndex;
  }

  function _transfer(address from, address to, uint256 tokenId) private {
    if(nest != address(0)){
      require(INEST(nest).nestingTransfer(tokenId), "NFT:nesting limit");  
    }
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);
    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender()));
    require(isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved");
    require(prevOwnership.addr == from, "ERC721A: transfer from incorrect owner");
    require(to != address(0), "ERC721A: transfer to the zero address");
    // Clear approvals from the previous owner
    _approve(address(0), tokenId, prevOwnership.addr);
    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));
    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }
    emit Transfer(from, to, tokenId);
  }

  function _approve(address to, uint256 tokenId, address owner) private {
    _tokenApprovals[tokenId] = to;
    emit Approval(owner, to, tokenId);
  }
  
  function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) {
    if (to.code.length > 0) {
      try
        IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
      returns (bytes4 retval) {
        return retval == IERC721Receiver(to).onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721A: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }
  
  modifier allowOpen(){
      require(_boxOffset >= maxTotalSupply && totalSupply() >= maxTotalSupply, "Cat:not sold out or is open");
      _;
  }
  
  function fulfillRandomWords(uint256, uint256[] memory randomWords) internal override allowOpen{
      _boxOffset = randomWords[0] % maxTotalSupply;
  }
    
  function openBox() external allowOpen onlyOwner {
      require(_boxOffset >= maxTotalSupply && totalSupply() == maxTotalSupply, "Cat:not sold out or is open");
      VRFCoordinatorV2Interface(0x271682DEB8C4E0901D1a1550aD2e64D568E69909).requestRandomWords(0x8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef,411,3,300000,1);
  }
  
  function openBox2() external allowOpen onlyOwner {
      _boxOffset = uint256(blockhash(block.number - 1)) % maxTotalSupply;
  }
  
  function setTokenUri(string memory tokenUri_) external onlyOwner{
      _tokenUri = tokenUri_;
  }
  
  function setBoxUri(string memory boxUri_) external onlyOwner{
      _boxUri = boxUri_;
  }
  
  function lengthOfSupportedBcn() external override view returns(uint256 length){
        return _supportedBcns.length();
    }
    
    function supportedBcnByIndex(uint256 index) external override view returns(address bcn){
        return _supportedBcns.at(index);
    }
    
    function mintNumberOfBcn(address bcn) external override view returns(uint256 total, uint256 remaining){
        return (_supplyOfBcn[bcn], _remaingOfBcn[bcn]);
    }
    
    function isBcnSupported(address bcn) external override view returns(bool supported){
        return _supportedBcns.contains(bcn);
    }
    
    function isTokenMintByBcn(address bcn, uint256 bcnTokenId) external override view returns(bool used){
        used = _isTokenMintByBcn[bcn][bcnTokenId];
    }
    
    function mintByBcn(uint256 tokenId, address bcn, uint256 bcnTokenId) external override{
        require(block.timestamp > uint256(_startTimes[2]), "Cat:not open");
        address to = IERC721(bcn).ownerOf(bcnTokenId);
        require(to != address(0), "ERC721W:bcnTokenId not exists");
        require(!_isTokenMintByBcn[bcn][bcnTokenId], "ERC721W:bcnTokenId is used");
        require(_supportedBcns.contains(bcn), "ERC721W:not supported bcn");
        _isTokenMintByBcn[bcn][bcnTokenId] = true;
        _remaingOfBcn[bcn]--;
        emit MintByBCN(totalSupply(), to, bcn, bcnTokenId);
        _safeMint(to, 1);
    }
    
    function batchAddBcn(address[] memory bcns, uint256[] memory quantities) external onlyOwner{
        for(uint256 i = 0; i < bcns.length; i++){
            address bcn = bcns[i];
            uint256 quantity = quantities[i];
            _supportedBcns.add(bcn);
            _supplyOfBcn[bcn] += quantity;
            _remaingOfBcn[bcn] += quantity;
        }
    }
    
    function enableBcn(address bcn, bool enable) external onlyOwner{
        if(enable){
            require(_supportedBcns.add(bcn), "ERC721W:alread enable");
        }else{
            require(_supportedBcns.remove(bcn), "ERC721W:alread disable");
        }
    }
    
    function setBcn(address bcn, uint256 quantity, bool minus) external onlyOwner{
        if(minus){
            _supplyOfBcn[bcn] -= quantity;
            _remaingOfBcn[bcn] -= quantity;
        }else{
            _supplyOfBcn[bcn] += quantity;
            _remaingOfBcn[bcn] += quantity;
        }
    }
    
    function mintByWhitelist(uint256 quantity, uint8 v, bytes32 r, bytes32 s) external {
        address to = _msgSender();
        require(block.timestamp > uint256(_startTimes[0]), "Cat:not open");
        bytes32 hash = keccak256(abi.encodePacked(block.chainid, address(this), "whitelist", to, quantity));
        require(signer == ECDSA.recover(hash, v, r, s), "Cat:sign error");
        require(!whitelistMinted[to], "Cat:minted");
        whitelistMinted[to] = true;
        _safeMint(to, quantity);
    }
    
    function mintByWinner(uint256 quantity, uint8 v, bytes32 r, bytes32 s) external {
        address to = _msgSender();
        require(block.timestamp > uint256(_startTimes[1]), "Cat:not open");
        bytes32 hash = keccak256(abi.encodePacked(block.chainid, address(this), "winner", to, quantity));
        require(signer == ecrecover(hash, v, r, s), "Cat:sign error");
        require(!winnerMinted[to], "Cat:minted");
        winnerMinted[to] = true;
        _safeMint(to, quantity);
    }
    
    function getBcnInfo() external view returns(address[] memory bcns, uint256[] memory totals, uint256[] memory remainings){
        uint256 len = _supportedBcns.length();
        bcns = new address[](len);
        totals = new uint256[](len);
        remainings = new uint256[](len);
        for(uint256 i = 0; i < len; i++){
            address bcn = _supportedBcns.at(i);
            bcns[i] = bcn;
            totals[i] = _supplyOfBcn[bcn];
            remainings[i] = _remaingOfBcn[bcn];
        }
    }
    
    function getStartTimes() external view returns(uint256[] memory){
        return _startTimes;
    }
    
    function setStartTimes(uint256[] memory startTimes) external onlyOwner{
        require(startTimes.length == 3, "NFT: array length error");
        _startTimes = startTimes;
    }
    
    function setSigner(address _signer) external onlyOwner{
        signer = _signer;
    }
    
    function setNest(address _nest) external onlyOwner{
        nest = _nest;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"boxUri_","type":"string"},{"internalType":"address","name":"signer_","type":"address"},{"internalType":"uint256[]","name":"startTimes","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"bcn","type":"address"},{"indexed":false,"internalType":"uint256","name":"bcnTokenId","type":"uint256"}],"name":"MintByBCN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"bcns","type":"address[]"},{"internalType":"uint256[]","name":"quantities","type":"uint256[]"}],"name":"batchAddBcn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bcn","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"enableBcn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBcnInfo","outputs":[{"internalType":"address[]","name":"bcns","type":"address[]"},{"internalType":"uint256[]","name":"totals","type":"uint256[]"},{"internalType":"uint256[]","name":"remainings","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStartTimes","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":"address","name":"bcn","type":"address"}],"name":"isBcnSupported","outputs":[{"internalType":"bool","name":"supported","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"bcn","type":"address"},{"internalType":"uint256","name":"bcnTokenId","type":"uint256"}],"name":"isTokenMintByBcn","outputs":[{"internalType":"bool","name":"used","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lengthOfSupportedBcn","outputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"bcn","type":"address"},{"internalType":"uint256","name":"bcnTokenId","type":"uint256"}],"name":"mintByBcn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mintByWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mintByWinner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bcn","type":"address"}],"name":"mintNumberOfBcn","outputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"remaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nest","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openBox2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bcn","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bool","name":"minus","type":"bool"}],"name":"setBcn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"boxUri_","type":"string"}],"name":"setBoxUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nest","type":"address"}],"name":"setNest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"startTimes","type":"uint256[]"}],"name":"setStartTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenUri_","type":"string"}],"name":"setTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"supportedBcnByIndex","outputs":[{"internalType":"address","name":"bcn","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"winnerMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60a06040526000600155612710600a553480156200001c57600080fd5b5060405162003d8f38038062003d8f8339810160408190526200003f9162000382565b73271682deb8c4e0901d1a1550ad2e64d568e699096200005f33620000e9565b6001600160a01b031660805284516200008090600290602088019062000139565b5083516200009690600390602087019062000139565b508251620000ac90600890602086019062000139565b50601180546001600160a01b0319166001600160a01b0384161790558051620000dd906010906020840190620001c8565b5050505050506200049a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000147906200045d565b90600052602060002090601f0160209004810192826200016b5760008555620001b6565b82601f106200018657805160ff1916838001178555620001b6565b82800160010185558215620001b6579182015b82811115620001b657825182559160200191906001019062000199565b50620001c492915062000205565b5090565b828054828255906000526020600020908101928215620001b65791602002820182811115620001b657825182559160200191906001019062000199565b5b80821115620001c4576000815560010162000206565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200025d576200025d6200021c565b604052919050565b600082601f8301126200027757600080fd5b81516001600160401b038111156200029357620002936200021c565b6020620002a9601f8301601f1916820162000232565b8281528582848701011115620002be57600080fd5b60005b83811015620002de578581018301518282018401528201620002c1565b83811115620002f05760008385840101525b5095945050505050565b600082601f8301126200030c57600080fd5b815160206001600160401b038211156200032a576200032a6200021c565b8160051b6200033b82820162000232565b92835284810182019282810190878511156200035657600080fd5b83870192505b8483101562000377578251825291830191908301906200035c565b979650505050505050565b600080600080600060a086880312156200039b57600080fd5b85516001600160401b0380821115620003b357600080fd5b620003c189838a0162000265565b96506020880151915080821115620003d857600080fd5b620003e689838a0162000265565b95506040880151915080821115620003fd57600080fd5b6200040b89838a0162000265565b606089015190955091506001600160a01b03821682146200042b57600080fd5b6080880151919350808211156200044157600080fd5b506200045088828901620002fa565b9150509295509295909350565b600181811c908216806200047257607f821691505b602082108114156200049457634e487b7160e01b600052602260045260246000fd5b50919050565b6080516138d2620004bd60003960008181610e730152610eb501526138d26000f3fe608060405234801561001057600080fd5b506004361061028a5760003560e01c80636abd89201161015c578063b88d4fde116100ce578063d6b1f19811610087578063d6b1f198146105d2578063dc33e6811461060a578063e985e9c51461061d578063f2c7fb0514610659578063f2fde38b1461066c578063f7b26d0a1461067f57600080fd5b8063b88d4fde14610566578063bf80b41414610579578063c2e952c71461058c578063c87b56dd14610594578063c8eb03eb146105a7578063cd226e21146105ca57600080fd5b80638da5cb5b116101205780638da5cb5b146104fc57806395d89b411461050d57806398a8cffe14610515578063a22cb46514610538578063a29110431461054b578063a7fbe2581461055e57600080fd5b80636abd8920146104705780636c19e7831461048357806370a0823114610496578063715018a6146104a957806385dfd25b146104b157600080fd5b806323b872dd116102005780634f6ccce7116101b95780634f6ccce7146103fc5780635d87f3551461040f5780636064db2b146104225780636170eabb146104355780636352211e1461044a578063697a279c1461045d57600080fd5b806323b872dd146103945780632ab4d052146103a75780632c779d06146103b05780632f745c59146103c357806342842e0e146103d6578063471e1016146103e957600080fd5b8063095ea7b311610252578063095ea7b314610323578063148b3c781461033657806315e2e9051461034957806318160ddd1461035c5780631fe543e31461036e578063238ac9331461038157600080fd5b806301ffc9a71461028f5780630675b7c6146102b757806306fdde03146102cc578063081812fc146102e157806308ed3bb41461030c575b600080fd5b6102a261029d366004612eba565b610692565b60405190151581526020015b60405180910390f35b6102ca6102c5366004612f74565b6106ff565b005b6102d461071e565b6040516102ae9190613014565b6102f46102ef366004613027565b6107b0565b6040516001600160a01b0390911681526020016102ae565b610314610840565b6040516102ae9392919061307b565b6102ca610331366004613105565b610a0d565b6102ca61034436600461313f565b610b25565b6102ca610357366004613181565b610bf2565b6001545b6040519081526020016102ae565b6102ca61037c366004613247565b610e68565b6011546102f4906001600160a01b031681565b6102ca6103a236600461328d565b610eec565b61036061271081565b6102ca6103be3660046132bd565b610ef7565b6103606103d1366004613105565b610fcd565b6102ca6103e436600461328d565b611145565b6102ca6103f7366004613374565b611160565b61036061040a366004613027565b61133e565b6102ca61041d3660046133b7565b6113a7565b6102f4610430366004613027565b611413565b61043d611420565b6040516102ae91906133eb565b6102f4610458366004613027565b611477565b6102ca61046b3660046133fe565b611489565b6102ca61047e366004612f74565b6114b3565b6102ca6104913660046133fe565b6114ce565b6103606104a43660046133fe565b6114f8565b6102ca611589565b6104e76104bf3660046133fe565b6001600160a01b03166000908152600d6020908152604080832054600e909252909120549091565b604080519283526020830191909152016102ae565b6000546001600160a01b03166102f4565b6102d461159d565b6102a26105233660046133fe565b60136020526000908152604090205460ff1681565b6102ca61054636600461341b565b6115ac565b6102a26105593660046133fe565b611671565b6102ca61167e565b6102ca610574366004613454565b6116de565b6102ca61058736600461341b565b611711565b6102ca6117be565b6102d46105a2366004613027565b6118f0565b6102a26105b53660046133fe565b60146020526000908152604090205460ff1681565b610360611a47565b6102a26105e0366004613105565b6001600160a01b039091166000908152600f60209081526040808320938352929052205460ff1690565b6103606106183660046133fe565b611a58565b6102a261062b3660046134d3565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6012546102f4906001600160a01b031681565b6102ca61067a3660046133fe565b611af6565b6102ca61068d366004613374565b611b6c565b60006001600160e01b031982166380ac58cd60e01b14806106c357506001600160e01b03198216635b5e139f60e01b145b806106de57506001600160e01b0319821663780e9d6360e01b145b806106f957506001600160e01b031982166301ffc9a760e01b145b92915050565b610707611ced565b805161071a906009906020840190612dd5565b5050565b60606002805461072d90613501565b80601f016020809104026020016040519081016040528092919081815260200182805461075990613501565b80156107a65780601f1061077b576101008083540402835291602001916107a6565b820191906000526020600020905b81548152906001019060200180831161078957829003601f168201915b5050505050905090565b60006107bd826001541190565b6108245760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60608060606000610851600b611d47565b9050806001600160401b0381111561086b5761086b612ed7565b604051908082528060200260200182016040528015610894578160200160208202803683370190505b509350806001600160401b038111156108af576108af612ed7565b6040519080825280602002602001820160405280156108d8578160200160208202803683370190505b509250806001600160401b038111156108f3576108f3612ed7565b60405190808252806020026020018201604052801561091c578160200160208202803683370190505b50915060005b81811015610a06576000610937600b83611d51565b90508086838151811061094c5761094c61353c565b60200260200101906001600160a01b031690816001600160a01b031681525050600d6000826001600160a01b03166001600160a01b03168152602001908152602001600020548583815181106109a4576109a461353c565b602002602001018181525050600e6000826001600160a01b03166001600160a01b03168152602001908152602001600020548483815181106109e8576109e861353c565b602090810291909101015250806109fe81613568565b915050610922565b5050909192565b6000610a1882611477565b9050806001600160a01b0316836001600160a01b03161415610a875760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161081b565b336001600160a01b0382161480610aa35750610aa3813361062b565b610b155760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161081b565b610b20838383611d64565b505050565b610b2d611ced565b8015610b93576001600160a01b0383166000908152600d602052604081208054849290610b5b908490613583565b90915550506001600160a01b0383166000908152600e602052604081208054849290610b88908490613583565b90915550610b209050565b6001600160a01b0383166000908152600d602052604081208054849290610bbb90849061359a565b90915550506001600160a01b0383166000908152600e602052604081208054849290610be890849061359a565b9091555050505050565b6010600281548110610c0657610c0661353c565b90600052602060002001544211610c2f5760405162461bcd60e51b815260040161081b906135b2565b6040516331a9108f60e11b8152600481018290526000906001600160a01b03841690636352211e90602401602060405180830381865afa158015610c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9b91906135d8565b90506001600160a01b038116610cf35760405162461bcd60e51b815260206004820152601d60248201527f455243373231573a62636e546f6b656e4964206e6f7420657869737473000000604482015260640161081b565b6001600160a01b0383166000908152600f6020908152604080832085845290915290205460ff1615610d675760405162461bcd60e51b815260206004820152601a60248201527f455243373231573a62636e546f6b656e49642069732075736564000000000000604482015260640161081b565b610d72600b84611dc0565b610dbe5760405162461bcd60e51b815260206004820152601960248201527f455243373231573a6e6f7420737570706f727465642062636e00000000000000604482015260640161081b565b6001600160a01b0383166000818152600f602090815260408083208684528252808320805460ff19166001179055928252600e9052908120805491610e02836135f5565b9190505550826001600160a01b0316816001600160a01b0316610e2460015490565b6040518581527ffdadaff84e30a3d7f2d7d0663dbb2c5f840ce4790f29ea017fa4b0179d0950919060200160405180910390a4610e62816001611de2565b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ee25760405163073e64fd60e21b81523360048201526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016602482015260440161081b565b61071a8282611dfc565b610b20838383611e65565b610eff611ced565b60005b8251811015610b20576000838281518110610f1f57610f1f61353c565b602002602001015190506000838381518110610f3d57610f3d61353c565b60200260200101519050610f5b82600b6122a890919063ffffffff16565b506001600160a01b0382166000908152600d602052604081208054839290610f8490849061359a565b90915550506001600160a01b0382166000908152600e602052604081208054839290610fb190849061359a565b9250508190555050508080610fc590613568565b915050610f02565b6000610fd8836114f8565b82106110315760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161081b565b600061103c60015490565b905060008060005b838110156110e5576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561109657805192505b876001600160a01b0316836001600160a01b031614156110d257868414156110c4575093506106f992505050565b836110ce81613568565b9450505b50806110dd81613568565b915050611044565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161081b565b610b20838383604051806020016040528060008152506116de565b600033905060106001815481106111795761117961353c565b906000526020600020015442116111a25760405162461bcd60e51b815260040161081b906135b2565b604080514660208201526bffffffffffffffffffffffff1930606090811b821693830193909352653bb4b73732b960d11b60548301529183901b909116605a820152606e8101869052600090608e0160408051601f1981840301815282825280516020918201206000845290830180835281905260ff8816918301919091526060820186905260808201859052915060019060a0016020604051602081039080840390855afa158015611259573d6000803e3d6000fd5b5050604051601f1901516011546001600160a01b0390811691161490506112b35760405162461bcd60e51b815260206004820152600e60248201526d21b0ba1d39b4b3b71032b93937b960911b604482015260640161081b565b6001600160a01b03821660009081526014602052604090205460ff16156113095760405162461bcd60e51b815260206004820152600a60248201526910d85d0e9b5a5b9d195960b21b604482015260640161081b565b6001600160a01b0382166000908152601460205260409020805460ff191660011790556113368287611de2565b505050505050565b600061134960015490565b82106113a35760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161081b565b5090565b6113af611ced565b80516003146114005760405162461bcd60e51b815260206004820152601760248201527f4e46543a206172726179206c656e677468206572726f72000000000000000000604482015260640161081b565b805161071a906010906020840190612e55565b60006106f9600b83611d51565b606060108054806020026020016040519081016040528092919081815260200182805480156107a657602002820191906000526020600020905b81548152602001906001019080831161145a575050505050905090565b6000611482826122bd565b5192915050565b611491611ced565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6114bb611ced565b805161071a906008906020840190612dd5565b6114d6611ced565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166115645760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161081b565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b611591611ced565b61159b6000612428565b565b60606003805461072d90613501565b6001600160a01b0382163314156116055760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161081b565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60006106f9600b83611dc0565b612710600a541015801561169c575061271061169960015490565b10155b6116b85760405162461bcd60e51b815260040161081b9061360c565b6116c0611ced565b6127106116ce600143613583565b6116d9919040613659565b600a55565b6116e9848484611e65565b6116f584848484612478565b610e625760405162461bcd60e51b815260040161081b9061366d565b611719611ced565b801561176e5761172a600b836122a8565b61071a5760405162461bcd60e51b8152602060048201526015602482015274455243373231573a616c7265616420656e61626c6560581b604482015260640161081b565b611779600b83612577565b61071a5760405162461bcd60e51b8152602060048201526016602482015275455243373231573a616c726561642064697361626c6560501b604482015260640161081b565b612710600a54101580156117dc57506127106117d960015490565b10155b6117f85760405162461bcd60e51b815260040161081b9061360c565b611800611ced565b612710600a541015801561181d575061271061181b60015490565b145b6118395760405162461bcd60e51b815260040161081b9061360c565b6040516305d3b1d360e41b81527f8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef600482015261019b602482015260036044820152620493e060648201526001608482015273271682deb8c4e0901d1a1550ad2e64d568e6990990635d3b1d309060a4016020604051808303816000875af11580156118c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ed91906136c0565b50565b60606118fd826001541190565b6119615760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161081b565b612710600a54106119fc576008805461197990613501565b80601f01602080910402602001604051908101604052809291908181526020018280546119a590613501565b80156119f25780601f106119c7576101008083540402835291602001916119f2565b820191906000526020600020905b8154815290600101906020018083116119d557829003601f168201915b50505050506106f9565b6009611a21612710600a5485611a12919061359a565b611a1c9190613659565b61258c565b604051602001611a329291906136f5565b60405160208183030381529060405292915050565b6000611a53600b611d47565b905090565b60006001600160a01b038216611aca5760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b606482015260840161081b565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b611afe611ced565b6001600160a01b038116611b635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161081b565b6118ed81612428565b60003390506010600081548110611b8557611b8561353c565b90600052602060002001544211611bae5760405162461bcd60e51b815260040161081b906135b2565b60408051466020808301919091526bffffffffffffffffffffffff1930606090811b821684860152681dda1a5d195b1a5cdd60ba1b605485015285901b16605d83015260718083018990528351808403909101815260919092019092528051910120611c1c81868686612689565b6011546001600160a01b03908116911614611c6a5760405162461bcd60e51b815260206004820152600e60248201526d21b0ba1d39b4b3b71032b93937b960911b604482015260640161081b565b6001600160a01b03821660009081526013602052604090205460ff1615611cc05760405162461bcd60e51b815260206004820152600a60248201526910d85d0e9b5a5b9d195960b21b604482015260640161081b565b6001600160a01b0382166000908152601360205260409020805460ff191660011790556113368287611de2565b6000546001600160a01b0316331461159b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161081b565b60006106f9825490565b6000611d5d83836126b1565b9392505050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001600160a01b03811660009081526001830160205260408120541515611d5d565b61071a8282604051806020016040528060008152506126db565b612710600a5410158015611e1a5750612710611e1760015490565b10155b611e365760405162461bcd60e51b815260040161081b9061360c565b61271081600081518110611e4c57611e4c61353c565b6020026020010151611e5e9190613659565b600a555050565b6012546001600160a01b031615611f235760125460405163bc0dfbfd60e01b8152600481018390526001600160a01b039091169063bc0dfbfd90602401602060405180830381865afa158015611ebf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee3919061379c565b611f235760405162461bcd60e51b81526020600482015260116024820152701391950e9b995cdd1a5b99c81b1a5b5a5d607a1b604482015260640161081b565b6000611f2e826122bd565b80519091506000906001600160a01b0316336001600160a01b03161480611f65575033611f5a846107b0565b6001600160a01b0316145b80611f7757508151611f77903361062b565b905080611fe15760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161081b565b846001600160a01b031682600001516001600160a01b0316146120555760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161081b565b6001600160a01b0384166120b95760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161081b565b6120c96000848460000151611d64565b6001600160a01b03851660009081526005602052604081208054600192906120fb9084906001600160801b03166137b9565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092612147918591166137e1565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556121ce84600161359a565b6000818152600460205260409020549091506001600160a01b031661225f576121f8816001541190565b1561225f5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000611d5d836001600160a01b0384166129eb565b60408051808201909152600080825260208201526122dc826001541190565b61233b5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161081b565b60006032831061235e57612350603284613583565b61235b90600161359a565b90505b825b8181106123c7576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156123b457949350505050565b50806123bf816135f5565b915050612360565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b606482015260840161081b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b1561256b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906124bc90339089908890889060040161380c565b6020604051808303816000875af19250505080156124f7575060408051601f3d908101601f191682019092526124f49181019061383f565b60015b612551573d808015612525576040519150601f19603f3d011682016040523d82523d6000602084013e61252a565b606091505b5080516125495760405162461bcd60e51b815260040161081b9061366d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061256f565b5060015b949350505050565b6000611d5d836001600160a01b038416612a3a565b6060816125b05750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125da57806125c481613568565b91506125d39050600a8361385c565b91506125b4565b6000816001600160401b038111156125f4576125f4612ed7565b6040519080825280601f01601f19166020018201604052801561261e576020820181803683370190505b5090505b841561256f57612633600183613583565b9150612640600a86613659565b61264b90603061359a565b60f81b8183815181106126605761266061353c565b60200101906001600160f81b031916908160001a905350612682600a8661385c565b9450612622565b600080600061269a87878787612b2d565b915091506126a781612c1a565b5095945050505050565b60008260000182815481106126c8576126c861353c565b9060005260206000200154905092915050565b612710600154836126ec919061359a565b11156127305760405162461bcd60e51b81526020600482015260136024820152724e46543a206d6178546f74616c537570706c7960681b604482015260640161081b565b6001546001600160a01b0384166127935760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161081b565b61279e816001541190565b156127eb5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161081b565b60328311156128475760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b606482015260840161081b565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906128a39087906137e1565b6001600160801b031681526020018583602001516128c191906137e1565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156129e05760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46129a46000888488612478565b6129c05760405162461bcd60e51b815260040161081b9061366d565b816129ca81613568565b92505080806129d890613568565b915050612957565b506001555050505050565b6000818152600183016020526040812054612a32575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106f9565b5060006106f9565b60008181526001830160205260408120548015612b23576000612a5e600183613583565b8554909150600090612a7290600190613583565b9050818114612ad7576000866000018281548110612a9257612a9261353c565b9060005260206000200154905080876000018481548110612ab557612ab561353c565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612ae857612ae8613870565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106f9565b60009150506106f9565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612b645750600090506003612c11565b8460ff16601b14158015612b7c57508460ff16601c14155b15612b8d5750600090506004612c11565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612be1573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c0a57600060019250925050612c11565b9150600090505b94509492505050565b6000816004811115612c2e57612c2e613886565b1415612c375750565b6001816004811115612c4b57612c4b613886565b1415612c995760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161081b565b6002816004811115612cad57612cad613886565b1415612cfb5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161081b565b6003816004811115612d0f57612d0f613886565b1415612d685760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161081b565b6004816004811115612d7c57612d7c613886565b14156118ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161081b565b828054612de190613501565b90600052602060002090601f016020900481019282612e035760008555612e49565b82601f10612e1c57805160ff1916838001178555612e49565b82800160010185558215612e49579182015b82811115612e49578251825591602001919060010190612e2e565b506113a3929150612e8f565b828054828255906000526020600020908101928215612e495791602002820182811115612e49578251825591602001919060010190612e2e565b5b808211156113a35760008155600101612e90565b6001600160e01b0319811681146118ed57600080fd5b600060208284031215612ecc57600080fd5b8135611d5d81612ea4565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612f1557612f15612ed7565b604052919050565b60006001600160401b03831115612f3657612f36612ed7565b612f49601f8401601f1916602001612eed565b9050828152838383011115612f5d57600080fd5b828260208301376000602084830101529392505050565b600060208284031215612f8657600080fd5b81356001600160401b03811115612f9c57600080fd5b8201601f81018413612fad57600080fd5b61256f84823560208401612f1d565b60005b83811015612fd7578181015183820152602001612fbf565b83811115610e625750506000910152565b60008151808452613000816020860160208601612fbc565b601f01601f19169290920160200192915050565b602081526000611d5d6020830184612fe8565b60006020828403121561303957600080fd5b5035919050565b600081518084526020808501945080840160005b8381101561307057815187529582019590820190600101613054565b509495945050505050565b606080825284519082018190526000906020906080840190828801845b828110156130bd5781516001600160a01b031684529284019290840190600101613098565b505050838103828501526130d18187613040565b91505082810360408401526130e68185613040565b9695505050505050565b6001600160a01b03811681146118ed57600080fd5b6000806040838503121561311857600080fd5b8235613123816130f0565b946020939093013593505050565b80151581146118ed57600080fd5b60008060006060848603121561315457600080fd5b833561315f816130f0565b925060208401359150604084013561317681613131565b809150509250925092565b60008060006060848603121561319657600080fd5b8335925060208401356131a8816130f0565b929592945050506040919091013590565b60006001600160401b038211156131d2576131d2612ed7565b5060051b60200190565b600082601f8301126131ed57600080fd5b813560206132026131fd836131b9565b612eed565b82815260059290921b8401810191818101908684111561322157600080fd5b8286015b8481101561323c5780358352918301918301613225565b509695505050505050565b6000806040838503121561325a57600080fd5b8235915060208301356001600160401b0381111561327757600080fd5b613283858286016131dc565b9150509250929050565b6000806000606084860312156132a257600080fd5b83356132ad816130f0565b925060208401356131a8816130f0565b600080604083850312156132d057600080fd5b82356001600160401b03808211156132e757600080fd5b818501915085601f8301126132fb57600080fd5b8135602061330b6131fd836131b9565b82815260059290921b8401810191818101908984111561332a57600080fd5b948201945b83861015613351578535613342816130f0565b8252948201949082019061332f565b9650508601359250508082111561336757600080fd5b50613283858286016131dc565b6000806000806080858703121561338a57600080fd5b84359350602085013560ff811681146133a257600080fd5b93969395505050506040820135916060013590565b6000602082840312156133c957600080fd5b81356001600160401b038111156133df57600080fd5b61256f848285016131dc565b602081526000611d5d6020830184613040565b60006020828403121561341057600080fd5b8135611d5d816130f0565b6000806040838503121561342e57600080fd5b8235613439816130f0565b9150602083013561344981613131565b809150509250929050565b6000806000806080858703121561346a57600080fd5b8435613475816130f0565b93506020850135613485816130f0565b92506040850135915060608501356001600160401b038111156134a757600080fd5b8501601f810187136134b857600080fd5b6134c787823560208401612f1d565b91505092959194509250565b600080604083850312156134e657600080fd5b82356134f1816130f0565b91506020830135613449816130f0565b600181811c9082168061351557607f821691505b6020821081141561353657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561357c5761357c613552565b5060010190565b60008282101561359557613595613552565b500390565b600082198211156135ad576135ad613552565b500190565b6020808252600c908201526b21b0ba1d3737ba1037b832b760a11b604082015260600190565b6000602082840312156135ea57600080fd5b8151611d5d816130f0565b60008161360457613604613552565b506000190190565b6020808252601b908201527f4361743a6e6f7420736f6c64206f7574206f72206973206f70656e0000000000604082015260600190565b634e487b7160e01b600052601260045260246000fd5b60008261366857613668613643565b500690565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6000602082840312156136d257600080fd5b5051919050565b600081516136eb818560208601612fbc565b9290920192915050565b600080845481600182811c91508083168061371157607f831692505b602080841082141561373157634e487b7160e01b86526022600452602486fd5b818015613745576001811461375657613783565b60ff19861689528489019650613783565b60008b81526020902060005b8681101561377b5781548b820152908501908301613762565b505084890196505b50505050505061379381856136d9565b95945050505050565b6000602082840312156137ae57600080fd5b8151611d5d81613131565b60006001600160801b03838116908316818110156137d9576137d9613552565b039392505050565b60006001600160801b0380831681851680830382111561380357613803613552565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906130e690830184612fe8565b60006020828403121561385157600080fd5b8151611d5d81612ea4565b60008261386b5761386b613643565b500490565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fdfea26469706673582212206ac9d838d8530279966210602065423d57e8287d75f1ee9de8a105a9b0cb955764736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000aa966d025f677b239e8d831f16cc10eadda07fb900000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000009416e6772792043617400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009416e677279204361740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f616e6772796361742e696f2f7374617469632f6769662f6f70656e2e67696600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000632e80c000000000000000000000000000000000000000000000000000000000632ed52000000000000000000000000000000000000000000000000000000000632ed520

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061028a5760003560e01c80636abd89201161015c578063b88d4fde116100ce578063d6b1f19811610087578063d6b1f198146105d2578063dc33e6811461060a578063e985e9c51461061d578063f2c7fb0514610659578063f2fde38b1461066c578063f7b26d0a1461067f57600080fd5b8063b88d4fde14610566578063bf80b41414610579578063c2e952c71461058c578063c87b56dd14610594578063c8eb03eb146105a7578063cd226e21146105ca57600080fd5b80638da5cb5b116101205780638da5cb5b146104fc57806395d89b411461050d57806398a8cffe14610515578063a22cb46514610538578063a29110431461054b578063a7fbe2581461055e57600080fd5b80636abd8920146104705780636c19e7831461048357806370a0823114610496578063715018a6146104a957806385dfd25b146104b157600080fd5b806323b872dd116102005780634f6ccce7116101b95780634f6ccce7146103fc5780635d87f3551461040f5780636064db2b146104225780636170eabb146104355780636352211e1461044a578063697a279c1461045d57600080fd5b806323b872dd146103945780632ab4d052146103a75780632c779d06146103b05780632f745c59146103c357806342842e0e146103d6578063471e1016146103e957600080fd5b8063095ea7b311610252578063095ea7b314610323578063148b3c781461033657806315e2e9051461034957806318160ddd1461035c5780631fe543e31461036e578063238ac9331461038157600080fd5b806301ffc9a71461028f5780630675b7c6146102b757806306fdde03146102cc578063081812fc146102e157806308ed3bb41461030c575b600080fd5b6102a261029d366004612eba565b610692565b60405190151581526020015b60405180910390f35b6102ca6102c5366004612f74565b6106ff565b005b6102d461071e565b6040516102ae9190613014565b6102f46102ef366004613027565b6107b0565b6040516001600160a01b0390911681526020016102ae565b610314610840565b6040516102ae9392919061307b565b6102ca610331366004613105565b610a0d565b6102ca61034436600461313f565b610b25565b6102ca610357366004613181565b610bf2565b6001545b6040519081526020016102ae565b6102ca61037c366004613247565b610e68565b6011546102f4906001600160a01b031681565b6102ca6103a236600461328d565b610eec565b61036061271081565b6102ca6103be3660046132bd565b610ef7565b6103606103d1366004613105565b610fcd565b6102ca6103e436600461328d565b611145565b6102ca6103f7366004613374565b611160565b61036061040a366004613027565b61133e565b6102ca61041d3660046133b7565b6113a7565b6102f4610430366004613027565b611413565b61043d611420565b6040516102ae91906133eb565b6102f4610458366004613027565b611477565b6102ca61046b3660046133fe565b611489565b6102ca61047e366004612f74565b6114b3565b6102ca6104913660046133fe565b6114ce565b6103606104a43660046133fe565b6114f8565b6102ca611589565b6104e76104bf3660046133fe565b6001600160a01b03166000908152600d6020908152604080832054600e909252909120549091565b604080519283526020830191909152016102ae565b6000546001600160a01b03166102f4565b6102d461159d565b6102a26105233660046133fe565b60136020526000908152604090205460ff1681565b6102ca61054636600461341b565b6115ac565b6102a26105593660046133fe565b611671565b6102ca61167e565b6102ca610574366004613454565b6116de565b6102ca61058736600461341b565b611711565b6102ca6117be565b6102d46105a2366004613027565b6118f0565b6102a26105b53660046133fe565b60146020526000908152604090205460ff1681565b610360611a47565b6102a26105e0366004613105565b6001600160a01b039091166000908152600f60209081526040808320938352929052205460ff1690565b6103606106183660046133fe565b611a58565b6102a261062b3660046134d3565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6012546102f4906001600160a01b031681565b6102ca61067a3660046133fe565b611af6565b6102ca61068d366004613374565b611b6c565b60006001600160e01b031982166380ac58cd60e01b14806106c357506001600160e01b03198216635b5e139f60e01b145b806106de57506001600160e01b0319821663780e9d6360e01b145b806106f957506001600160e01b031982166301ffc9a760e01b145b92915050565b610707611ced565b805161071a906009906020840190612dd5565b5050565b60606002805461072d90613501565b80601f016020809104026020016040519081016040528092919081815260200182805461075990613501565b80156107a65780601f1061077b576101008083540402835291602001916107a6565b820191906000526020600020905b81548152906001019060200180831161078957829003601f168201915b5050505050905090565b60006107bd826001541190565b6108245760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60608060606000610851600b611d47565b9050806001600160401b0381111561086b5761086b612ed7565b604051908082528060200260200182016040528015610894578160200160208202803683370190505b509350806001600160401b038111156108af576108af612ed7565b6040519080825280602002602001820160405280156108d8578160200160208202803683370190505b509250806001600160401b038111156108f3576108f3612ed7565b60405190808252806020026020018201604052801561091c578160200160208202803683370190505b50915060005b81811015610a06576000610937600b83611d51565b90508086838151811061094c5761094c61353c565b60200260200101906001600160a01b031690816001600160a01b031681525050600d6000826001600160a01b03166001600160a01b03168152602001908152602001600020548583815181106109a4576109a461353c565b602002602001018181525050600e6000826001600160a01b03166001600160a01b03168152602001908152602001600020548483815181106109e8576109e861353c565b602090810291909101015250806109fe81613568565b915050610922565b5050909192565b6000610a1882611477565b9050806001600160a01b0316836001600160a01b03161415610a875760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161081b565b336001600160a01b0382161480610aa35750610aa3813361062b565b610b155760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161081b565b610b20838383611d64565b505050565b610b2d611ced565b8015610b93576001600160a01b0383166000908152600d602052604081208054849290610b5b908490613583565b90915550506001600160a01b0383166000908152600e602052604081208054849290610b88908490613583565b90915550610b209050565b6001600160a01b0383166000908152600d602052604081208054849290610bbb90849061359a565b90915550506001600160a01b0383166000908152600e602052604081208054849290610be890849061359a565b9091555050505050565b6010600281548110610c0657610c0661353c565b90600052602060002001544211610c2f5760405162461bcd60e51b815260040161081b906135b2565b6040516331a9108f60e11b8152600481018290526000906001600160a01b03841690636352211e90602401602060405180830381865afa158015610c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9b91906135d8565b90506001600160a01b038116610cf35760405162461bcd60e51b815260206004820152601d60248201527f455243373231573a62636e546f6b656e4964206e6f7420657869737473000000604482015260640161081b565b6001600160a01b0383166000908152600f6020908152604080832085845290915290205460ff1615610d675760405162461bcd60e51b815260206004820152601a60248201527f455243373231573a62636e546f6b656e49642069732075736564000000000000604482015260640161081b565b610d72600b84611dc0565b610dbe5760405162461bcd60e51b815260206004820152601960248201527f455243373231573a6e6f7420737570706f727465642062636e00000000000000604482015260640161081b565b6001600160a01b0383166000818152600f602090815260408083208684528252808320805460ff19166001179055928252600e9052908120805491610e02836135f5565b9190505550826001600160a01b0316816001600160a01b0316610e2460015490565b6040518581527ffdadaff84e30a3d7f2d7d0663dbb2c5f840ce4790f29ea017fa4b0179d0950919060200160405180910390a4610e62816001611de2565b50505050565b336001600160a01b037f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699091614610ee25760405163073e64fd60e21b81523360048201526001600160a01b037f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e6990916602482015260440161081b565b61071a8282611dfc565b610b20838383611e65565b610eff611ced565b60005b8251811015610b20576000838281518110610f1f57610f1f61353c565b602002602001015190506000838381518110610f3d57610f3d61353c565b60200260200101519050610f5b82600b6122a890919063ffffffff16565b506001600160a01b0382166000908152600d602052604081208054839290610f8490849061359a565b90915550506001600160a01b0382166000908152600e602052604081208054839290610fb190849061359a565b9250508190555050508080610fc590613568565b915050610f02565b6000610fd8836114f8565b82106110315760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161081b565b600061103c60015490565b905060008060005b838110156110e5576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561109657805192505b876001600160a01b0316836001600160a01b031614156110d257868414156110c4575093506106f992505050565b836110ce81613568565b9450505b50806110dd81613568565b915050611044565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161081b565b610b20838383604051806020016040528060008152506116de565b600033905060106001815481106111795761117961353c565b906000526020600020015442116111a25760405162461bcd60e51b815260040161081b906135b2565b604080514660208201526bffffffffffffffffffffffff1930606090811b821693830193909352653bb4b73732b960d11b60548301529183901b909116605a820152606e8101869052600090608e0160408051601f1981840301815282825280516020918201206000845290830180835281905260ff8816918301919091526060820186905260808201859052915060019060a0016020604051602081039080840390855afa158015611259573d6000803e3d6000fd5b5050604051601f1901516011546001600160a01b0390811691161490506112b35760405162461bcd60e51b815260206004820152600e60248201526d21b0ba1d39b4b3b71032b93937b960911b604482015260640161081b565b6001600160a01b03821660009081526014602052604090205460ff16156113095760405162461bcd60e51b815260206004820152600a60248201526910d85d0e9b5a5b9d195960b21b604482015260640161081b565b6001600160a01b0382166000908152601460205260409020805460ff191660011790556113368287611de2565b505050505050565b600061134960015490565b82106113a35760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161081b565b5090565b6113af611ced565b80516003146114005760405162461bcd60e51b815260206004820152601760248201527f4e46543a206172726179206c656e677468206572726f72000000000000000000604482015260640161081b565b805161071a906010906020840190612e55565b60006106f9600b83611d51565b606060108054806020026020016040519081016040528092919081815260200182805480156107a657602002820191906000526020600020905b81548152602001906001019080831161145a575050505050905090565b6000611482826122bd565b5192915050565b611491611ced565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6114bb611ced565b805161071a906008906020840190612dd5565b6114d6611ced565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166115645760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161081b565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b611591611ced565b61159b6000612428565b565b60606003805461072d90613501565b6001600160a01b0382163314156116055760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161081b565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60006106f9600b83611dc0565b612710600a541015801561169c575061271061169960015490565b10155b6116b85760405162461bcd60e51b815260040161081b9061360c565b6116c0611ced565b6127106116ce600143613583565b6116d9919040613659565b600a55565b6116e9848484611e65565b6116f584848484612478565b610e625760405162461bcd60e51b815260040161081b9061366d565b611719611ced565b801561176e5761172a600b836122a8565b61071a5760405162461bcd60e51b8152602060048201526015602482015274455243373231573a616c7265616420656e61626c6560581b604482015260640161081b565b611779600b83612577565b61071a5760405162461bcd60e51b8152602060048201526016602482015275455243373231573a616c726561642064697361626c6560501b604482015260640161081b565b612710600a54101580156117dc57506127106117d960015490565b10155b6117f85760405162461bcd60e51b815260040161081b9061360c565b611800611ced565b612710600a541015801561181d575061271061181b60015490565b145b6118395760405162461bcd60e51b815260040161081b9061360c565b6040516305d3b1d360e41b81527f8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef600482015261019b602482015260036044820152620493e060648201526001608482015273271682deb8c4e0901d1a1550ad2e64d568e6990990635d3b1d309060a4016020604051808303816000875af11580156118c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ed91906136c0565b50565b60606118fd826001541190565b6119615760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161081b565b612710600a54106119fc576008805461197990613501565b80601f01602080910402602001604051908101604052809291908181526020018280546119a590613501565b80156119f25780601f106119c7576101008083540402835291602001916119f2565b820191906000526020600020905b8154815290600101906020018083116119d557829003601f168201915b50505050506106f9565b6009611a21612710600a5485611a12919061359a565b611a1c9190613659565b61258c565b604051602001611a329291906136f5565b60405160208183030381529060405292915050565b6000611a53600b611d47565b905090565b60006001600160a01b038216611aca5760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b606482015260840161081b565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b611afe611ced565b6001600160a01b038116611b635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161081b565b6118ed81612428565b60003390506010600081548110611b8557611b8561353c565b90600052602060002001544211611bae5760405162461bcd60e51b815260040161081b906135b2565b60408051466020808301919091526bffffffffffffffffffffffff1930606090811b821684860152681dda1a5d195b1a5cdd60ba1b605485015285901b16605d83015260718083018990528351808403909101815260919092019092528051910120611c1c81868686612689565b6011546001600160a01b03908116911614611c6a5760405162461bcd60e51b815260206004820152600e60248201526d21b0ba1d39b4b3b71032b93937b960911b604482015260640161081b565b6001600160a01b03821660009081526013602052604090205460ff1615611cc05760405162461bcd60e51b815260206004820152600a60248201526910d85d0e9b5a5b9d195960b21b604482015260640161081b565b6001600160a01b0382166000908152601360205260409020805460ff191660011790556113368287611de2565b6000546001600160a01b0316331461159b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161081b565b60006106f9825490565b6000611d5d83836126b1565b9392505050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001600160a01b03811660009081526001830160205260408120541515611d5d565b61071a8282604051806020016040528060008152506126db565b612710600a5410158015611e1a5750612710611e1760015490565b10155b611e365760405162461bcd60e51b815260040161081b9061360c565b61271081600081518110611e4c57611e4c61353c565b6020026020010151611e5e9190613659565b600a555050565b6012546001600160a01b031615611f235760125460405163bc0dfbfd60e01b8152600481018390526001600160a01b039091169063bc0dfbfd90602401602060405180830381865afa158015611ebf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee3919061379c565b611f235760405162461bcd60e51b81526020600482015260116024820152701391950e9b995cdd1a5b99c81b1a5b5a5d607a1b604482015260640161081b565b6000611f2e826122bd565b80519091506000906001600160a01b0316336001600160a01b03161480611f65575033611f5a846107b0565b6001600160a01b0316145b80611f7757508151611f77903361062b565b905080611fe15760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161081b565b846001600160a01b031682600001516001600160a01b0316146120555760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161081b565b6001600160a01b0384166120b95760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161081b565b6120c96000848460000151611d64565b6001600160a01b03851660009081526005602052604081208054600192906120fb9084906001600160801b03166137b9565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092612147918591166137e1565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556121ce84600161359a565b6000818152600460205260409020549091506001600160a01b031661225f576121f8816001541190565b1561225f5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000611d5d836001600160a01b0384166129eb565b60408051808201909152600080825260208201526122dc826001541190565b61233b5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161081b565b60006032831061235e57612350603284613583565b61235b90600161359a565b90505b825b8181106123c7576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156123b457949350505050565b50806123bf816135f5565b915050612360565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b606482015260840161081b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b1561256b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906124bc90339089908890889060040161380c565b6020604051808303816000875af19250505080156124f7575060408051601f3d908101601f191682019092526124f49181019061383f565b60015b612551573d808015612525576040519150601f19603f3d011682016040523d82523d6000602084013e61252a565b606091505b5080516125495760405162461bcd60e51b815260040161081b9061366d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061256f565b5060015b949350505050565b6000611d5d836001600160a01b038416612a3a565b6060816125b05750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125da57806125c481613568565b91506125d39050600a8361385c565b91506125b4565b6000816001600160401b038111156125f4576125f4612ed7565b6040519080825280601f01601f19166020018201604052801561261e576020820181803683370190505b5090505b841561256f57612633600183613583565b9150612640600a86613659565b61264b90603061359a565b60f81b8183815181106126605761266061353c565b60200101906001600160f81b031916908160001a905350612682600a8661385c565b9450612622565b600080600061269a87878787612b2d565b915091506126a781612c1a565b5095945050505050565b60008260000182815481106126c8576126c861353c565b9060005260206000200154905092915050565b612710600154836126ec919061359a565b11156127305760405162461bcd60e51b81526020600482015260136024820152724e46543a206d6178546f74616c537570706c7960681b604482015260640161081b565b6001546001600160a01b0384166127935760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161081b565b61279e816001541190565b156127eb5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161081b565b60328311156128475760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b606482015260840161081b565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906128a39087906137e1565b6001600160801b031681526020018583602001516128c191906137e1565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156129e05760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46129a46000888488612478565b6129c05760405162461bcd60e51b815260040161081b9061366d565b816129ca81613568565b92505080806129d890613568565b915050612957565b506001555050505050565b6000818152600183016020526040812054612a32575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106f9565b5060006106f9565b60008181526001830160205260408120548015612b23576000612a5e600183613583565b8554909150600090612a7290600190613583565b9050818114612ad7576000866000018281548110612a9257612a9261353c565b9060005260206000200154905080876000018481548110612ab557612ab561353c565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612ae857612ae8613870565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106f9565b60009150506106f9565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612b645750600090506003612c11565b8460ff16601b14158015612b7c57508460ff16601c14155b15612b8d5750600090506004612c11565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612be1573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c0a57600060019250925050612c11565b9150600090505b94509492505050565b6000816004811115612c2e57612c2e613886565b1415612c375750565b6001816004811115612c4b57612c4b613886565b1415612c995760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161081b565b6002816004811115612cad57612cad613886565b1415612cfb5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161081b565b6003816004811115612d0f57612d0f613886565b1415612d685760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161081b565b6004816004811115612d7c57612d7c613886565b14156118ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161081b565b828054612de190613501565b90600052602060002090601f016020900481019282612e035760008555612e49565b82601f10612e1c57805160ff1916838001178555612e49565b82800160010185558215612e49579182015b82811115612e49578251825591602001919060010190612e2e565b506113a3929150612e8f565b828054828255906000526020600020908101928215612e495791602002820182811115612e49578251825591602001919060010190612e2e565b5b808211156113a35760008155600101612e90565b6001600160e01b0319811681146118ed57600080fd5b600060208284031215612ecc57600080fd5b8135611d5d81612ea4565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612f1557612f15612ed7565b604052919050565b60006001600160401b03831115612f3657612f36612ed7565b612f49601f8401601f1916602001612eed565b9050828152838383011115612f5d57600080fd5b828260208301376000602084830101529392505050565b600060208284031215612f8657600080fd5b81356001600160401b03811115612f9c57600080fd5b8201601f81018413612fad57600080fd5b61256f84823560208401612f1d565b60005b83811015612fd7578181015183820152602001612fbf565b83811115610e625750506000910152565b60008151808452613000816020860160208601612fbc565b601f01601f19169290920160200192915050565b602081526000611d5d6020830184612fe8565b60006020828403121561303957600080fd5b5035919050565b600081518084526020808501945080840160005b8381101561307057815187529582019590820190600101613054565b509495945050505050565b606080825284519082018190526000906020906080840190828801845b828110156130bd5781516001600160a01b031684529284019290840190600101613098565b505050838103828501526130d18187613040565b91505082810360408401526130e68185613040565b9695505050505050565b6001600160a01b03811681146118ed57600080fd5b6000806040838503121561311857600080fd5b8235613123816130f0565b946020939093013593505050565b80151581146118ed57600080fd5b60008060006060848603121561315457600080fd5b833561315f816130f0565b925060208401359150604084013561317681613131565b809150509250925092565b60008060006060848603121561319657600080fd5b8335925060208401356131a8816130f0565b929592945050506040919091013590565b60006001600160401b038211156131d2576131d2612ed7565b5060051b60200190565b600082601f8301126131ed57600080fd5b813560206132026131fd836131b9565b612eed565b82815260059290921b8401810191818101908684111561322157600080fd5b8286015b8481101561323c5780358352918301918301613225565b509695505050505050565b6000806040838503121561325a57600080fd5b8235915060208301356001600160401b0381111561327757600080fd5b613283858286016131dc565b9150509250929050565b6000806000606084860312156132a257600080fd5b83356132ad816130f0565b925060208401356131a8816130f0565b600080604083850312156132d057600080fd5b82356001600160401b03808211156132e757600080fd5b818501915085601f8301126132fb57600080fd5b8135602061330b6131fd836131b9565b82815260059290921b8401810191818101908984111561332a57600080fd5b948201945b83861015613351578535613342816130f0565b8252948201949082019061332f565b9650508601359250508082111561336757600080fd5b50613283858286016131dc565b6000806000806080858703121561338a57600080fd5b84359350602085013560ff811681146133a257600080fd5b93969395505050506040820135916060013590565b6000602082840312156133c957600080fd5b81356001600160401b038111156133df57600080fd5b61256f848285016131dc565b602081526000611d5d6020830184613040565b60006020828403121561341057600080fd5b8135611d5d816130f0565b6000806040838503121561342e57600080fd5b8235613439816130f0565b9150602083013561344981613131565b809150509250929050565b6000806000806080858703121561346a57600080fd5b8435613475816130f0565b93506020850135613485816130f0565b92506040850135915060608501356001600160401b038111156134a757600080fd5b8501601f810187136134b857600080fd5b6134c787823560208401612f1d565b91505092959194509250565b600080604083850312156134e657600080fd5b82356134f1816130f0565b91506020830135613449816130f0565b600181811c9082168061351557607f821691505b6020821081141561353657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561357c5761357c613552565b5060010190565b60008282101561359557613595613552565b500390565b600082198211156135ad576135ad613552565b500190565b6020808252600c908201526b21b0ba1d3737ba1037b832b760a11b604082015260600190565b6000602082840312156135ea57600080fd5b8151611d5d816130f0565b60008161360457613604613552565b506000190190565b6020808252601b908201527f4361743a6e6f7420736f6c64206f7574206f72206973206f70656e0000000000604082015260600190565b634e487b7160e01b600052601260045260246000fd5b60008261366857613668613643565b500690565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6000602082840312156136d257600080fd5b5051919050565b600081516136eb818560208601612fbc565b9290920192915050565b600080845481600182811c91508083168061371157607f831692505b602080841082141561373157634e487b7160e01b86526022600452602486fd5b818015613745576001811461375657613783565b60ff19861689528489019650613783565b60008b81526020902060005b8681101561377b5781548b820152908501908301613762565b505084890196505b50505050505061379381856136d9565b95945050505050565b6000602082840312156137ae57600080fd5b8151611d5d81613131565b60006001600160801b03838116908316818110156137d9576137d9613552565b039392505050565b60006001600160801b0380831681851680830382111561380357613803613552565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906130e690830184612fe8565b60006020828403121561385157600080fd5b8151611d5d81612ea4565b60008261386b5761386b613643565b500490565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fdfea26469706673582212206ac9d838d8530279966210602065423d57e8287d75f1ee9de8a105a9b0cb955764736f6c634300080b0033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000aa966d025f677b239e8d831f16cc10eadda07fb900000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000009416e6772792043617400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009416e677279204361740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f616e6772796361742e696f2f7374617469632f6769662f6f70656e2e67696600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000632e80c000000000000000000000000000000000000000000000000000000000632ed52000000000000000000000000000000000000000000000000000000000632ed520

-----Decoded View---------------
Arg [0] : name_ (string): Angry Cat
Arg [1] : symbol_ (string): Angry Cat
Arg [2] : boxUri_ (string): https://angrycat.io/static/gif/open.gif
Arg [3] : signer_ (address): 0xAA966d025f677B239E8d831f16cc10eADDa07fB9
Arg [4] : startTimes (uint256[]): 1663992000,1664013600,1664013600

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 000000000000000000000000aa966d025f677b239e8d831f16cc10eadda07fb9
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [6] : 416e677279204361740000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [8] : 416e677279204361740000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000027
Arg [10] : 68747470733a2f2f616e6772796361742e696f2f7374617469632f6769662f6f
Arg [11] : 70656e2e67696600000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [13] : 00000000000000000000000000000000000000000000000000000000632e80c0
Arg [14] : 00000000000000000000000000000000000000000000000000000000632ed520
Arg [15] : 00000000000000000000000000000000000000000000000000000000632ed520


Deployed Bytecode Sourcemap

51625:15270:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54200:321;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;54200:321:0;;;;;;;;62216:100;;;;;;:::i;:::-;;:::i;:::-;;55681:94;;;:::i;:::-;;;;;;;:::i;56549:202::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2994:32:1;;;2976:51;;2964:2;2949:18;56549:202:0;2830:203:1;65875:516:0;;;:::i;:::-;;;;;;;;;:::i;56197:346::-;;;;;;:::i;:::-;;:::i;64515:310::-;;;;;;:::i;:::-;;:::i;63212:629::-;;;;;;:::i;:::-;;:::i;53191:94::-;53267:12;;53191:94;;;6088:25:1;;;6076:2;6061:18;53191:94:0;5942:177:1;27294:261:0;;;;;;:::i;:::-;;:::i;52777:21::-;;;;;-1:-1:-1;;;;;52777:21:0;;;57198:122;;;;;;:::i;:::-;;:::i;52419:46::-;;52460:5;52419:46;;63853:371;;;;;;:::i;:::-;;:::i;53474:720::-;;;;;;:::i;:::-;;:::i;57326:137::-;;;;;;:::i;:::-;;:::i;65364:499::-;;;;;;:::i;:::-;;:::i;53291:177::-;;;;;;:::i;:::-;;:::i;66516:182::-;;;;;;:::i;:::-;;:::i;62563:137::-;;;;;;:::i;:::-;;:::i;66403:101::-;;;:::i;:::-;;;;;;;:::i;55557:118::-;;;;;;:::i;:::-;;:::i;66811:81::-;;;;;;:::i;:::-;;:::i;62324:92::-;;;;;;:::i;:::-;;:::i;66710:89::-;;;;;;:::i;:::-;;:::i;54527:211::-;;;;;;:::i;:::-;;:::i;30354:103::-;;;:::i;62712:167::-;;;;;;:::i;:::-;-1:-1:-1;;;;;62833:17:0;62781:13;62833:17;;;:12;:17;;;;;;;;;62852:13;:18;;;;;;;62833:17;;62712:167;;;;;10605:25:1;;;10661:2;10646:18;;10639:34;;;;10578:18;62712:167:0;10431:248:1;29706:87:0;29752:7;29779:6;-1:-1:-1;;;;;29779:6:0;29706:87;;55781:98;;;:::i;52827:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;56757:272;;;;;;:::i;:::-;;:::i;62891:137::-;;;;;;:::i;:::-;;:::i;62078:130::-;;;:::i;57469:265::-;;;;;;:::i;:::-;;:::i;64236:267::-;;;;;;:::i;:::-;;:::i;61724:346::-;;;:::i;55885:304::-;;;;;;:::i;:::-;;:::i;52879:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;62424:127;;;:::i;63040:160::-;;;;;;:::i;:::-;-1:-1:-1;;;;;63158:22:0;;;63130:9;63158:22;;;:17;:22;;;;;;;;:34;;;;;;;;;;;63040:160;54744:218;;;;;;:::i;:::-;;:::i;57035:157::-;;;;;;:::i;:::-;-1:-1:-1;;;;;57151:25:0;;;57132:4;57151:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;57035:157;52803:19;;;;;-1:-1:-1;;;;;52803:19:0;;;30612:201;;;;;;:::i;:::-;;:::i;64837:515::-;;;;;;:::i;:::-;;:::i;54200:321::-;54285:4;-1:-1:-1;;;;;;54304:40:0;;-1:-1:-1;;;54304:40:0;;:99;;-1:-1:-1;;;;;;;54355:48:0;;-1:-1:-1;;;54355:48:0;54304:99;:160;;;-1:-1:-1;;;;;;;54414:50:0;;-1:-1:-1;;;54414:50:0;54304:160;:211;;;-1:-1:-1;;;;;;;54475:40:0;;-1:-1:-1;;;54475:40:0;54304:211;54297:218;54200:321;-1:-1:-1;;54200:321:0:o;62216:100::-;29592:13;:11;:13::i;:::-;62289:21;;::::1;::::0;:9:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;62216:100:::0;:::o;55681:94::-;55735:13;55764:5;55757:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55681:94;:::o;56549:202::-;56617:7;56641:16;56649:7;57827:12;;-1:-1:-1;57817:22:0;57740:105;56641:16;56633:74;;;;-1:-1:-1;;;56633:74:0;;12851:2:1;56633:74:0;;;12833:21:1;12890:2;12870:18;;;12863:30;12929:34;12909:18;;;12902:62;-1:-1:-1;;;12980:18:1;;;12973:43;13033:19;;56633:74:0;;;;;;;;;-1:-1:-1;56721:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;56721:24:0;;56549:202::o;65875:516::-;65919:21;65942:23;65967:27;66006:11;66020:23;:14;:21;:23::i;:::-;66006:37;;66075:3;-1:-1:-1;;;;;66061:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66061:18:0;;66054:25;;66113:3;-1:-1:-1;;;;;66099:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66099:18:0;;66090:27;;66155:3;-1:-1:-1;;;;;66141:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66141:18:0;;66128:31;;66174:9;66170:214;66193:3;66189:1;:7;66170:214;;;66217:11;66231:20;:14;66249:1;66231:17;:20::i;:::-;66217:34;;66276:3;66266:4;66271:1;66266:7;;;;;;;;:::i;:::-;;;;;;:13;-1:-1:-1;;;;;66266:13:0;;;-1:-1:-1;;;;;66266:13:0;;;;;66306:12;:17;66319:3;-1:-1:-1;;;;;66306:17:0;-1:-1:-1;;;;;66306:17:0;;;;;;;;;;;;;66294:6;66301:1;66294:9;;;;;;;;:::i;:::-;;;;;;:29;;;;;66354:13;:18;66368:3;-1:-1:-1;;;;;66354:18:0;-1:-1:-1;;;;;66354:18:0;;;;;;;;;;;;;66338:10;66349:1;66338:13;;;;;;;;:::i;:::-;;;;;;;;;;:34;-1:-1:-1;66198:3:0;;;;:::i;:::-;;;;66170:214;;;;65995:396;65875:516;;;:::o;56197:346::-;56266:13;56282:16;56290:7;56282;:16::i;:::-;56266:32;;56319:5;-1:-1:-1;;;;;56313:11:0;:2;-1:-1:-1;;;;;56313:11:0;;;56305:58;;;;-1:-1:-1;;;56305:58:0;;13669:2:1;56305:58:0;;;13651:21:1;13708:2;13688:18;;;13681:30;13747:34;13727:18;;;13720:62;-1:-1:-1;;;13798:18:1;;;13791:32;13840:19;;56305:58:0;13467:398:1;56305:58:0;28328:10;-1:-1:-1;;;;;56378:21:0;;;;:62;;-1:-1:-1;56403:37:0;56420:5;28328:10;57035:157;:::i;56403:37::-;56370:132;;;;-1:-1:-1;;;56370:132:0;;14072:2:1;56370:132:0;;;14054:21:1;14111:2;14091:18;;;14084:30;14150:34;14130:18;;;14123:62;14221:27;14201:18;;;14194:55;14266:19;;56370:132:0;13870:421:1;56370:132:0;56509:28;56518:2;56522:7;56531:5;56509:8;:28::i;:::-;56259:284;56197:346;;:::o;64515:310::-;29592:13;:11;:13::i;:::-;64606:5:::1;64603:215;;;-1:-1:-1::0;;;;;64627:17:0;::::1;;::::0;;;:12:::1;:17;::::0;;;;:29;;64648:8;;64627:17;:29:::1;::::0;64648:8;;64627:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;64671:18:0;::::1;;::::0;;;:13:::1;:18;::::0;;;;:30;;64693:8;;64671:18;:30:::1;::::0;64693:8;;64671:30:::1;:::i;:::-;::::0;;;-1:-1:-1;64603:215:0::1;::::0;-1:-1:-1;64603:215:0::1;;-1:-1:-1::0;;;;;64732:17:0;::::1;;::::0;;;:12:::1;:17;::::0;;;;:29;;64753:8;;64732:17;:29:::1;::::0;64753:8;;64732:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;64776:18:0;::::1;;::::0;;;:13:::1;:18;::::0;;;;:30;;64798:8;;64776:18;:30:::1;::::0;64798:8;;64776:30:::1;:::i;:::-;::::0;;;-1:-1:-1;;64515:310:0;;;:::o;63212:629::-;63343:11;63355:1;63343:14;;;;;;;;:::i;:::-;;;;;;;;;63317:15;:41;63309:66;;;;-1:-1:-1;;;63309:66:0;;;;;;;:::i;:::-;63399:32;;-1:-1:-1;;;63399:32:0;;;;;6088:25:1;;;63386:10:0;;-1:-1:-1;;;;;63399:20:0;;;;;6061:18:1;;63399:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63386:45;-1:-1:-1;;;;;;63450:16:0;;63442:58;;;;-1:-1:-1;;;63442:58:0;;15358:2:1;63442:58:0;;;15340:21:1;15397:2;15377:18;;;15370:30;15436:31;15416:18;;;15409:59;15485:18;;63442:58:0;15156:353:1;63442:58:0;-1:-1:-1;;;;;63520:22:0;;;;;;:17;:22;;;;;;;;:34;;;;;;;;;;;63519:35;63511:74;;;;-1:-1:-1;;;63511:74:0;;15716:2:1;63511:74:0;;;15698:21:1;15755:2;15735:18;;;15728:30;15794:28;15774:18;;;15767:56;15840:18;;63511:74:0;15514:350:1;63511:74:0;63604:28;:14;63628:3;63604:23;:28::i;:::-;63596:66;;;;-1:-1:-1;;;63596:66:0;;16071:2:1;63596:66:0;;;16053:21:1;16110:2;16090:18;;;16083:30;16149:27;16129:18;;;16122:55;16194:18;;63596:66:0;15869:349:1;63596:66:0;-1:-1:-1;;;;;63673:22:0;;;;;;:17;:22;;;;;;;;:34;;;;;;;;:41;;-1:-1:-1;;63673:41:0;63710:4;63673:41;;;63725:18;;;:13;:18;;;;;:20;;;;;;:::i;:::-;;;;;;63790:3;-1:-1:-1;;;;;63761:45:0;63786:2;-1:-1:-1;;;;;63761:45:0;63771:13;53267:12;;;53191:94;63771:13;63761:45;;6088:25:1;;;63761:45:0;;6076:2:1;6061:18;63761:45:0;;;;;;;63817:16;63827:2;63831:1;63817:9;:16::i;:::-;63298:543;63212:629;;;:::o;27294:261::-;27394:10;-1:-1:-1;;;;;27408:14:0;27394:28;;27390:111;;27440:53;;-1:-1:-1;;;27440:53:0;;27466:10;27440:53;;;16576:34:1;-1:-1:-1;;;;;27478:14:0;16646:15:1;16626:18;;;16619:43;16511:18;;27440:53:0;16364:304:1;27390:111:0;27507:42;27526:9;27537:11;27507:18;:42::i;57198:122::-;57286:28;57296:4;57302:2;57306:7;57286:9;:28::i;63853:371::-;29592:13;:11;:13::i;:::-;63959:9:::1;63955:262;63978:4;:11;63974:1;:15;63955:262;;;64010:11;64024:4;64029:1;64024:7;;;;;;;;:::i;:::-;;;;;;;64010:21;;64046:16;64065:10;64076:1;64065:13;;;;;;;;:::i;:::-;;;;;;;64046:32;;64093:23;64112:3;64093:14;:18;;:23;;;;:::i;:::-;-1:-1:-1::0;;;;;;64131:17:0;::::1;;::::0;;;:12:::1;:17;::::0;;;;:29;;64152:8;;64131:17;:29:::1;::::0;64152:8;;64131:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;64175:18:0;::::1;;::::0;;;:13:::1;:18;::::0;;;;:30;;64197:8;;64175:18;:30:::1;::::0;64197:8;;64175:30:::1;:::i;:::-;;;;;;;;63995:222;;63991:3;;;;;:::i;:::-;;;;63955:262;;53474:720:::0;53563:7;53594:16;53604:5;53594:9;:16::i;:::-;53586:5;:24;53578:71;;;;-1:-1:-1;;;53578:71:0;;16875:2:1;53578:71:0;;;16857:21:1;16914:2;16894:18;;;16887:30;16953:34;16933:18;;;16926:62;-1:-1:-1;;;17004:18:1;;;16997:32;17046:19;;53578:71:0;16673:398:1;53578:71:0;53656:22;53681:13;53267:12;;;53191:94;53681:13;53656:38;;53701:19;53731:25;53781:9;53776:350;53800:14;53796:1;:18;53776:350;;;53830:31;53864:14;;;:11;:14;;;;;;;;;53830:48;;;;;;;;;-1:-1:-1;;;;;53830:48:0;;;;;-1:-1:-1;;;53830:48:0;;;-1:-1:-1;;;;;53830:48:0;;;;;;;;53891:28;53887:89;;53952:14;;;-1:-1:-1;53887:89:0;54009:5;-1:-1:-1;;;;;53988:26:0;:17;-1:-1:-1;;;;;53988:26:0;;53984:135;;;54046:5;54031:11;:20;54027:59;;;-1:-1:-1;54073:1:0;-1:-1:-1;54066:8:0;;-1:-1:-1;;;54066:8:0;54027:59;54096:13;;;;:::i;:::-;;;;53984:135;-1:-1:-1;53816:3:0;;;;:::i;:::-;;;;53776:350;;;-1:-1:-1;54132:56:0;;-1:-1:-1;;;54132:56:0;;17278:2:1;54132:56:0;;;17260:21:1;17317:2;17297:18;;;17290:30;17356:34;17336:18;;;17329:62;-1:-1:-1;;;17407:18:1;;;17400:44;17461:19;;54132:56:0;17076:410:1;57326:137:0;57418:39;57435:4;57441:2;57445:7;57418:39;;;;;;;;;;;;:16;:39::i;65364:499::-;65455:10;28328;65455:25;;65525:11;65537:1;65525:14;;;;;;;;:::i;:::-;;;;;;;;;65499:15;:41;65491:66;;;;-1:-1:-1;;;65491:66:0;;;;;;;:::i;:::-;65593:70;;;65610:13;65593:70;;;17805:19:1;-1:-1:-1;;65633:4:0;17912:2:1;17908:15;;;17904:24;;17890:12;;;17883:46;;;;-1:-1:-1;;;17945:12:1;;;17938:30;18002:15;;;;17998:24;;;17984:12;;;17977:46;18039:12;;;18032:28;;;65568:12:0;;18076:13:1;;65593:70:0;;;-1:-1:-1;;65593:70:0;;;;;;;;;65583:81;;65593:70;65583:81;;;;65693:24;;;;;;;;;18327:25:1;;;18400:4;18388:17;;18368:18;;;18361:45;;;;18422:18;;;18415:34;;;18465:18;;;18458:34;;;65583:81:0;-1:-1:-1;65693:24:0;;18299:19:1;;65693:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65693:24:0;;-1:-1:-1;;65693:24:0;;65683:6;;-1:-1:-1;;;;;65683:6:0;;;:34;;;;-1:-1:-1;65675:61:0;;;;-1:-1:-1;;;65675:61:0;;18705:2:1;65675:61:0;;;18687:21:1;18744:2;18724:18;;;18717:30;-1:-1:-1;;;18763:18:1;;;18756:44;18817:18;;65675:61:0;18503:338:1;65675:61:0;-1:-1:-1;;;;;65756:16:0;;;;;;:12;:16;;;;;;;;65755:17;65747:40;;;;-1:-1:-1;;;65747:40:0;;19048:2:1;65747:40:0;;;19030:21:1;19087:2;19067:18;;;19060:30;-1:-1:-1;;;19106:18:1;;;19099:40;19156:18;;65747:40:0;18846:334:1;65747:40:0;-1:-1:-1;;;;;65798:16:0;;;;;;:12;:16;;;;;:23;;-1:-1:-1;;65798:23:0;65817:4;65798:23;;;65832;65811:2;65846:8;65832:9;:23::i;:::-;65444:419;;65364:499;;;;:::o;53291:177::-;53358:7;53390:13;53267:12;;;53191:94;53390:13;53382:5;:21;53374:69;;;;-1:-1:-1;;;53374:69:0;;19387:2:1;53374:69:0;;;19369:21:1;19426:2;19406:18;;;19399:30;19465:34;19445:18;;;19438:62;-1:-1:-1;;;19516:18:1;;;19509:33;19559:19;;53374:69:0;19185:399:1;53374:69:0;-1:-1:-1;53457:5:0;53291:177::o;66516:182::-;29592:13;:11;:13::i;:::-;66605:10:::1;:17;66626:1;66605:22;66597:58;;;::::0;-1:-1:-1;;;66597:58:0;;19791:2:1;66597:58:0::1;::::0;::::1;19773:21:1::0;19830:2;19810:18;;;19803:30;19869:25;19849:18;;;19842:53;19912:18;;66597:58:0::1;19589:347:1::0;66597:58:0::1;66666:24:::0;;::::1;::::0;:11:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;62563:137::-:0;62638:11;62668:24;:14;62686:5;62668:17;:24::i;66403:101::-;66450:16;66485:11;66478:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66403:101;:::o;55557:118::-;55621:7;55644:20;55656:7;55644:11;:20::i;:::-;:25;;55557:118;-1:-1:-1;;55557:118:0:o;66811:81::-;29592:13;:11;:13::i;:::-;66872:4:::1;:12:::0;;-1:-1:-1;;;;;;66872:12:0::1;-1:-1:-1::0;;;;;66872:12:0;;;::::1;::::0;;;::::1;::::0;;66811:81::o;62324:92::-;29592:13;:11;:13::i;:::-;62393:17;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;66710:89::-:0;29592:13;:11;:13::i;:::-;66775:6:::1;:16:::0;;-1:-1:-1;;;;;;66775:16:0::1;-1:-1:-1::0;;;;;66775:16:0;;;::::1;::::0;;;::::1;::::0;;66710:89::o;54527:211::-;54591:7;-1:-1:-1;;;;;54615:19:0;;54607:75;;;;-1:-1:-1;;;54607:75:0;;20143:2:1;54607:75:0;;;20125:21:1;20182:2;20162:18;;;20155:30;20221:34;20201:18;;;20194:62;-1:-1:-1;;;20272:18:1;;;20265:41;20323:19;;54607:75:0;19941:407:1;54607:75:0;-1:-1:-1;;;;;;54704:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;54704:27:0;;54527:211::o;30354:103::-;29592:13;:11;:13::i;:::-;30419:30:::1;30446:1;30419:18;:30::i;:::-;30354:103::o:0;55781:98::-;55837:13;55866:7;55859:14;;;;;:::i;56757:272::-;-1:-1:-1;;;;;56848:24:0;;28328:10;56848:24;;56840:63;;;;-1:-1:-1;;;56840:63:0;;20555:2:1;56840:63:0;;;20537:21:1;20594:2;20574:18;;;20567:30;20633:28;20613:18;;;20606:56;20679:18;;56840:63:0;20353:350:1;56840:63:0;28328:10;56910:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;56910:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;56910:53:0;;;;;;;;;;56975:48;;540:41:1;;;56910:42:0;;28328:10;56975:48;;513:18:1;56975:48:0;;;;;;;56757:272;;:::o;62891:137::-;62959:14;62992:28;:14;63016:3;62992:23;:28::i;62078:130::-;52460:5;61442:10;;:28;;:63;;;;;52460:5;61474:13;53267:12;;;53191:94;61474:13;:31;;61442:63;61434:103;;;;-1:-1:-1;;;61434:103:0;;;;;;;:::i;:::-;29592:13:::1;:11;:13::i;:::-;52460:5:::2;62167:16;62182:1;62167:12;:16;:::i;:::-;62149:53;::::0;;62157:27:::2;62149:53;:::i;:::-;62136:10;:66:::0;62078:130::o;57469:265::-;57581:28;57591:4;57597:2;57601:7;57581:9;:28::i;:::-;57624:48;57647:4;57653:2;57657:7;57666:5;57624:22;:48::i;:::-;57616:112;;;;-1:-1:-1;;;57616:112:0;;;;;;;:::i;64236:267::-;29592:13;:11;:13::i;:::-;64313:6:::1;64310:186;;;64343:23;:14;64362:3:::0;64343:18:::1;:23::i;:::-;64335:57;;;::::0;-1:-1:-1;;;64335:57:0;;21935:2:1;64335:57:0::1;::::0;::::1;21917:21:1::0;21974:2;21954:18;;;21947:30;-1:-1:-1;;;21993:18:1;;;21986:51;22054:18;;64335:57:0::1;21733:345:1::0;64310:186:0::1;64431:26;:14;64453:3:::0;64431:21:::1;:26::i;:::-;64423:61;;;::::0;-1:-1:-1;;;64423:61:0;;22285:2:1;64423:61:0::1;::::0;::::1;22267:21:1::0;22324:2;22304:18;;;22297:30;-1:-1:-1;;;22343:18:1;;;22336:52;22405:18;;64423:61:0::1;22083:346:1::0;61724::0;52460:5;61442:10;;:28;;:63;;;;;52460:5;61474:13;53267:12;;;53191:94;61474:13;:31;;61442:63;61434:103;;;;-1:-1:-1;;;61434:103:0;;;;;;;:::i;:::-;29592:13:::1;:11;:13::i;:::-;52460:5:::2;61789:10;;:28;;:63;;;;;52460:5;61821:13;53267:12:::0;;;53191:94;61821:13:::2;:31;61789:63;61781:103;;;;-1:-1:-1::0;;;61781:103:0::2;;;;;;;:::i;:::-;61893:171;::::0;-1:-1:-1;;;61893:171:0;;61982:66:::2;61893:171;::::0;::::2;22812:25:1::0;62049:3:0::2;22853:18:1::0;;;22846:59;62053:1:0::2;22921:18:1::0;;;22914:47;62055:6:0::2;23006:18:1::0;;;22999:43;62062:1:0::2;23058:19:1::0;;;23051:44;61919:42:0::2;::::0;61893:88:::2;::::0;22784:19:1;;61893:171:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61724:346::o:0;55885:304::-;55958:13;55987:16;55995:7;57827:12;;-1:-1:-1;57817:22:0;57740:105;55987:16;55979:76;;;;-1:-1:-1;;;55979:76:0;;23497:2:1;55979:76:0;;;23479:21:1;23536:2;23516:18;;;23509:30;23575:34;23555:18;;;23548:62;-1:-1:-1;;;23626:18:1;;;23619:45;23681:19;;55979:76:0;23295:411:1;55979:76:0;56082:5;56069:10;;:18;:114;;56176:7;56069:114;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56114:9;56125:46;56165:5;56151:10;;56143:7;:18;;;;:::i;:::-;56142:28;;;;:::i;:::-;56125:16;:46::i;:::-;56097:75;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56062:121;55885:304;-1:-1:-1;;55885:304:0:o;62424:127::-;62487:14;62520:23;:14;:21;:23::i;:::-;62513:30;;62424:127;:::o;54744:218::-;54804:7;-1:-1:-1;;;;;54828:19:0;;54820:81;;;;-1:-1:-1;;;54820:81:0;;25408:2:1;54820:81:0;;;25390:21:1;25447:2;25427:18;;;25420:30;25486:34;25466:18;;;25459:62;-1:-1:-1;;;25537:18:1;;;25530:47;25594:19;;54820:81:0;25206:413:1;54820:81:0;-1:-1:-1;;;;;;54923:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;54923:32:0;;-1:-1:-1;;;;;54923:32:0;;54744:218::o;30612:201::-;29592:13;:11;:13::i;:::-;-1:-1:-1;;;;;30701:22:0;::::1;30693:73;;;::::0;-1:-1:-1;;;30693:73:0;;25826:2:1;30693:73:0::1;::::0;::::1;25808:21:1::0;25865:2;25845:18;;;25838:30;25904:34;25884:18;;;25877:62;-1:-1:-1;;;25955:18:1;;;25948:36;26001:19;;30693:73:0::1;25624:402:1::0;30693:73:0::1;30777:28;30796:8;30777:18;:28::i;64837:515::-:0;64931:10;28328;64931:25;;65001:11;65013:1;65001:14;;;;;;;;:::i;:::-;;;;;;;;;64975:15;:41;64967:66;;;;-1:-1:-1;;;64967:66:0;;;;;;;:::i;:::-;65069:73;;;65086:13;65069:73;;;;26345:19:1;;;;-1:-1:-1;;65109:4:0;26452:2:1;26448:15;;;26444:24;;26430:12;;;26423:46;-1:-1:-1;;;26485:12:1;;;26478:33;26545:15;;;26541:24;26527:12;;;26520:46;26582:12;;;;26575:28;;;65069:73:0;;;;;;;;;;26619:13:1;;;;65069:73:0;;;65059:84;;;;;65172:28;65059:84;65192:1;65195;65198;65172:13;:28::i;:::-;65162:6;;-1:-1:-1;;;;;65162:6:0;;;:38;;;65154:65;;;;-1:-1:-1;;;65154:65:0;;18705:2:1;65154:65:0;;;18687:21:1;18744:2;18724:18;;;18717:30;-1:-1:-1;;;18763:18:1;;;18756:44;18817:18;;65154:65:0;18503:338:1;65154:65:0;-1:-1:-1;;;;;65239:19:0;;;;;;:15;:19;;;;;;;;65238:20;65230:43;;;;-1:-1:-1;;;65230:43:0;;19048:2:1;65230:43:0;;;19030:21:1;19087:2;19067:18;;;19060:30;-1:-1:-1;;;19106:18:1;;;19099:40;19156:18;;65230:43:0;18846:334:1;65230:43:0;-1:-1:-1;;;;;65284:19:0;;;;;;:15;:19;;;;;:26;;-1:-1:-1;;65284:26:0;65306:4;65284:26;;;65321:23;65300:2;65335:8;65321:9;:23::i;29871:132::-;29752:7;29779:6;-1:-1:-1;;;;;29779:6:0;28328:10;29935:23;29927:68;;;;-1:-1:-1;;;29927:68:0;;26845:2:1;29927:68:0;;;26827:21:1;;;26864:18;;;26857:30;26923:34;26903:18;;;26896:62;26975:18;;29927:68:0;26643:356:1;9130:117:0;9193:7;9220:19;9228:3;4614:18;;4531:109;9601:158;9675:7;9726:22;9730:3;9742:5;9726:3;:22::i;:::-;9718:31;9601:158;-1:-1:-1;;;9601:158:0:o;60569:152::-;60646:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;60646:29:0;-1:-1:-1;;;;;60646:29:0;;;;;;;;;60687:28;;60646:24;;60687:28;;;;;;;60569:152;;;:::o;8877:167::-;-1:-1:-1;;;;;9011:23:0;;8957:4;4413:19;;;:12;;;:19;;;;;;:24;;8981:55;4316:129;57851:98;57916:27;57926:2;57930:8;57916:27;;;;;;;;;;;;:9;:27::i;61561:153::-;52460:5;61442:10;;:28;;:63;;;;;52460:5;61474:13;53267:12;;;53191:94;61474:13;:31;;61442:63;61434:103;;;;-1:-1:-1;;;61434:103:0;;;;;;;:::i;:::-;52460:5:::1;61677:11;61689:1;61677:14;;;;;;;;:::i;:::-;;;;;;;:31;;;;:::i;:::-;61664:10;:44:::0;-1:-1:-1;;61561:153:0:o;59112:1451::-;59192:4;;-1:-1:-1;;;;;59192:4:0;:18;59189:107;;59234:4;;59228:36;;-1:-1:-1;;;59228:36:0;;;;;6088:25:1;;;-1:-1:-1;;;;;59234:4:0;;;;59228:27;;6061:18:1;;59228:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59220:66;;;;-1:-1:-1;;;59220:66:0;;27456:2:1;59220:66:0;;;27438:21:1;27495:2;27475:18;;;27468:30;-1:-1:-1;;;27514:18:1;;;27507:47;27571:18;;59220:66:0;27254:341:1;59220:66:0;59302:35;59340:20;59352:7;59340:11;:20::i;:::-;59409:18;;59302:58;;-1:-1:-1;59367:22:0;;-1:-1:-1;;;;;59393:34:0;28328:10;-1:-1:-1;;;;;59393:34:0;;:74;;;-1:-1:-1;28328:10:0;59431:20;59443:7;59431:11;:20::i;:::-;-1:-1:-1;;;;;59431:36:0;;59393:74;:128;;;-1:-1:-1;59488:18:0;;59471:50;;28328:10;57035:157;:::i;59471:50::-;59367:155;;59537:17;59529:80;;;;-1:-1:-1;;;59529:80:0;;27802:2:1;59529:80:0;;;27784:21:1;27841:2;27821:18;;;27814:30;27880:34;27860:18;;;27853:62;-1:-1:-1;;;27931:18:1;;;27924:48;27989:19;;59529:80:0;27600:414:1;59529:80:0;59646:4;-1:-1:-1;;;;;59624:26:0;:13;:18;;;-1:-1:-1;;;;;59624:26:0;;59616:77;;;;-1:-1:-1;;;59616:77:0;;28221:2:1;59616:77:0;;;28203:21:1;28260:2;28240:18;;;28233:30;28299:34;28279:18;;;28272:62;-1:-1:-1;;;28350:18:1;;;28343:36;28396:19;;59616:77:0;28019:402:1;59616:77:0;-1:-1:-1;;;;;59708:16:0;;59700:66;;;;-1:-1:-1;;;59700:66:0;;28628:2:1;59700:66:0;;;28610:21:1;28667:2;28647:18;;;28640:30;28706:34;28686:18;;;28679:62;-1:-1:-1;;;28757:18:1;;;28750:35;28802:19;;59700:66:0;28426:401:1;59700:66:0;59821:49;59838:1;59842:7;59851:13;:18;;;59821:8;:49::i;:::-;-1:-1:-1;;;;;59877:18:0;;;;;;:12;:18;;;;;:31;;59907:1;;59877:18;:31;;59907:1;;-1:-1:-1;;;;;59877:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;59877:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;59915:16:0;;-1:-1:-1;59915:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;59915:16:0;;:29;;-1:-1:-1;;59915:29:0;;:::i;:::-;;;-1:-1:-1;;;;;59915:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59974:43:0;;;;;;;;-1:-1:-1;;;;;59974:43:0;;;;;-1:-1:-1;;;;;60000:15:0;59974:43;;;;;;;;;-1:-1:-1;59951:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;59951:66:0;-1:-1:-1;;;;;;59951:66:0;;;;;;;;;;;60265:11;59963:7;-1:-1:-1;60265:11:0;:::i;:::-;60328:1;60287:24;;;:11;:24;;;;;:29;60243:33;;-1:-1:-1;;;;;;60287:29:0;60283:236;;60345:20;60353:11;57827:12;;-1:-1:-1;57817:22:0;57740:105;60345:20;60341:171;;;60405:97;;;;;;;;60432:18;;-1:-1:-1;;;;;60405:97:0;;;;;;60463:28;;;;-1:-1:-1;;;;;60405:97:0;;;;;;;;;-1:-1:-1;60378:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;60378:124:0;-1:-1:-1;;;;;;60378:124:0;;;;;;;;;;;;60341:171;60549:7;60545:2;-1:-1:-1;;;;;60530:27:0;60539:4;-1:-1:-1;;;;;60530:27:0;;;;;;;;;;;59182:1381;;;59112:1451;;;:::o;8305:152::-;8375:4;8399:50;8404:3;-1:-1:-1;;;;;8424:23:0;;8399:4;:50::i;54968:581::-;-1:-1:-1;;;;;;;;;;;;;;;;;55066:16:0;55074:7;57827:12;;-1:-1:-1;57817:22:0;57740:105;55066:16;55058:71;;;;-1:-1:-1;;;55058:71:0;;29543:2:1;55058:71:0;;;29525:21:1;29582:2;29562:18;;;29555:30;29621:34;29601:18;;;29594:62;-1:-1:-1;;;29672:18:1;;;29665:40;29722:19;;55058:71:0;29341:406:1;55058:71:0;55136:26;52056:2;55173:7;:23;55169:93;;55228:22;52056:2;55228:7;:22;:::i;:::-;:26;;55253:1;55228:26;:::i;:::-;55207:47;;55169:93;55288:7;55268:212;55305:18;55297:4;:26;55268:212;;55342:31;55376:17;;;:11;:17;;;;;;;;;55342:51;;;;;;;;;-1:-1:-1;;;;;55342:51:0;;;;;-1:-1:-1;;;55342:51:0;;;-1:-1:-1;;;;;55342:51:0;;;;;;;;55406:28;55402:71;;55454:9;54968:581;-1:-1:-1;;;;54968:581:0:o;55402:71::-;-1:-1:-1;55325:6:0;;;;:::i;:::-;;;;55268:212;;;-1:-1:-1;55486:57:0;;-1:-1:-1;;;55486:57:0;;29954:2:1;55486:57:0;;;29936:21:1;29993:2;29973:18;;;29966:30;30032:34;30012:18;;;30005:62;-1:-1:-1;;;30083:18:1;;;30076:45;30138:19;;55486:57:0;29752:411:1;30973:191:0;31047:16;31066:6;;-1:-1:-1;;;;;31083:17:0;;;-1:-1:-1;;;;;;31083:17:0;;;;;;31116:40;;31066:6;;;;;;;31116:40;;31047:16;31116:40;31036:128;30973:191;:::o;60729:668::-;60841:4;-1:-1:-1;;;;;60858:14:0;;;:18;60854:538;;60900:72;;-1:-1:-1;;;60900:72:0;;-1:-1:-1;;;;;60900:36:0;;;;;:72;;28328:10;;60951:4;;60957:7;;60966:5;;60900:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60900:72:0;;;;;;;;-1:-1:-1;;60900:72:0;;;;;;;;;;;;:::i;:::-;;;60887:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61131:13:0;;61127:215;;61164:61;;-1:-1:-1;;;61164:61:0;;;;;;;:::i;61127:215::-;61310:6;61304:13;61295:6;61291:2;61287:15;61280:38;60887:464;-1:-1:-1;;;;;;61022:55:0;-1:-1:-1;;;61022:55:0;;-1:-1:-1;61015:62:0;;60854:538;-1:-1:-1;61380:4:0;60854:538;60729:668;;;;;;:::o;8633:158::-;8706:4;8730:53;8738:3;-1:-1:-1;;;;;8758:23:0;;8730:7;:53::i;31610:723::-;31666:13;31887:10;31883:53;;-1:-1:-1;;31914:10:0;;;;;;;;;;;;-1:-1:-1;;;31914:10:0;;;;;31610:723::o;31883:53::-;31961:5;31946:12;32002:78;32009:9;;32002:78;;32035:8;;;;:::i;:::-;;-1:-1:-1;32058:10:0;;-1:-1:-1;32066:2:0;32058:10;;:::i;:::-;;;32002:78;;;32090:19;32122:6;-1:-1:-1;;;;;32112:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32112:17:0;;32090:39;;32140:154;32147:10;;32140:154;;32174:11;32184:1;32174:11;;:::i;:::-;;-1:-1:-1;32243:10:0;32251:2;32243:5;:10;:::i;:::-;32230:24;;:2;:24;:::i;:::-;32217:39;;32200:6;32207;32200:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;32200:56:0;;;;;;;;-1:-1:-1;32271:11:0;32280:2;32271:11;;:::i;:::-;;;32140:154;;40765:279;40893:7;40914:17;40933:18;40955:25;40966:4;40972:1;40975;40978;40955:10;:25::i;:::-;40913:67;;;;40991:18;41003:5;40991:11;:18::i;:::-;-1:-1:-1;41027:9:0;40765:279;-1:-1:-1;;;;;40765:279:0:o;4994:120::-;5061:7;5088:3;:11;;5100:5;5088:18;;;;;;;;:::i;:::-;;;;;;;;;5081:25;;4994:120;;;;:::o;57955:1151::-;58075:5;58059:12;;58048:8;:23;;;;:::i;:::-;:32;;58040:64;;;;-1:-1:-1;;;58040:64:0;;31254:2:1;58040:64:0;;;31236:21:1;31293:2;31273:18;;;31266:30;-1:-1:-1;;;31312:18:1;;;31305:49;31371:18;;58040:64:0;31052:343:1;58040:64:0;58134:12;;-1:-1:-1;;;;;58161:16:0;;58153:62;;;;-1:-1:-1;;;58153:62:0;;31602:2:1;58153:62:0;;;31584:21:1;31641:2;31621:18;;;31614:30;31680:34;31660:18;;;31653:62;-1:-1:-1;;;31731:18:1;;;31724:31;31772:19;;58153:62:0;31400:397:1;58153:62:0;58352:21;58360:12;57827;;-1:-1:-1;57817:22:0;57740:105;58352:21;58351:22;58343:64;;;;-1:-1:-1;;;58343:64:0;;32004:2:1;58343:64:0;;;31986:21:1;32043:2;32023:18;;;32016:30;32082:31;32062:18;;;32055:59;32131:18;;58343:64:0;31802:353:1;58343:64:0;52056:2;58422:8;:24;;58414:71;;;;-1:-1:-1;;;58414:71:0;;32362:2:1;58414:71:0;;;32344:21:1;32401:2;32381:18;;;32374:30;32440:34;32420:18;;;32413:62;-1:-1:-1;;;32491:18:1;;;32484:32;32533:19;;58414:71:0;32160:398:1;58414:71:0;-1:-1:-1;;;;;58525:16:0;;58492:30;58525:16;;;:12;:16;;;;;;;;;58492:49;;;;;;;;;-1:-1:-1;;;;;58492:49:0;;;;;-1:-1:-1;;;58492:49:0;;;;;;;;;;;58567:119;;;;;;;;58587:19;;58492:49;;58567:119;;;58587:39;;58617:8;;58587:39;:::i;:::-;-1:-1:-1;;;;;58567:119:0;;;;;58670:8;58635:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;58567:119:0;;;;;;-1:-1:-1;;;;;58548:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;-1:-1:-1;;;58548:138:0;;;;;;;;;;;;58721:43;;;;;;;;;;-1:-1:-1;;;;;58747:15:0;58721:43;;;;;;;;58693:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;58693:71:0;-1:-1:-1;;;;;;58693:71:0;;;;;;;;;;;;;;;;;;58705:12;;58813:254;58837:8;58833:1;:12;58813:254;;;58866:38;;58891:12;;-1:-1:-1;;;;;58866:38:0;;;58883:1;;58866:38;;58883:1;;58866:38;58921:59;58952:1;58956:2;58960:12;58974:5;58921:22;:59::i;:::-;58913:123;;;;-1:-1:-1;;;58913:123:0;;;;;;;:::i;:::-;59045:14;;;;:::i;:::-;;;;58847:3;;;;;:::i;:::-;;;;58813:254;;;-1:-1:-1;59073:12:0;:27;-1:-1:-1;;;;;57955:1151:0:o;2220:414::-;2283:4;4413:19;;;:12;;;:19;;;;;;2300:327;;-1:-1:-1;2343:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;2526:18;;2504:19;;;:12;;;:19;;;;;;:40;;;;2559:11;;2300:327;-1:-1:-1;2610:5:0;2603:12;;2810:1420;2876:4;3015:19;;;:12;;;:19;;;;;;3051:15;;3047:1176;;3426:21;3450:14;3463:1;3450:10;:14;:::i;:::-;3499:18;;3426:38;;-1:-1:-1;3479:17:0;;3499:22;;3520:1;;3499:22;:::i;:::-;3479:42;;3555:13;3542:9;:26;3538:405;;3589:17;3609:3;:11;;3621:9;3609:22;;;;;;;;:::i;:::-;;;;;;;;;3589:42;;3763:9;3734:3;:11;;3746:13;3734:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;3848:23;;;:12;;;:23;;;;;:36;;;3538:405;4024:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4119:3;:12;;:19;4132:5;4119:19;;;;;;;;;;;4112:26;;;4162:4;4155:11;;;;;;;3047:1176;4206:5;4199:12;;;;;38994:1632;39125:7;;40059:66;40046:79;;40042:163;;;-1:-1:-1;40158:1:0;;-1:-1:-1;40162:30:0;40142:51;;40042:163;40219:1;:7;;40224:2;40219:7;;:18;;;;;40230:1;:7;;40235:2;40230:7;;40219:18;40215:102;;;-1:-1:-1;40270:1:0;;-1:-1:-1;40274:30:0;40254:51;;40215:102;40431:24;;;40414:14;40431:24;;;;;;;;;18327:25:1;;;18400:4;18388:17;;18368:18;;;18361:45;;;;18422:18;;;18415:34;;;18465:18;;;18458:34;;;40431:24:0;;18299:19:1;;40431:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40431:24:0;;-1:-1:-1;;40431:24:0;;;-1:-1:-1;;;;;;;40470:20:0;;40466:103;;40523:1;40527:29;40507:50;;;;;;;40466:103;40589:6;-1:-1:-1;40597:20:0;;-1:-1:-1;38994:1632:0;;;;;;;;:::o;34264:643::-;34342:20;34333:5;:29;;;;;;;;:::i;:::-;;34329:571;;;34264:643;:::o;34329:571::-;34440:29;34431:5;:38;;;;;;;;:::i;:::-;;34427:473;;;34486:34;;-1:-1:-1;;;34486:34:0;;33029:2:1;34486:34:0;;;33011:21:1;33068:2;33048:18;;;33041:30;33107:26;33087:18;;;33080:54;33151:18;;34486:34:0;32827:348:1;34427:473:0;34551:35;34542:5;:44;;;;;;;;:::i;:::-;;34538:362;;;34603:41;;-1:-1:-1;;;34603:41:0;;33382:2:1;34603:41:0;;;33364:21:1;33421:2;33401:18;;;33394:30;33460:33;33440:18;;;33433:61;33511:18;;34603:41:0;33180:355:1;34538:362:0;34675:30;34666:5;:39;;;;;;;;:::i;:::-;;34662:238;;;34722:44;;-1:-1:-1;;;34722:44:0;;33742:2:1;34722:44:0;;;33724:21:1;33781:2;33761:18;;;33754:30;33820:34;33800:18;;;33793:62;-1:-1:-1;;;33871:18:1;;;33864:32;33913:19;;34722:44:0;33540:398:1;34662:238:0;34797:30;34788:5;:39;;;;;;;;:::i;:::-;;34784:116;;;34844:44;;-1:-1:-1;;;34844:44:0;;34145:2:1;34844:44:0;;;34127:21:1;34184:2;34164:18;;;34157:30;34223:34;34203:18;;;34196:62;-1:-1:-1;;;34274:18:1;;;34267:32;34316:19;;34844:44:0;33943:398:1;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:127::-;653:10;648:3;644:20;641:1;634:31;684:4;681:1;674:15;708:4;705:1;698:15;724:275;795:2;789:9;860:2;841:13;;-1:-1:-1;;837:27:1;825:40;;-1:-1:-1;;;;;880:34:1;;916:22;;;877:62;874:88;;;942:18;;:::i;:::-;978:2;971:22;724:275;;-1:-1:-1;724:275:1:o;1004:407::-;1069:5;-1:-1:-1;;;;;1095:6:1;1092:30;1089:56;;;1125:18;;:::i;:::-;1163:57;1208:2;1187:15;;-1:-1:-1;;1183:29:1;1214:4;1179:40;1163:57;:::i;:::-;1154:66;;1243:6;1236:5;1229:21;1283:3;1274:6;1269:3;1265:16;1262:25;1259:45;;;1300:1;1297;1290:12;1259:45;1349:6;1344:3;1337:4;1330:5;1326:16;1313:43;1403:1;1396:4;1387:6;1380:5;1376:18;1372:29;1365:40;1004:407;;;;;:::o;1416:451::-;1485:6;1538:2;1526:9;1517:7;1513:23;1509:32;1506:52;;;1554:1;1551;1544:12;1506:52;1594:9;1581:23;-1:-1:-1;;;;;1619:6:1;1616:30;1613:50;;;1659:1;1656;1649:12;1613:50;1682:22;;1735:4;1727:13;;1723:27;-1:-1:-1;1713:55:1;;1764:1;1761;1754:12;1713:55;1787:74;1853:7;1848:2;1835:16;1830:2;1826;1822:11;1787:74;:::i;1872:258::-;1944:1;1954:113;1968:6;1965:1;1962:13;1954:113;;;2044:11;;;2038:18;2025:11;;;2018:39;1990:2;1983:10;1954:113;;;2085:6;2082:1;2079:13;2076:48;;;-1:-1:-1;;2120:1:1;2102:16;;2095:27;1872:258::o;2135:269::-;2188:3;2226:5;2220:12;2253:6;2248:3;2241:19;2269:63;2325:6;2318:4;2313:3;2309:14;2302:4;2295:5;2291:16;2269:63;:::i;:::-;2386:2;2365:15;-1:-1:-1;;2361:29:1;2352:39;;;;2393:4;2348:50;;2135:269;-1:-1:-1;;2135:269:1:o;2409:231::-;2558:2;2547:9;2540:21;2521:4;2578:56;2630:2;2619:9;2615:18;2607:6;2578:56;:::i;2645:180::-;2704:6;2757:2;2745:9;2736:7;2732:23;2728:32;2725:52;;;2773:1;2770;2763:12;2725:52;-1:-1:-1;2796:23:1;;2645:180;-1:-1:-1;2645:180:1:o;3038:435::-;3091:3;3129:5;3123:12;3156:6;3151:3;3144:19;3182:4;3211:2;3206:3;3202:12;3195:19;;3248:2;3241:5;3237:14;3269:1;3279:169;3293:6;3290:1;3287:13;3279:169;;;3354:13;;3342:26;;3388:12;;;;3423:15;;;;3315:1;3308:9;3279:169;;;-1:-1:-1;3464:3:1;;3038:435;-1:-1:-1;;;;;3038:435:1:o;3478:1037::-;3824:2;3836:21;;;3906:13;;3809:18;;;3928:22;;;3776:4;;4004;;3981:3;3966:19;;;4031:15;;;3776:4;4074:195;4088:6;4085:1;4082:13;4074:195;;;4153:13;;-1:-1:-1;;;;;4149:39:1;4137:52;;4209:12;;;;4244:15;;;;4185:1;4103:9;4074:195;;;4078:3;;;4314:9;4309:3;4305:19;4300:2;4289:9;4285:18;4278:47;4348:41;4385:3;4377:6;4348:41;:::i;:::-;4334:55;;;4437:9;4429:6;4425:22;4420:2;4409:9;4405:18;4398:50;4465:44;4502:6;4494;4465:44;:::i;:::-;4457:52;3478:1037;-1:-1:-1;;;;;;3478:1037:1:o;4520:131::-;-1:-1:-1;;;;;4595:31:1;;4585:42;;4575:70;;4641:1;4638;4631:12;4656:315;4724:6;4732;4785:2;4773:9;4764:7;4760:23;4756:32;4753:52;;;4801:1;4798;4791:12;4753:52;4840:9;4827:23;4859:31;4884:5;4859:31;:::i;:::-;4909:5;4961:2;4946:18;;;;4933:32;;-1:-1:-1;;;4656:315:1:o;4976:118::-;5062:5;5055:13;5048:21;5041:5;5038:32;5028:60;;5084:1;5081;5074:12;5099:450;5173:6;5181;5189;5242:2;5230:9;5221:7;5217:23;5213:32;5210:52;;;5258:1;5255;5248:12;5210:52;5297:9;5284:23;5316:31;5341:5;5316:31;:::i;:::-;5366:5;-1:-1:-1;5418:2:1;5403:18;;5390:32;;-1:-1:-1;5474:2:1;5459:18;;5446:32;5487:30;5446:32;5487:30;:::i;:::-;5536:7;5526:17;;;5099:450;;;;;:::o;5554:383::-;5631:6;5639;5647;5700:2;5688:9;5679:7;5675:23;5671:32;5668:52;;;5716:1;5713;5706:12;5668:52;5752:9;5739:23;5729:33;;5812:2;5801:9;5797:18;5784:32;5825:31;5850:5;5825:31;:::i;:::-;5554:383;;5875:5;;-1:-1:-1;;;5927:2:1;5912:18;;;;5899:32;;5554:383::o;6124:183::-;6184:4;-1:-1:-1;;;;;6209:6:1;6206:30;6203:56;;;6239:18;;:::i;:::-;-1:-1:-1;6284:1:1;6280:14;6296:4;6276:25;;6124:183::o;6312:662::-;6366:5;6419:3;6412:4;6404:6;6400:17;6396:27;6386:55;;6437:1;6434;6427:12;6386:55;6473:6;6460:20;6499:4;6523:60;6539:43;6579:2;6539:43;:::i;:::-;6523:60;:::i;:::-;6617:15;;;6703:1;6699:10;;;;6687:23;;6683:32;;;6648:12;;;;6727:15;;;6724:35;;;6755:1;6752;6745:12;6724:35;6791:2;6783:6;6779:15;6803:142;6819:6;6814:3;6811:15;6803:142;;;6885:17;;6873:30;;6923:12;;;;6836;;6803:142;;;-1:-1:-1;6963:5:1;6312:662;-1:-1:-1;;;;;;6312:662:1:o;6979:416::-;7072:6;7080;7133:2;7121:9;7112:7;7108:23;7104:32;7101:52;;;7149:1;7146;7139:12;7101:52;7185:9;7172:23;7162:33;;7246:2;7235:9;7231:18;7218:32;-1:-1:-1;;;;;7265:6:1;7262:30;7259:50;;;7305:1;7302;7295:12;7259:50;7328:61;7381:7;7372:6;7361:9;7357:22;7328:61;:::i;:::-;7318:71;;;6979:416;;;;;:::o;7400:456::-;7477:6;7485;7493;7546:2;7534:9;7525:7;7521:23;7517:32;7514:52;;;7562:1;7559;7552:12;7514:52;7601:9;7588:23;7620:31;7645:5;7620:31;:::i;:::-;7670:5;-1:-1:-1;7727:2:1;7712:18;;7699:32;7740:33;7699:32;7740:33;:::i;7861:1215::-;7979:6;7987;8040:2;8028:9;8019:7;8015:23;8011:32;8008:52;;;8056:1;8053;8046:12;8008:52;8096:9;8083:23;-1:-1:-1;;;;;8166:2:1;8158:6;8155:14;8152:34;;;8182:1;8179;8172:12;8152:34;8220:6;8209:9;8205:22;8195:32;;8265:7;8258:4;8254:2;8250:13;8246:27;8236:55;;8287:1;8284;8277:12;8236:55;8323:2;8310:16;8345:4;8369:60;8385:43;8425:2;8385:43;:::i;8369:60::-;8463:15;;;8545:1;8541:10;;;;8533:19;;8529:28;;;8494:12;;;;8569:19;;;8566:39;;;8601:1;8598;8591:12;8566:39;8625:11;;;;8645:217;8661:6;8656:3;8653:15;8645:217;;;8741:3;8728:17;8758:31;8783:5;8758:31;:::i;:::-;8802:18;;8678:12;;;;8840;;;;8645:217;;;8881:5;-1:-1:-1;;8924:18:1;;8911:32;;-1:-1:-1;;8955:16:1;;;8952:36;;;8984:1;8981;8974:12;8952:36;;9007:63;9062:7;9051:8;9040:9;9036:24;9007:63;:::i;9081:474::-;9165:6;9173;9181;9189;9242:3;9230:9;9221:7;9217:23;9213:33;9210:53;;;9259:1;9256;9249:12;9210:53;9295:9;9282:23;9272:33;;9355:2;9344:9;9340:18;9327:32;9399:4;9392:5;9388:16;9381:5;9378:27;9368:55;;9419:1;9416;9409:12;9368:55;9081:474;;9442:5;;-1:-1:-1;;;;9494:2:1;9479:18;;9466:32;;9545:2;9530:18;9517:32;;9081:474::o;9560:348::-;9644:6;9697:2;9685:9;9676:7;9672:23;9668:32;9665:52;;;9713:1;9710;9703:12;9665:52;9753:9;9740:23;-1:-1:-1;;;;;9778:6:1;9775:30;9772:50;;;9818:1;9815;9808:12;9772:50;9841:61;9894:7;9885:6;9874:9;9870:22;9841:61;:::i;9913:261::-;10092:2;10081:9;10074:21;10055:4;10112:56;10164:2;10153:9;10149:18;10141:6;10112:56;:::i;10179:247::-;10238:6;10291:2;10279:9;10270:7;10266:23;10262:32;10259:52;;;10307:1;10304;10297:12;10259:52;10346:9;10333:23;10365:31;10390:5;10365:31;:::i;10684:382::-;10749:6;10757;10810:2;10798:9;10789:7;10785:23;10781:32;10778:52;;;10826:1;10823;10816:12;10778:52;10865:9;10852:23;10884:31;10909:5;10884:31;:::i;:::-;10934:5;-1:-1:-1;10991:2:1;10976:18;;10963:32;11004:30;10963:32;11004:30;:::i;:::-;11053:7;11043:17;;;10684:382;;;;;:::o;11071:795::-;11166:6;11174;11182;11190;11243:3;11231:9;11222:7;11218:23;11214:33;11211:53;;;11260:1;11257;11250:12;11211:53;11299:9;11286:23;11318:31;11343:5;11318:31;:::i;:::-;11368:5;-1:-1:-1;11425:2:1;11410:18;;11397:32;11438:33;11397:32;11438:33;:::i;:::-;11490:7;-1:-1:-1;11544:2:1;11529:18;;11516:32;;-1:-1:-1;11599:2:1;11584:18;;11571:32;-1:-1:-1;;;;;11615:30:1;;11612:50;;;11658:1;11655;11648:12;11612:50;11681:22;;11734:4;11726:13;;11722:27;-1:-1:-1;11712:55:1;;11763:1;11760;11753:12;11712:55;11786:74;11852:7;11847:2;11834:16;11829:2;11825;11821:11;11786:74;:::i;:::-;11776:84;;;11071:795;;;;;;;:::o;11871:388::-;11939:6;11947;12000:2;11988:9;11979:7;11975:23;11971:32;11968:52;;;12016:1;12013;12006:12;11968:52;12055:9;12042:23;12074:31;12099:5;12074:31;:::i;:::-;12124:5;-1:-1:-1;12181:2:1;12166:18;;12153:32;12194:33;12153:32;12194:33;:::i;12264:380::-;12343:1;12339:12;;;;12386;;;12407:61;;12461:4;12453:6;12449:17;12439:27;;12407:61;12514:2;12506:6;12503:14;12483:18;12480:38;12477:161;;;12560:10;12555:3;12551:20;12548:1;12541:31;12595:4;12592:1;12585:15;12623:4;12620:1;12613:15;12477:161;;12264:380;;;:::o;13063:127::-;13124:10;13119:3;13115:20;13112:1;13105:31;13155:4;13152:1;13145:15;13179:4;13176:1;13169:15;13195:127;13256:10;13251:3;13247:20;13244:1;13237:31;13287:4;13284:1;13277:15;13311:4;13308:1;13301:15;13327:135;13366:3;-1:-1:-1;;13387:17:1;;13384:43;;;13407:18;;:::i;:::-;-1:-1:-1;13454:1:1;13443:13;;13327:135::o;14296:125::-;14336:4;14364:1;14361;14358:8;14355:34;;;14369:18;;:::i;:::-;-1:-1:-1;14406:9:1;;14296:125::o;14426:128::-;14466:3;14497:1;14493:6;14490:1;14487:13;14484:39;;;14503:18;;:::i;:::-;-1:-1:-1;14539:9:1;;14426:128::o;14559:336::-;14761:2;14743:21;;;14800:2;14780:18;;;14773:30;-1:-1:-1;;;14834:2:1;14819:18;;14812:42;14886:2;14871:18;;14559:336::o;14900:251::-;14970:6;15023:2;15011:9;15002:7;14998:23;14994:32;14991:52;;;15039:1;15036;15029:12;14991:52;15071:9;15065:16;15090:31;15115:5;15090:31;:::i;16223:136::-;16262:3;16290:5;16280:39;;16299:18;;:::i;:::-;-1:-1:-1;;;16335:18:1;;16223:136::o;20708:351::-;20910:2;20892:21;;;20949:2;20929:18;;;20922:30;20988:29;20983:2;20968:18;;20961:57;21050:2;21035:18;;20708:351::o;21064:127::-;21125:10;21120:3;21116:20;21113:1;21106:31;21156:4;21153:1;21146:15;21180:4;21177:1;21170:15;21196:112;21228:1;21254;21244:35;;21259:18;;:::i;:::-;-1:-1:-1;21293:9:1;;21196:112::o;21313:415::-;21515:2;21497:21;;;21554:2;21534:18;;;21527:30;21593:34;21588:2;21573:18;;21566:62;-1:-1:-1;;;21659:2:1;21644:18;;21637:49;21718:3;21703:19;;21313:415::o;23106:184::-;23176:6;23229:2;23217:9;23208:7;23204:23;23200:32;23197:52;;;23245:1;23242;23235:12;23197:52;-1:-1:-1;23268:16:1;;23106:184;-1:-1:-1;23106:184:1:o;23837:185::-;23879:3;23917:5;23911:12;23932:52;23977:6;23972:3;23965:4;23958:5;23954:16;23932:52;:::i;:::-;24000:16;;;;;23837:185;-1:-1:-1;;23837:185:1:o;24027:1174::-;24203:3;24232:1;24265:6;24259:13;24295:3;24317:1;24345:9;24341:2;24337:18;24327:28;;24405:2;24394:9;24390:18;24427;24417:61;;24471:4;24463:6;24459:17;24449:27;;24417:61;24497:2;24545;24537:6;24534:14;24514:18;24511:38;24508:165;;;-1:-1:-1;;;24572:33:1;;24628:4;24625:1;24618:15;24658:4;24579:3;24646:17;24508:165;24689:18;24716:104;;;;24834:1;24829:320;;;;24682:467;;24716:104;-1:-1:-1;;24749:24:1;;24737:37;;24794:16;;;;-1:-1:-1;24716:104:1;;24829:320;23784:1;23777:14;;;23821:4;23808:18;;24924:1;24938:165;24952:6;24949:1;24946:13;24938:165;;;25030:14;;25017:11;;;25010:35;25073:16;;;;24967:10;;24938:165;;;24942:3;;25132:6;25127:3;25123:16;25116:23;;24682:467;;;;;;;25165:30;25191:3;25183:6;25165:30;:::i;:::-;25158:37;24027:1174;-1:-1:-1;;;;;24027:1174:1:o;27004:245::-;27071:6;27124:2;27112:9;27103:7;27099:23;27095:32;27092:52;;;27140:1;27137;27130:12;27092:52;27172:9;27166:16;27191:28;27213:5;27191:28;:::i;28832:246::-;28872:4;-1:-1:-1;;;;;28985:10:1;;;;28955;;29007:12;;;29004:38;;;29022:18;;:::i;:::-;29059:13;;28832:246;-1:-1:-1;;;28832:246:1:o;29083:253::-;29123:3;-1:-1:-1;;;;;29212:2:1;29209:1;29205:10;29242:2;29239:1;29235:10;29273:3;29269:2;29265:12;29260:3;29257:21;29254:47;;;29281:18;;:::i;:::-;29317:13;;29083:253;-1:-1:-1;;;;29083:253:1:o;30168:500::-;-1:-1:-1;;;;;30437:15:1;;;30419:34;;30489:15;;30484:2;30469:18;;30462:43;30536:2;30521:18;;30514:34;;;30584:3;30579:2;30564:18;;30557:31;;;30362:4;;30605:57;;30642:19;;30634:6;30605:57;:::i;30673:249::-;30742:6;30795:2;30783:9;30774:7;30770:23;30766:32;30763:52;;;30811:1;30808;30801:12;30763:52;30843:9;30837:16;30862:30;30886:5;30862:30;:::i;30927:120::-;30967:1;30993;30983:35;;30998:18;;:::i;:::-;-1:-1:-1;31032:9:1;;30927:120::o;32563:127::-;32624:10;32619:3;32615:20;32612:1;32605:31;32655:4;32652:1;32645:15;32679:4;32676:1;32669:15;32695:127;32756:10;32751:3;32747:20;32744:1;32737:31;32787:4;32784:1;32777:15;32811:4;32808:1;32801:15

Swarm Source

ipfs://6ac9d838d8530279966210602065423d57e8287d75f1ee9de8a105a9b0cb9557
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.