ETH Price: $2,537.43 (+2.95%)

Token

Delta Wolves (DW)
 

Overview

Max Total Supply

93 DW

Holders

25

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 DW
0xB103AB2d8Cea1Ac5547098caEc3c3F99597a7Baa
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DeltaWolves

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-26
*/

// File: @openzeppelin/[email protected]/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

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

// File: @openzeppelin/[email protected]/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/[email protected]/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;


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

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

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

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

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

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

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

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

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

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

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

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

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

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

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

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

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

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

    // The next token ID to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

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

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

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

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

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

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

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

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

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

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

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

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

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

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

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

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

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

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

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

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

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

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

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

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

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

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

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

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

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

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

// File: contracts/DeltaWovlves.sol


pragma solidity ^0.8.9;




contract DeltaWolves is ERC721A, Ownable {
    uint256 MAX_SUPPLY = 7777;
    uint256 public honoraryPrice = 0.03 ether;
    uint256 public WarriorPrice = 0.035 ether;
    uint256 public wlPrice = 0.04 ether;
    uint256 public mintPirce = 0.05 ether;

    bool Honorarysale = false;
    bool Warriorsale = false;
    bool Whitelistsale = false;
    bool Publicsale = false;

    string private baseURI;

    bytes32 public merkleRootHonorary;
    bytes32 public merkleRootWarrior;
    bytes32 public merkleRootWhitelist;

    mapping (address => bool ) public teamMint;
    mapping (address => bool ) public CoreteamMint;

    mapping (address => uint256) public HRmintedCounts;
    mapping (address => uint256) public WRmintedCounts;
    mapping (address => uint256) public WLmintedCounts;
    mapping (address => uint256) public Coreteamcount;
    mapping (address => uint256) public teamcount;
    mapping (address => uint256) public mintedCounts;
    
    mapping (address => bool) public AllowedMarketplaces;

    event HonoraryMinted(address indexed recipient);
    event WarriorMinted(address indexed recipient);
    event WhitelistMinted(address indexed recipient);
    event CoreTeamMinted(address indexed recipient);
    event TeamMinted(address indexed recipient);
    event Minted(address indexed recipient);

    constructor() ERC721A("Delta Wolves", "DW") {}

    function setTeamWL(address[] calldata addresses) external onlyOwner {
        for(uint256 i = 0; i < addresses.length; i++){
            teamMint[addresses[i]] = true;
        }
    }

    function setCoreTeamWL(address[] calldata addresses) external onlyOwner {
        for(uint256 i = 0; i < addresses.length; i++){
            CoreteamMint[addresses[i]] = true;
        }
    }

    function approve(address to, uint256 id) public virtual payable override {
        require(AllowedMarketplaces[to], "Invalid marketplace");
        super.approve(to, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(AllowedMarketplaces[operator], "Invalid marketplace");
        super.setApprovalForAll(operator, approved);
    }

    function setAllowedMarketplace(address marketplace, bool allowed) public onlyOwner{
        AllowedMarketplaces[marketplace] = allowed;
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    function setBaseURI(string memory _baseURI_) external onlyOwner {
        baseURI = _baseURI_;
    }

    function setMerkleRootHonorary(
        bytes32 _merkleRootHonorary
    ) external onlyOwner {
        merkleRootHonorary = _merkleRootHonorary;
    }

    function setMerkleRootWarrior(
        bytes32 _merkleRootWarrior
    ) external onlyOwner {
        merkleRootWarrior = _merkleRootWarrior;
    }

    function setMerkleRootWhitelist(
        bytes32 _merkleRootWhitelist
    ) external onlyOwner {
        merkleRootWhitelist = _merkleRootWhitelist;
    }

    function mintHonorary(bytes32[] memory proof, uint256 quantity) external payable callerIsUser {
        require(Honorarysale, " Not active yet");
        require((totalSupply() + quantity) <= MAX_SUPPLY, "There is no more wolves to mint!!");
        require(quantity + HRmintedCounts[msg.sender] <= 3, "To much Wovles");
        require((msg.value >= honoraryPrice * quantity), "Insufficient payment");
        require(
            HRmintedCounts[msg.sender] <= 3,
            "Already claimed the max amount of wolves allowed"
        );

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(proof, merkleRootHonorary, leaf),
            "Invalid proof"
        );

        _safeMint(msg.sender, quantity);
        HRmintedCounts[msg.sender] += quantity;
        emit HonoraryMinted(msg.sender);
    }

    

    function mintWarrior(bytes32[] memory proof, uint256 quantity) external payable callerIsUser {
        require(Warriorsale, " Not active yet");
        require((totalSupply() + quantity) <= MAX_SUPPLY, "There is no more wolves to mint!!");
        require(quantity + WRmintedCounts[msg.sender] <= 2, "To much Wovles");
        require((msg.value >= WarriorPrice * quantity), "Insufficient payment");
        require(
            WRmintedCounts[msg.sender] <= 2,
            "Already claimed the max amount of wolves allowed"
        );

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(proof, merkleRootWarrior, leaf),
            "Invalid proof"
        );


        _safeMint(msg.sender, quantity);
        WRmintedCounts[msg.sender] += quantity;
        emit WarriorMinted(msg.sender);
    }

    function mintWhitelist(bytes32[] memory proof, uint256 quantity) external payable callerIsUser {
        require(Whitelistsale, " Not active yet");
        require((totalSupply() + quantity) <= MAX_SUPPLY, "There is no more wolves to mint!!");
        require(quantity + WLmintedCounts[msg.sender] <= 2, "To much Wovles");
        require((msg.value >= wlPrice * quantity), "Insufficient payment");
        
        require(
            WLmintedCounts[msg.sender] <= 2,
            "Already claimed the max amount of wolves allowed"
        );

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(proof, merkleRootWarrior, leaf),
            "Invalid proof"
        );

        _safeMint(msg.sender, quantity);
        WLmintedCounts[msg.sender] += quantity;
        emit WhitelistMinted(msg.sender);
    }

    function mint(uint256 quantity) external payable callerIsUser {
        require(Publicsale, " Not active yet");
        require((totalSupply() + quantity) <= MAX_SUPPLY, "There is no more wolves to mint!!");
        require(quantity + mintedCounts[msg.sender] <= 5, "To much Wovles");
        require((msg.value >= mintPirce * quantity), "Insufficient payment");
        require(
            mintedCounts[msg.sender] <= 5,
            "Already claimed the max amount of wolves allowed"
        );

        _safeMint(msg.sender, quantity);
        mintedCounts[msg.sender] += quantity;
        emit Minted(msg.sender);
    }

    function _teamMint(uint256 quantity) external payable callerIsUser{
        require(teamMint[msg.sender], "You are not a team memeber");
        require((totalSupply() + quantity) <= MAX_SUPPLY, "There is no more wolves to mint!!");
        require(quantity + teamcount[msg.sender] <= 2, "To much Wovles");
        require(
            teamcount[msg.sender] <= 2,
            "Already claimed the max amount of wolves allowed"
        );

        
        _safeMint(msg.sender, quantity);
        teamcount[msg.sender] += quantity;
        emit TeamMinted(msg.sender);
    }

    function _CoreteamMint(uint256 quantity) external payable callerIsUser{
        require(CoreteamMint[msg.sender], "You are not a team memeber");
        require((totalSupply() + quantity) <= MAX_SUPPLY, "There is no more wolves to mint!!");
        require(quantity <= 2, "To much Wovles");
        require(quantity + Coreteamcount[msg.sender] <= 4, "To much Wovles");
        require(
            Coreteamcount[msg.sender] <= 4,
            "Already claimed the max amount of wolves allowed"
        );

        
        _safeMint(msg.sender, quantity);
        Coreteamcount[msg.sender] += quantity;
        emit CoreTeamMinted(msg.sender);
    }

    function ActivateHonrarySale() external onlyOwner {
        Honorarysale = true;
    }

    function ActivateWarriorsale() external onlyOwner {
        Warriorsale = true;
    }

    function ActivateWhitelistsale() external onlyOwner {
        Whitelistsale = true;
    }

    function ActivatePublicsale() external onlyOwner {
        Publicsale = true;
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"CoreTeamMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"HonoraryMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"Minted","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":"recipient","type":"address"}],"name":"TeamMinted","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"WarriorMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"WhitelistMinted","type":"event"},{"inputs":[],"name":"ActivateHonrarySale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ActivatePublicsale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ActivateWarriorsale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ActivateWhitelistsale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"AllowedMarketplaces","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"CoreteamMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Coreteamcount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"HRmintedCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WLmintedCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WRmintedCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WarriorPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"_CoreteamMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"_teamMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"honoraryPrice","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":[],"name":"merkleRootHonorary","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootWarrior","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootWhitelist","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintHonorary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPirce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintWarrior","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"marketplace","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setAllowedMarketplace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setCoreTeamWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRootHonorary","type":"bytes32"}],"name":"setMerkleRootHonorary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRootWarrior","type":"bytes32"}],"name":"setMerkleRootWarrior","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRootWhitelist","type":"bytes32"}],"name":"setMerkleRootWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setTeamWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"teamMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"teamcount","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052611e61600955666a94d74f430000600a55667c585087238000600b55668e1bc9bf040000600c5566b1a2bc2ec50000600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506000600e60026101000a81548160ff0219169083151502179055506000600e60036101000a81548160ff021916908315150217905550348015620000af57600080fd5b506040518060400160405280600c81526020017f44656c746120576f6c76657300000000000000000000000000000000000000008152506040518060400160405280600281526020017f445700000000000000000000000000000000000000000000000000000000000081525081600290816200012d9190620004cb565b5080600390816200013f9190620004cb565b50620001506200017e60201b60201c565b6000819055505050620001786200016c6200018360201b60201c565b6200018b60201b60201c565b620005b2565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002d357607f821691505b602082108103620002e957620002e86200028b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000314565b6200035f868362000314565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003ac620003a6620003a08462000377565b62000381565b62000377565b9050919050565b6000819050919050565b620003c8836200038b565b620003e0620003d782620003b3565b84845462000321565b825550505050565b600090565b620003f7620003e8565b62000404818484620003bd565b505050565b5b818110156200042c5762000420600082620003ed565b6001810190506200040a565b5050565b601f8211156200047b576200044581620002ef565b620004508462000304565b8101602085101562000460578190505b620004786200046f8562000304565b83018262000409565b50505b505050565b600082821c905092915050565b6000620004a06000198460080262000480565b1980831691505092915050565b6000620004bb83836200048d565b9150826002028217905092915050565b620004d68262000251565b67ffffffffffffffff811115620004f257620004f16200025c565b5b620004fe8254620002ba565b6200050b82828562000430565b600060209050601f8311600181146200054357600084156200052e578287015190505b6200053a8582620004ad565b865550620005aa565b601f1984166200055386620002ef565b60005b828110156200057d5784890151825560018201915060208501945060208101905062000556565b868310156200059d578489015162000599601f8916826200048d565b8355505b6001600288020188555050505b505050505050565b61525080620005c26000396000f3fe6080604052600436106102e45760003560e01c8063746149b611610190578063b88d4fde116100dc578063df2980de11610095578063e985e9c51161006f578063e985e9c514610aa1578063f0e6b02314610ade578063f0f333ec14610af5578063f2fde38b14610b32576102e4565b8063df2980de14610a31578063e7d387fe14610a4d578063e8bd7c6914610a76576102e4565b8063b88d4fde14610956578063c7f8d01a14610972578063c87b56dd1461099d578063c9fc2ace146109da578063ca44183914610a03578063d4e0205d14610a1a576102e4565b80639fee147011610149578063a6d612f911610123578063a6d612f9146108a9578063a927dc6d146108c5578063b6a1dba1146108ee578063b7f329d31461092b576102e4565b80639fee147014610848578063a0712d6814610864578063a22cb46514610880576102e4565b8063746149b61461075e5780638da5cb5b146107755780638e1f9cfe146107a057806395d89b41146107cb5780639f81de78146107f65780639fe577ce1461081f576102e4565b80633ccfd60b1161024f57806355f804b3116102085780636661a51f116101e25780636661a51f14610690578063685cff77146106cd57806370a082311461070a578063715018a614610747576102e4565b806355f804b31461060e57806357260bdc146106375780636352211e14610653576102e4565b80633ccfd60b14610539578063408337dc1461054357806342842e0e1461058057806346c456b01461059c5780634aa5ea04146105b85780634eeaeccd146105e3576102e4565b806318160ddd116102a157806318160ddd1461042457806323b872dd1461044f578063301f77451461046b578063360bede81461049657806337e4f2f6146104bf5780633a77d43a146104fc576102e4565b806301cd5e2b146102e957806301ffc9a71461032657806306fdde0314610363578063081812fc1461038e578063095ea7b3146103cb5780630e528f7f146103e7575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b9190613ed9565b610b5b565b60405161031d9190613f1f565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613f92565b610b73565b60405161035a9190613fda565b60405180910390f35b34801561036f57600080fd5b50610378610c05565b6040516103859190614085565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b091906140d3565b610c97565b6040516103c2919061410f565b60405180910390f35b6103e560048036038101906103e0919061412a565b610d16565b005b3480156103f357600080fd5b5061040e60048036038101906104099190613ed9565b610db0565b60405161041b9190613f1f565b60405180910390f35b34801561043057600080fd5b50610439610dc8565b6040516104469190613f1f565b60405180910390f35b6104696004803603810190610464919061416a565b610ddf565b005b34801561047757600080fd5b50610480611101565b60405161048d91906141d6565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b8919061421d565b611107565b005b3480156104cb57600080fd5b506104e660048036038101906104e19190613ed9565b61118d565b6040516104f39190613f1f565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e9190613ed9565b6111a5565b6040516105309190613f1f565b60405180910390f35b6105416111bd565b005b34801561054f57600080fd5b5061056a60048036038101906105659190613ed9565b611289565b6040516105779190613fda565b60405180910390f35b61059a6004803603810190610595919061416a565b6112a9565b005b6105b660048036038101906105b19190614392565b6112c9565b005b3480156105c457600080fd5b506105cd61165d565b6040516105da9190613f1f565b60405180910390f35b3480156105ef57600080fd5b506105f8611663565b60405161060591906141d6565b60405180910390f35b34801561061a57600080fd5b50610635600480360381019061063091906144a3565b611669565b005b610651600480360381019061064c91906140d3565b6116f8565b005b34801561065f57600080fd5b5061067a600480360381019061067591906140d3565b611a44565b604051610687919061410f565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b29190613ed9565b611a56565b6040516106c49190613fda565b60405180910390f35b3480156106d957600080fd5b506106f460048036038101906106ef9190613ed9565b611a76565b6040516107019190613f1f565b60405180910390f35b34801561071657600080fd5b50610731600480360381019061072c9190613ed9565b611a8e565b60405161073e9190613f1f565b60405180910390f35b34801561075357600080fd5b5061075c611b46565b005b34801561076a57600080fd5b50610773611bce565b005b34801561078157600080fd5b5061078a611c67565b604051610797919061410f565b60405180910390f35b3480156107ac57600080fd5b506107b5611c91565b6040516107c291906141d6565b60405180910390f35b3480156107d757600080fd5b506107e0611c97565b6040516107ed9190614085565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190614547565b611d29565b005b34801561082b57600080fd5b50610846600480360381019061084191906145c0565b611e4a565b005b610862600480360381019061085d91906140d3565b611f21565b005b61087e600480360381019061087991906140d3565b612229565b005b34801561088c57600080fd5b506108a760048036038101906108a291906145c0565b612544565b005b6108c360048036038101906108be9190614392565b6125de565b005b3480156108d157600080fd5b506108ec60048036038101906108e7919061421d565b612972565b005b3480156108fa57600080fd5b5061091560048036038101906109109190613ed9565b6129f8565b6040516109229190613fda565b60405180910390f35b34801561093757600080fd5b50610940612a18565b60405161094d9190613f1f565b60405180910390f35b610970600480360381019061096b91906146a1565b612a1e565b005b34801561097e57600080fd5b50610987612a91565b6040516109949190613f1f565b60405180910390f35b3480156109a957600080fd5b506109c460048036038101906109bf91906140d3565b612a97565b6040516109d19190614085565b60405180910390f35b3480156109e657600080fd5b50610a0160048036038101906109fc9190614547565b612b35565b005b348015610a0f57600080fd5b50610a18612c56565b005b348015610a2657600080fd5b50610a2f612cef565b005b610a4b6004803603810190610a469190614392565b612d88565b005b348015610a5957600080fd5b50610a746004803603810190610a6f919061421d565b61311c565b005b348015610a8257600080fd5b50610a8b6131a2565b604051610a989190613f1f565b60405180910390f35b348015610aad57600080fd5b50610ac86004803603810190610ac39190614724565b6131a8565b604051610ad59190613fda565b60405180910390f35b348015610aea57600080fd5b50610af361323c565b005b348015610b0157600080fd5b50610b1c6004803603810190610b179190613ed9565b6132d5565b604051610b299190613f1f565b60405180910390f35b348015610b3e57600080fd5b50610b596004803603810190610b549190613ed9565b6132ed565b005b60166020528060005260406000206000915090505481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bce57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bfe5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610c1490614793565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4090614793565b8015610c8d5780601f10610c6257610100808354040283529160200191610c8d565b820191906000526020600020905b815481529060010190602001808311610c7057829003601f168201915b5050505050905090565b6000610ca2826133e4565b610cd8576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990614810565b60405180910390fd5b610dac8282613443565b5050565b60186020528060005260406000206000915090505481565b6000610dd2613587565b6001546000540303905090565b6000610dea8261358c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e51576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e5d84613658565b91509150610e738187610e6e61367f565b613687565b610ebf57610e8886610e8361367f565b6131a8565b610ebe576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f25576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f3286868660016136cb565b8015610f3d57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061100b85610fe78888876136d1565b7c0200000000000000000000000000000000000000000000000000000000176136f9565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611091576000600185019050600060046000838152602001908152602001600020540361108f57600054811461108e578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110f98686866001613724565b505050505050565b60105481565b61110f61372a565b73ffffffffffffffffffffffffffffffffffffffff1661112d611c67565b73ffffffffffffffffffffffffffffffffffffffff1614611183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117a9061487c565b60405180910390fd5b8060128190555050565b601a6020528060005260406000206000915090505481565b60176020528060005260406000206000915090505481565b6111c561372a565b73ffffffffffffffffffffffffffffffffffffffff166111e3611c67565b73ffffffffffffffffffffffffffffffffffffffff1614611239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112309061487c565b60405180910390fd5b611241611c67565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611286573d6000803e3d6000fd5b50565b601b6020528060005260406000206000915054906101000a900460ff1681565b6112c483838360405180602001604052806000815250612a1e565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132e906148e8565b60405180910390fd5b600e60019054906101000a900460ff16611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d90614954565b60405180910390fd5b60095481611392610dc8565b61139c91906149a3565b11156113dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d490614a49565b60405180910390fd5b6002601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261142a91906149a3565b111561146b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146290614ab5565b60405180910390fd5b80600b546114799190614ad5565b3410156114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b290614b63565b60405180910390fd5b6002601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561153e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153590614bf5565b60405180910390fd5b6000336040516020016115519190614c5d565b6040516020818303038152906040528051906020012090506115768360115483613732565b6115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac90614cc4565b60405180910390fd5b6115bf3383613749565b81601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160e91906149a3565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f65b0cebb1fbcbb1b6f14e1523267a1b03947b67a4211700d7c6a53723f31f76960405160405180910390a2505050565b600b5481565b60115481565b61167161372a565b73ffffffffffffffffffffffffffffffffffffffff1661168f611c67565b73ffffffffffffffffffffffffffffffffffffffff16146116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc9061487c565b60405180910390fd5b80600f90816116f49190614e90565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175d906148e8565b60405180910390fd5b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e990614fae565b60405180910390fd5b600954816117fe610dc8565b61180891906149a3565b1115611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184090614a49565b60405180910390fd5b600281111561188d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188490614ab5565b60405180910390fd5b6004601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826118da91906149a3565b111561191b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191290614ab5565b60405180910390fd5b6004601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561199e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199590614bf5565b60405180910390fd5b6119a83382613749565b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119f791906149a3565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f7b1831ca5a7298ee7807ae7cd91fc540d9f5f717a4d85304822564b7e2a1583f60405160405180910390a250565b6000611a4f8261358c565b9050919050565b60146020528060005260406000206000915054906101000a900460ff1681565b60156020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611af5576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611b4e61372a565b73ffffffffffffffffffffffffffffffffffffffff16611b6c611c67565b73ffffffffffffffffffffffffffffffffffffffff1614611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb99061487c565b60405180910390fd5b611bcc6000613767565b565b611bd661372a565b73ffffffffffffffffffffffffffffffffffffffff16611bf4611c67565b73ffffffffffffffffffffffffffffffffffffffff1614611c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c419061487c565b60405180910390fd5b6001600e60036101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60125481565b606060038054611ca690614793565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd290614793565b8015611d1f5780601f10611cf457610100808354040283529160200191611d1f565b820191906000526020600020905b815481529060010190602001808311611d0257829003601f168201915b5050505050905090565b611d3161372a565b73ffffffffffffffffffffffffffffffffffffffff16611d4f611c67565b73ffffffffffffffffffffffffffffffffffffffff1614611da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9c9061487c565b60405180910390fd5b60005b82829050811015611e4557600160146000858585818110611dcc57611dcb614fce565b5b9050602002016020810190611de19190613ed9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611e3d90614ffd565b915050611da8565b505050565b611e5261372a565b73ffffffffffffffffffffffffffffffffffffffff16611e70611c67565b73ffffffffffffffffffffffffffffffffffffffff1614611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd9061487c565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f86906148e8565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661201b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201290614fae565b60405180910390fd5b60095481612027610dc8565b61203191906149a3565b1115612072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206990614a49565b60405180910390fd5b6002601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826120bf91906149a3565b1115612100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f790614ab5565b60405180910390fd5b6002601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217a90614bf5565b60405180910390fd5b61218d3382613749565b80601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121dc91906149a3565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f9c0272db5e0307019dcb733c3df30e8770fe0f5dcb9d4bab1b5b8405bfa48a8a60405160405180910390a250565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228e906148e8565b60405180910390fd5b600e60039054906101000a900460ff166122e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dd90614954565b60405180910390fd5b600954816122f2610dc8565b6122fc91906149a3565b111561233d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233490614a49565b60405180910390fd5b6005601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261238a91906149a3565b11156123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c290614ab5565b60405180910390fd5b80600d546123d99190614ad5565b34101561241b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241290614b63565b60405180910390fd5b6005601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561249e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249590614bf5565b60405180910390fd5b6124a83382613749565b80601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f791906149a3565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f90ddedd5a25821bba11fbb98de02ec1f75c1be90ae147d6450ce873e7b78b5d860405160405180910390a250565b601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c790614810565b60405180910390fd5b6125da828261382d565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461264c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612643906148e8565b60405180910390fd5b600e60029054906101000a900460ff1661269b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269290614954565b60405180910390fd5b600954816126a7610dc8565b6126b191906149a3565b11156126f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e990614a49565b60405180910390fd5b6002601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261273f91906149a3565b1115612780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277790614ab5565b60405180910390fd5b80600c5461278e9190614ad5565b3410156127d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c790614b63565b60405180910390fd5b6002601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284a90614bf5565b60405180910390fd5b6000336040516020016128669190614c5d565b60405160208183030381529060405280519060200120905061288b8360115483613732565b6128ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c190614cc4565b60405180910390fd5b6128d43383613749565b81601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461292391906149a3565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f35f90f43eccaa966ec95bfc95d23a6258c82a2b701d4157a29dead025320bddf60405160405180910390a2505050565b61297a61372a565b73ffffffffffffffffffffffffffffffffffffffff16612998611c67565b73ffffffffffffffffffffffffffffffffffffffff16146129ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e59061487c565b60405180910390fd5b8060108190555050565b60136020528060005260406000206000915054906101000a900460ff1681565b600a5481565b612a29848484610ddf565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612a8b57612a5484848484613938565b612a8a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600c5481565b6060612aa2826133e4565b612ad8576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612ae2613a88565b90506000815103612b025760405180602001604052806000815250612b2d565b80612b0c84613b1a565b604051602001612b1d929190615081565b6040516020818303038152906040525b915050919050565b612b3d61372a565b73ffffffffffffffffffffffffffffffffffffffff16612b5b611c67565b73ffffffffffffffffffffffffffffffffffffffff1614612bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba89061487c565b60405180910390fd5b60005b82829050811015612c5157600160136000858585818110612bd857612bd7614fce565b5b9050602002016020810190612bed9190613ed9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612c4990614ffd565b915050612bb4565b505050565b612c5e61372a565b73ffffffffffffffffffffffffffffffffffffffff16612c7c611c67565b73ffffffffffffffffffffffffffffffffffffffff1614612cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc99061487c565b60405180910390fd5b6001600e60026101000a81548160ff021916908315150217905550565b612cf761372a565b73ffffffffffffffffffffffffffffffffffffffff16612d15611c67565b73ffffffffffffffffffffffffffffffffffffffff1614612d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d629061487c565b60405180910390fd5b6001600e60006101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ded906148e8565b60405180910390fd5b600e60009054906101000a900460ff16612e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3c90614954565b60405180910390fd5b60095481612e51610dc8565b612e5b91906149a3565b1115612e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9390614a49565b60405180910390fd5b6003601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482612ee991906149a3565b1115612f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2190614ab5565b60405180910390fd5b80600a54612f389190614ad5565b341015612f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7190614b63565b60405180910390fd5b6003601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff490614bf5565b60405180910390fd5b6000336040516020016130109190614c5d565b6040516020818303038152906040528051906020012090506130358360105483613732565b613074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306b90614cc4565b60405180910390fd5b61307e3383613749565b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130cd91906149a3565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f6958dd5376df34fe6ffd22ebebf27a81d8f7b39d40d95cd29924f0f56c9174ab60405160405180910390a2505050565b61312461372a565b73ffffffffffffffffffffffffffffffffffffffff16613142611c67565b73ffffffffffffffffffffffffffffffffffffffff1614613198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318f9061487c565b60405180910390fd5b8060118190555050565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61324461372a565b73ffffffffffffffffffffffffffffffffffffffff16613262611c67565b73ffffffffffffffffffffffffffffffffffffffff16146132b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132af9061487c565b60405180910390fd5b6001600e60016101000a81548160ff021916908315150217905550565b60196020528060005260406000206000915090505481565b6132f561372a565b73ffffffffffffffffffffffffffffffffffffffff16613313611c67565b73ffffffffffffffffffffffffffffffffffffffff1614613369576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133609061487c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036133d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cf90615117565b60405180910390fd5b6133e181613767565b50565b6000816133ef613587565b111580156133fe575060005482105b801561343c575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600061344e82611a44565b90508073ffffffffffffffffffffffffffffffffffffffff1661346f61367f565b73ffffffffffffffffffffffffffffffffffffffff16146134d25761349b8161349661367f565b6131a8565b6134d1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000808290508061359b613587565b11613621576000548110156136205760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361361e575b600081036136145760046000836001900393508381526020019081526020016000205490506135ea565b8092505050613653565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86136e8868684613b6a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60008261373f8584613b73565b1490509392505050565b613763828260405180602001604052806000815250613be8565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806007600061383a61367f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166138e761367f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161392c9190613fda565b60405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261395e61367f565b8786866040518563ffffffff1660e01b8152600401613980949392919061518c565b6020604051808303816000875af19250505080156139bc57506040513d601f19601f820116820180604052508101906139b991906151ed565b60015b613a35573d80600081146139ec576040519150601f19603f3d011682016040523d82523d6000602084013e6139f1565b606091505b506000815103613a2d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f8054613a9790614793565b80601f0160208091040260200160405190810160405280929190818152602001828054613ac390614793565b8015613b105780601f10613ae557610100808354040283529160200191613b10565b820191906000526020600020905b815481529060010190602001808311613af357829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115613b5557600184039350600a81066030018453600a8104905080613b33575b50828103602084039350808452505050919050565b60009392505050565b60008082905060005b8451811015613bdd576000858281518110613b9a57613b99614fce565b5b60200260200101519050808311613bbc57613bb58382613c85565b9250613bc9565b613bc68184613c85565b92505b508080613bd590614ffd565b915050613b7c565b508091505092915050565b613bf28383613c9c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14613c8057600080549050600083820390505b613c326000868380600101945086613938565b613c68576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110613c1f578160005414613c7d57600080fd5b50505b505050565b600082600052816020526040600020905092915050565b60008054905060008203613cdc576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613ce960008483856136cb565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613d6083613d5160008660006136d1565b613d5a85613e57565b176136f9565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613e0157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613dc6565b5060008203613e3c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613e526000848385613724565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ea682613e7b565b9050919050565b613eb681613e9b565b8114613ec157600080fd5b50565b600081359050613ed381613ead565b92915050565b600060208284031215613eef57613eee613e71565b5b6000613efd84828501613ec4565b91505092915050565b6000819050919050565b613f1981613f06565b82525050565b6000602082019050613f346000830184613f10565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f6f81613f3a565b8114613f7a57600080fd5b50565b600081359050613f8c81613f66565b92915050565b600060208284031215613fa857613fa7613e71565b5b6000613fb684828501613f7d565b91505092915050565b60008115159050919050565b613fd481613fbf565b82525050565b6000602082019050613fef6000830184613fcb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561402f578082015181840152602081019050614014565b60008484015250505050565b6000601f19601f8301169050919050565b600061405782613ff5565b6140618185614000565b9350614071818560208601614011565b61407a8161403b565b840191505092915050565b6000602082019050818103600083015261409f818461404c565b905092915050565b6140b081613f06565b81146140bb57600080fd5b50565b6000813590506140cd816140a7565b92915050565b6000602082840312156140e9576140e8613e71565b5b60006140f7848285016140be565b91505092915050565b61410981613e9b565b82525050565b60006020820190506141246000830184614100565b92915050565b6000806040838503121561414157614140613e71565b5b600061414f85828601613ec4565b9250506020614160858286016140be565b9150509250929050565b60008060006060848603121561418357614182613e71565b5b600061419186828701613ec4565b93505060206141a286828701613ec4565b92505060406141b3868287016140be565b9150509250925092565b6000819050919050565b6141d0816141bd565b82525050565b60006020820190506141eb60008301846141c7565b92915050565b6141fa816141bd565b811461420557600080fd5b50565b600081359050614217816141f1565b92915050565b60006020828403121561423357614232613e71565b5b600061424184828501614208565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6142878261403b565b810181811067ffffffffffffffff821117156142a6576142a561424f565b5b80604052505050565b60006142b9613e67565b90506142c5828261427e565b919050565b600067ffffffffffffffff8211156142e5576142e461424f565b5b602082029050602081019050919050565b600080fd5b600061430e614309846142ca565b6142af565b90508083825260208201905060208402830185811115614331576143306142f6565b5b835b8181101561435a57806143468882614208565b845260208401935050602081019050614333565b5050509392505050565b600082601f8301126143795761437861424a565b5b81356143898482602086016142fb565b91505092915050565b600080604083850312156143a9576143a8613e71565b5b600083013567ffffffffffffffff8111156143c7576143c6613e76565b5b6143d385828601614364565b92505060206143e4858286016140be565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561440e5761440d61424f565b5b6144178261403b565b9050602081019050919050565b82818337600083830152505050565b6000614446614441846143f3565b6142af565b905082815260208101848484011115614462576144616143ee565b5b61446d848285614424565b509392505050565b600082601f83011261448a5761448961424a565b5b813561449a848260208601614433565b91505092915050565b6000602082840312156144b9576144b8613e71565b5b600082013567ffffffffffffffff8111156144d7576144d6613e76565b5b6144e384828501614475565b91505092915050565b600080fd5b60008083601f8401126145075761450661424a565b5b8235905067ffffffffffffffff811115614524576145236144ec565b5b6020830191508360208202830111156145405761453f6142f6565b5b9250929050565b6000806020838503121561455e5761455d613e71565b5b600083013567ffffffffffffffff81111561457c5761457b613e76565b5b614588858286016144f1565b92509250509250929050565b61459d81613fbf565b81146145a857600080fd5b50565b6000813590506145ba81614594565b92915050565b600080604083850312156145d7576145d6613e71565b5b60006145e585828601613ec4565b92505060206145f6858286016145ab565b9150509250929050565b600067ffffffffffffffff82111561461b5761461a61424f565b5b6146248261403b565b9050602081019050919050565b600061464461463f84614600565b6142af565b9050828152602081018484840111156146605761465f6143ee565b5b61466b848285614424565b509392505050565b600082601f8301126146885761468761424a565b5b8135614698848260208601614631565b91505092915050565b600080600080608085870312156146bb576146ba613e71565b5b60006146c987828801613ec4565b94505060206146da87828801613ec4565b93505060406146eb878288016140be565b925050606085013567ffffffffffffffff81111561470c5761470b613e76565b5b61471887828801614673565b91505092959194509250565b6000806040838503121561473b5761473a613e71565b5b600061474985828601613ec4565b925050602061475a85828601613ec4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806147ab57607f821691505b6020821081036147be576147bd614764565b5b50919050565b7f496e76616c6964206d61726b6574706c61636500000000000000000000000000600082015250565b60006147fa601383614000565b9150614805826147c4565b602082019050919050565b60006020820190508181036000830152614829816147ed565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614866602083614000565b915061487182614830565b602082019050919050565b6000602082019050818103600083015261489581614859565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b60006148d2601e83614000565b91506148dd8261489c565b602082019050919050565b60006020820190508181036000830152614901816148c5565b9050919050565b7f204e6f7420616374697665207965740000000000000000000000000000000000600082015250565b600061493e600f83614000565b915061494982614908565b602082019050919050565b6000602082019050818103600083015261496d81614931565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006149ae82613f06565b91506149b983613f06565b92508282019050808211156149d1576149d0614974565b5b92915050565b7f5468657265206973206e6f206d6f726520776f6c76657320746f206d696e742160008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a33602183614000565b9150614a3e826149d7565b604082019050919050565b60006020820190508181036000830152614a6281614a26565b9050919050565b7f546f206d75636820576f766c6573000000000000000000000000000000000000600082015250565b6000614a9f600e83614000565b9150614aaa82614a69565b602082019050919050565b60006020820190508181036000830152614ace81614a92565b9050919050565b6000614ae082613f06565b9150614aeb83613f06565b9250828202614af981613f06565b91508282048414831517614b1057614b0f614974565b5b5092915050565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b6000614b4d601483614000565b9150614b5882614b17565b602082019050919050565b60006020820190508181036000830152614b7c81614b40565b9050919050565b7f416c726561647920636c61696d656420746865206d617820616d6f756e74206f60008201527f6620776f6c76657320616c6c6f77656400000000000000000000000000000000602082015250565b6000614bdf603083614000565b9150614bea82614b83565b604082019050919050565b60006020820190508181036000830152614c0e81614bd2565b9050919050565b60008160601b9050919050565b6000614c2d82614c15565b9050919050565b6000614c3f82614c22565b9050919050565b614c57614c5282613e9b565b614c34565b82525050565b6000614c698284614c46565b60148201915081905092915050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614cae600d83614000565b9150614cb982614c78565b602082019050919050565b60006020820190508181036000830152614cdd81614ca1565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614d467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614d09565b614d508683614d09565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614d8d614d88614d8384613f06565b614d68565b613f06565b9050919050565b6000819050919050565b614da783614d72565b614dbb614db382614d94565b848454614d16565b825550505050565b600090565b614dd0614dc3565b614ddb818484614d9e565b505050565b5b81811015614dff57614df4600082614dc8565b600181019050614de1565b5050565b601f821115614e4457614e1581614ce4565b614e1e84614cf9565b81016020851015614e2d578190505b614e41614e3985614cf9565b830182614de0565b50505b505050565b600082821c905092915050565b6000614e6760001984600802614e49565b1980831691505092915050565b6000614e808383614e56565b9150826002028217905092915050565b614e9982613ff5565b67ffffffffffffffff811115614eb257614eb161424f565b5b614ebc8254614793565b614ec7828285614e03565b600060209050601f831160018114614efa5760008415614ee8578287015190505b614ef28582614e74565b865550614f5a565b601f198416614f0886614ce4565b60005b82811015614f3057848901518255600182019150602085019450602081019050614f0b565b86831015614f4d5784890151614f49601f891682614e56565b8355505b6001600288020188555050505b505050505050565b7f596f7520617265206e6f742061207465616d206d656d65626572000000000000600082015250565b6000614f98601a83614000565b9150614fa382614f62565b602082019050919050565b60006020820190508181036000830152614fc781614f8b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061500882613f06565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361503a57615039614974565b5b600182019050919050565b600081905092915050565b600061505b82613ff5565b6150658185615045565b9350615075818560208601614011565b80840191505092915050565b600061508d8285615050565b91506150998284615050565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615101602683614000565b915061510c826150a5565b604082019050919050565b60006020820190508181036000830152615130816150f4565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061515e82615137565b6151688185615142565b9350615178818560208601614011565b6151818161403b565b840191505092915050565b60006080820190506151a16000830187614100565b6151ae6020830186614100565b6151bb6040830185613f10565b81810360608301526151cd8184615153565b905095945050505050565b6000815190506151e781613f66565b92915050565b60006020828403121561520357615202613e71565b5b6000615211848285016151d8565b9150509291505056fea264697066735822122061800e72587edddf9137440bed5f0696817034d4703878c2350df19efd34a3b364736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102e45760003560e01c8063746149b611610190578063b88d4fde116100dc578063df2980de11610095578063e985e9c51161006f578063e985e9c514610aa1578063f0e6b02314610ade578063f0f333ec14610af5578063f2fde38b14610b32576102e4565b8063df2980de14610a31578063e7d387fe14610a4d578063e8bd7c6914610a76576102e4565b8063b88d4fde14610956578063c7f8d01a14610972578063c87b56dd1461099d578063c9fc2ace146109da578063ca44183914610a03578063d4e0205d14610a1a576102e4565b80639fee147011610149578063a6d612f911610123578063a6d612f9146108a9578063a927dc6d146108c5578063b6a1dba1146108ee578063b7f329d31461092b576102e4565b80639fee147014610848578063a0712d6814610864578063a22cb46514610880576102e4565b8063746149b61461075e5780638da5cb5b146107755780638e1f9cfe146107a057806395d89b41146107cb5780639f81de78146107f65780639fe577ce1461081f576102e4565b80633ccfd60b1161024f57806355f804b3116102085780636661a51f116101e25780636661a51f14610690578063685cff77146106cd57806370a082311461070a578063715018a614610747576102e4565b806355f804b31461060e57806357260bdc146106375780636352211e14610653576102e4565b80633ccfd60b14610539578063408337dc1461054357806342842e0e1461058057806346c456b01461059c5780634aa5ea04146105b85780634eeaeccd146105e3576102e4565b806318160ddd116102a157806318160ddd1461042457806323b872dd1461044f578063301f77451461046b578063360bede81461049657806337e4f2f6146104bf5780633a77d43a146104fc576102e4565b806301cd5e2b146102e957806301ffc9a71461032657806306fdde0314610363578063081812fc1461038e578063095ea7b3146103cb5780630e528f7f146103e7575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b9190613ed9565b610b5b565b60405161031d9190613f1f565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613f92565b610b73565b60405161035a9190613fda565b60405180910390f35b34801561036f57600080fd5b50610378610c05565b6040516103859190614085565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b091906140d3565b610c97565b6040516103c2919061410f565b60405180910390f35b6103e560048036038101906103e0919061412a565b610d16565b005b3480156103f357600080fd5b5061040e60048036038101906104099190613ed9565b610db0565b60405161041b9190613f1f565b60405180910390f35b34801561043057600080fd5b50610439610dc8565b6040516104469190613f1f565b60405180910390f35b6104696004803603810190610464919061416a565b610ddf565b005b34801561047757600080fd5b50610480611101565b60405161048d91906141d6565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b8919061421d565b611107565b005b3480156104cb57600080fd5b506104e660048036038101906104e19190613ed9565b61118d565b6040516104f39190613f1f565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e9190613ed9565b6111a5565b6040516105309190613f1f565b60405180910390f35b6105416111bd565b005b34801561054f57600080fd5b5061056a60048036038101906105659190613ed9565b611289565b6040516105779190613fda565b60405180910390f35b61059a6004803603810190610595919061416a565b6112a9565b005b6105b660048036038101906105b19190614392565b6112c9565b005b3480156105c457600080fd5b506105cd61165d565b6040516105da9190613f1f565b60405180910390f35b3480156105ef57600080fd5b506105f8611663565b60405161060591906141d6565b60405180910390f35b34801561061a57600080fd5b50610635600480360381019061063091906144a3565b611669565b005b610651600480360381019061064c91906140d3565b6116f8565b005b34801561065f57600080fd5b5061067a600480360381019061067591906140d3565b611a44565b604051610687919061410f565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b29190613ed9565b611a56565b6040516106c49190613fda565b60405180910390f35b3480156106d957600080fd5b506106f460048036038101906106ef9190613ed9565b611a76565b6040516107019190613f1f565b60405180910390f35b34801561071657600080fd5b50610731600480360381019061072c9190613ed9565b611a8e565b60405161073e9190613f1f565b60405180910390f35b34801561075357600080fd5b5061075c611b46565b005b34801561076a57600080fd5b50610773611bce565b005b34801561078157600080fd5b5061078a611c67565b604051610797919061410f565b60405180910390f35b3480156107ac57600080fd5b506107b5611c91565b6040516107c291906141d6565b60405180910390f35b3480156107d757600080fd5b506107e0611c97565b6040516107ed9190614085565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190614547565b611d29565b005b34801561082b57600080fd5b50610846600480360381019061084191906145c0565b611e4a565b005b610862600480360381019061085d91906140d3565b611f21565b005b61087e600480360381019061087991906140d3565b612229565b005b34801561088c57600080fd5b506108a760048036038101906108a291906145c0565b612544565b005b6108c360048036038101906108be9190614392565b6125de565b005b3480156108d157600080fd5b506108ec60048036038101906108e7919061421d565b612972565b005b3480156108fa57600080fd5b5061091560048036038101906109109190613ed9565b6129f8565b6040516109229190613fda565b60405180910390f35b34801561093757600080fd5b50610940612a18565b60405161094d9190613f1f565b60405180910390f35b610970600480360381019061096b91906146a1565b612a1e565b005b34801561097e57600080fd5b50610987612a91565b6040516109949190613f1f565b60405180910390f35b3480156109a957600080fd5b506109c460048036038101906109bf91906140d3565b612a97565b6040516109d19190614085565b60405180910390f35b3480156109e657600080fd5b50610a0160048036038101906109fc9190614547565b612b35565b005b348015610a0f57600080fd5b50610a18612c56565b005b348015610a2657600080fd5b50610a2f612cef565b005b610a4b6004803603810190610a469190614392565b612d88565b005b348015610a5957600080fd5b50610a746004803603810190610a6f919061421d565b61311c565b005b348015610a8257600080fd5b50610a8b6131a2565b604051610a989190613f1f565b60405180910390f35b348015610aad57600080fd5b50610ac86004803603810190610ac39190614724565b6131a8565b604051610ad59190613fda565b60405180910390f35b348015610aea57600080fd5b50610af361323c565b005b348015610b0157600080fd5b50610b1c6004803603810190610b179190613ed9565b6132d5565b604051610b299190613f1f565b60405180910390f35b348015610b3e57600080fd5b50610b596004803603810190610b549190613ed9565b6132ed565b005b60166020528060005260406000206000915090505481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bce57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bfe5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610c1490614793565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4090614793565b8015610c8d5780601f10610c6257610100808354040283529160200191610c8d565b820191906000526020600020905b815481529060010190602001808311610c7057829003601f168201915b5050505050905090565b6000610ca2826133e4565b610cd8576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990614810565b60405180910390fd5b610dac8282613443565b5050565b60186020528060005260406000206000915090505481565b6000610dd2613587565b6001546000540303905090565b6000610dea8261358c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e51576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e5d84613658565b91509150610e738187610e6e61367f565b613687565b610ebf57610e8886610e8361367f565b6131a8565b610ebe576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f25576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f3286868660016136cb565b8015610f3d57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061100b85610fe78888876136d1565b7c0200000000000000000000000000000000000000000000000000000000176136f9565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611091576000600185019050600060046000838152602001908152602001600020540361108f57600054811461108e578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110f98686866001613724565b505050505050565b60105481565b61110f61372a565b73ffffffffffffffffffffffffffffffffffffffff1661112d611c67565b73ffffffffffffffffffffffffffffffffffffffff1614611183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117a9061487c565b60405180910390fd5b8060128190555050565b601a6020528060005260406000206000915090505481565b60176020528060005260406000206000915090505481565b6111c561372a565b73ffffffffffffffffffffffffffffffffffffffff166111e3611c67565b73ffffffffffffffffffffffffffffffffffffffff1614611239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112309061487c565b60405180910390fd5b611241611c67565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611286573d6000803e3d6000fd5b50565b601b6020528060005260406000206000915054906101000a900460ff1681565b6112c483838360405180602001604052806000815250612a1e565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132e906148e8565b60405180910390fd5b600e60019054906101000a900460ff16611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d90614954565b60405180910390fd5b60095481611392610dc8565b61139c91906149a3565b11156113dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d490614a49565b60405180910390fd5b6002601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261142a91906149a3565b111561146b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146290614ab5565b60405180910390fd5b80600b546114799190614ad5565b3410156114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b290614b63565b60405180910390fd5b6002601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561153e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153590614bf5565b60405180910390fd5b6000336040516020016115519190614c5d565b6040516020818303038152906040528051906020012090506115768360115483613732565b6115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac90614cc4565b60405180910390fd5b6115bf3383613749565b81601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160e91906149a3565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f65b0cebb1fbcbb1b6f14e1523267a1b03947b67a4211700d7c6a53723f31f76960405160405180910390a2505050565b600b5481565b60115481565b61167161372a565b73ffffffffffffffffffffffffffffffffffffffff1661168f611c67565b73ffffffffffffffffffffffffffffffffffffffff16146116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc9061487c565b60405180910390fd5b80600f90816116f49190614e90565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175d906148e8565b60405180910390fd5b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e990614fae565b60405180910390fd5b600954816117fe610dc8565b61180891906149a3565b1115611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184090614a49565b60405180910390fd5b600281111561188d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188490614ab5565b60405180910390fd5b6004601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826118da91906149a3565b111561191b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191290614ab5565b60405180910390fd5b6004601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561199e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199590614bf5565b60405180910390fd5b6119a83382613749565b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119f791906149a3565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f7b1831ca5a7298ee7807ae7cd91fc540d9f5f717a4d85304822564b7e2a1583f60405160405180910390a250565b6000611a4f8261358c565b9050919050565b60146020528060005260406000206000915054906101000a900460ff1681565b60156020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611af5576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611b4e61372a565b73ffffffffffffffffffffffffffffffffffffffff16611b6c611c67565b73ffffffffffffffffffffffffffffffffffffffff1614611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb99061487c565b60405180910390fd5b611bcc6000613767565b565b611bd661372a565b73ffffffffffffffffffffffffffffffffffffffff16611bf4611c67565b73ffffffffffffffffffffffffffffffffffffffff1614611c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c419061487c565b60405180910390fd5b6001600e60036101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60125481565b606060038054611ca690614793565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd290614793565b8015611d1f5780601f10611cf457610100808354040283529160200191611d1f565b820191906000526020600020905b815481529060010190602001808311611d0257829003601f168201915b5050505050905090565b611d3161372a565b73ffffffffffffffffffffffffffffffffffffffff16611d4f611c67565b73ffffffffffffffffffffffffffffffffffffffff1614611da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9c9061487c565b60405180910390fd5b60005b82829050811015611e4557600160146000858585818110611dcc57611dcb614fce565b5b9050602002016020810190611de19190613ed9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611e3d90614ffd565b915050611da8565b505050565b611e5261372a565b73ffffffffffffffffffffffffffffffffffffffff16611e70611c67565b73ffffffffffffffffffffffffffffffffffffffff1614611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd9061487c565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f86906148e8565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661201b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201290614fae565b60405180910390fd5b60095481612027610dc8565b61203191906149a3565b1115612072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206990614a49565b60405180910390fd5b6002601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826120bf91906149a3565b1115612100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f790614ab5565b60405180910390fd5b6002601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217a90614bf5565b60405180910390fd5b61218d3382613749565b80601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121dc91906149a3565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f9c0272db5e0307019dcb733c3df30e8770fe0f5dcb9d4bab1b5b8405bfa48a8a60405160405180910390a250565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228e906148e8565b60405180910390fd5b600e60039054906101000a900460ff166122e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dd90614954565b60405180910390fd5b600954816122f2610dc8565b6122fc91906149a3565b111561233d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233490614a49565b60405180910390fd5b6005601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261238a91906149a3565b11156123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c290614ab5565b60405180910390fd5b80600d546123d99190614ad5565b34101561241b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241290614b63565b60405180910390fd5b6005601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561249e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249590614bf5565b60405180910390fd5b6124a83382613749565b80601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f791906149a3565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f90ddedd5a25821bba11fbb98de02ec1f75c1be90ae147d6450ce873e7b78b5d860405160405180910390a250565b601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c790614810565b60405180910390fd5b6125da828261382d565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461264c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612643906148e8565b60405180910390fd5b600e60029054906101000a900460ff1661269b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269290614954565b60405180910390fd5b600954816126a7610dc8565b6126b191906149a3565b11156126f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e990614a49565b60405180910390fd5b6002601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261273f91906149a3565b1115612780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277790614ab5565b60405180910390fd5b80600c5461278e9190614ad5565b3410156127d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c790614b63565b60405180910390fd5b6002601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284a90614bf5565b60405180910390fd5b6000336040516020016128669190614c5d565b60405160208183030381529060405280519060200120905061288b8360115483613732565b6128ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c190614cc4565b60405180910390fd5b6128d43383613749565b81601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461292391906149a3565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f35f90f43eccaa966ec95bfc95d23a6258c82a2b701d4157a29dead025320bddf60405160405180910390a2505050565b61297a61372a565b73ffffffffffffffffffffffffffffffffffffffff16612998611c67565b73ffffffffffffffffffffffffffffffffffffffff16146129ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e59061487c565b60405180910390fd5b8060108190555050565b60136020528060005260406000206000915054906101000a900460ff1681565b600a5481565b612a29848484610ddf565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612a8b57612a5484848484613938565b612a8a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600c5481565b6060612aa2826133e4565b612ad8576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612ae2613a88565b90506000815103612b025760405180602001604052806000815250612b2d565b80612b0c84613b1a565b604051602001612b1d929190615081565b6040516020818303038152906040525b915050919050565b612b3d61372a565b73ffffffffffffffffffffffffffffffffffffffff16612b5b611c67565b73ffffffffffffffffffffffffffffffffffffffff1614612bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba89061487c565b60405180910390fd5b60005b82829050811015612c5157600160136000858585818110612bd857612bd7614fce565b5b9050602002016020810190612bed9190613ed9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612c4990614ffd565b915050612bb4565b505050565b612c5e61372a565b73ffffffffffffffffffffffffffffffffffffffff16612c7c611c67565b73ffffffffffffffffffffffffffffffffffffffff1614612cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc99061487c565b60405180910390fd5b6001600e60026101000a81548160ff021916908315150217905550565b612cf761372a565b73ffffffffffffffffffffffffffffffffffffffff16612d15611c67565b73ffffffffffffffffffffffffffffffffffffffff1614612d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d629061487c565b60405180910390fd5b6001600e60006101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ded906148e8565b60405180910390fd5b600e60009054906101000a900460ff16612e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3c90614954565b60405180910390fd5b60095481612e51610dc8565b612e5b91906149a3565b1115612e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9390614a49565b60405180910390fd5b6003601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482612ee991906149a3565b1115612f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2190614ab5565b60405180910390fd5b80600a54612f389190614ad5565b341015612f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7190614b63565b60405180910390fd5b6003601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff490614bf5565b60405180910390fd5b6000336040516020016130109190614c5d565b6040516020818303038152906040528051906020012090506130358360105483613732565b613074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306b90614cc4565b60405180910390fd5b61307e3383613749565b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130cd91906149a3565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f6958dd5376df34fe6ffd22ebebf27a81d8f7b39d40d95cd29924f0f56c9174ab60405160405180910390a2505050565b61312461372a565b73ffffffffffffffffffffffffffffffffffffffff16613142611c67565b73ffffffffffffffffffffffffffffffffffffffff1614613198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318f9061487c565b60405180910390fd5b8060118190555050565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61324461372a565b73ffffffffffffffffffffffffffffffffffffffff16613262611c67565b73ffffffffffffffffffffffffffffffffffffffff16146132b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132af9061487c565b60405180910390fd5b6001600e60016101000a81548160ff021916908315150217905550565b60196020528060005260406000206000915090505481565b6132f561372a565b73ffffffffffffffffffffffffffffffffffffffff16613313611c67565b73ffffffffffffffffffffffffffffffffffffffff1614613369576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133609061487c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036133d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cf90615117565b60405180910390fd5b6133e181613767565b50565b6000816133ef613587565b111580156133fe575060005482105b801561343c575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600061344e82611a44565b90508073ffffffffffffffffffffffffffffffffffffffff1661346f61367f565b73ffffffffffffffffffffffffffffffffffffffff16146134d25761349b8161349661367f565b6131a8565b6134d1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000808290508061359b613587565b11613621576000548110156136205760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361361e575b600081036136145760046000836001900393508381526020019081526020016000205490506135ea565b8092505050613653565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86136e8868684613b6a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60008261373f8584613b73565b1490509392505050565b613763828260405180602001604052806000815250613be8565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806007600061383a61367f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166138e761367f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161392c9190613fda565b60405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261395e61367f565b8786866040518563ffffffff1660e01b8152600401613980949392919061518c565b6020604051808303816000875af19250505080156139bc57506040513d601f19601f820116820180604052508101906139b991906151ed565b60015b613a35573d80600081146139ec576040519150601f19603f3d011682016040523d82523d6000602084013e6139f1565b606091505b506000815103613a2d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f8054613a9790614793565b80601f0160208091040260200160405190810160405280929190818152602001828054613ac390614793565b8015613b105780601f10613ae557610100808354040283529160200191613b10565b820191906000526020600020905b815481529060010190602001808311613af357829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115613b5557600184039350600a81066030018453600a8104905080613b33575b50828103602084039350808452505050919050565b60009392505050565b60008082905060005b8451811015613bdd576000858281518110613b9a57613b99614fce565b5b60200260200101519050808311613bbc57613bb58382613c85565b9250613bc9565b613bc68184613c85565b92505b508080613bd590614ffd565b915050613b7c565b508091505092915050565b613bf28383613c9c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14613c8057600080549050600083820390505b613c326000868380600101945086613938565b613c68576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110613c1f578160005414613c7d57600080fd5b50505b505050565b600082600052816020526040600020905092915050565b60008054905060008203613cdc576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613ce960008483856136cb565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613d6083613d5160008660006136d1565b613d5a85613e57565b176136f9565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613e0157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613dc6565b5060008203613e3c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613e526000848385613724565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ea682613e7b565b9050919050565b613eb681613e9b565b8114613ec157600080fd5b50565b600081359050613ed381613ead565b92915050565b600060208284031215613eef57613eee613e71565b5b6000613efd84828501613ec4565b91505092915050565b6000819050919050565b613f1981613f06565b82525050565b6000602082019050613f346000830184613f10565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f6f81613f3a565b8114613f7a57600080fd5b50565b600081359050613f8c81613f66565b92915050565b600060208284031215613fa857613fa7613e71565b5b6000613fb684828501613f7d565b91505092915050565b60008115159050919050565b613fd481613fbf565b82525050565b6000602082019050613fef6000830184613fcb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561402f578082015181840152602081019050614014565b60008484015250505050565b6000601f19601f8301169050919050565b600061405782613ff5565b6140618185614000565b9350614071818560208601614011565b61407a8161403b565b840191505092915050565b6000602082019050818103600083015261409f818461404c565b905092915050565b6140b081613f06565b81146140bb57600080fd5b50565b6000813590506140cd816140a7565b92915050565b6000602082840312156140e9576140e8613e71565b5b60006140f7848285016140be565b91505092915050565b61410981613e9b565b82525050565b60006020820190506141246000830184614100565b92915050565b6000806040838503121561414157614140613e71565b5b600061414f85828601613ec4565b9250506020614160858286016140be565b9150509250929050565b60008060006060848603121561418357614182613e71565b5b600061419186828701613ec4565b93505060206141a286828701613ec4565b92505060406141b3868287016140be565b9150509250925092565b6000819050919050565b6141d0816141bd565b82525050565b60006020820190506141eb60008301846141c7565b92915050565b6141fa816141bd565b811461420557600080fd5b50565b600081359050614217816141f1565b92915050565b60006020828403121561423357614232613e71565b5b600061424184828501614208565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6142878261403b565b810181811067ffffffffffffffff821117156142a6576142a561424f565b5b80604052505050565b60006142b9613e67565b90506142c5828261427e565b919050565b600067ffffffffffffffff8211156142e5576142e461424f565b5b602082029050602081019050919050565b600080fd5b600061430e614309846142ca565b6142af565b90508083825260208201905060208402830185811115614331576143306142f6565b5b835b8181101561435a57806143468882614208565b845260208401935050602081019050614333565b5050509392505050565b600082601f8301126143795761437861424a565b5b81356143898482602086016142fb565b91505092915050565b600080604083850312156143a9576143a8613e71565b5b600083013567ffffffffffffffff8111156143c7576143c6613e76565b5b6143d385828601614364565b92505060206143e4858286016140be565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561440e5761440d61424f565b5b6144178261403b565b9050602081019050919050565b82818337600083830152505050565b6000614446614441846143f3565b6142af565b905082815260208101848484011115614462576144616143ee565b5b61446d848285614424565b509392505050565b600082601f83011261448a5761448961424a565b5b813561449a848260208601614433565b91505092915050565b6000602082840312156144b9576144b8613e71565b5b600082013567ffffffffffffffff8111156144d7576144d6613e76565b5b6144e384828501614475565b91505092915050565b600080fd5b60008083601f8401126145075761450661424a565b5b8235905067ffffffffffffffff811115614524576145236144ec565b5b6020830191508360208202830111156145405761453f6142f6565b5b9250929050565b6000806020838503121561455e5761455d613e71565b5b600083013567ffffffffffffffff81111561457c5761457b613e76565b5b614588858286016144f1565b92509250509250929050565b61459d81613fbf565b81146145a857600080fd5b50565b6000813590506145ba81614594565b92915050565b600080604083850312156145d7576145d6613e71565b5b60006145e585828601613ec4565b92505060206145f6858286016145ab565b9150509250929050565b600067ffffffffffffffff82111561461b5761461a61424f565b5b6146248261403b565b9050602081019050919050565b600061464461463f84614600565b6142af565b9050828152602081018484840111156146605761465f6143ee565b5b61466b848285614424565b509392505050565b600082601f8301126146885761468761424a565b5b8135614698848260208601614631565b91505092915050565b600080600080608085870312156146bb576146ba613e71565b5b60006146c987828801613ec4565b94505060206146da87828801613ec4565b93505060406146eb878288016140be565b925050606085013567ffffffffffffffff81111561470c5761470b613e76565b5b61471887828801614673565b91505092959194509250565b6000806040838503121561473b5761473a613e71565b5b600061474985828601613ec4565b925050602061475a85828601613ec4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806147ab57607f821691505b6020821081036147be576147bd614764565b5b50919050565b7f496e76616c6964206d61726b6574706c61636500000000000000000000000000600082015250565b60006147fa601383614000565b9150614805826147c4565b602082019050919050565b60006020820190508181036000830152614829816147ed565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614866602083614000565b915061487182614830565b602082019050919050565b6000602082019050818103600083015261489581614859565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b60006148d2601e83614000565b91506148dd8261489c565b602082019050919050565b60006020820190508181036000830152614901816148c5565b9050919050565b7f204e6f7420616374697665207965740000000000000000000000000000000000600082015250565b600061493e600f83614000565b915061494982614908565b602082019050919050565b6000602082019050818103600083015261496d81614931565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006149ae82613f06565b91506149b983613f06565b92508282019050808211156149d1576149d0614974565b5b92915050565b7f5468657265206973206e6f206d6f726520776f6c76657320746f206d696e742160008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a33602183614000565b9150614a3e826149d7565b604082019050919050565b60006020820190508181036000830152614a6281614a26565b9050919050565b7f546f206d75636820576f766c6573000000000000000000000000000000000000600082015250565b6000614a9f600e83614000565b9150614aaa82614a69565b602082019050919050565b60006020820190508181036000830152614ace81614a92565b9050919050565b6000614ae082613f06565b9150614aeb83613f06565b9250828202614af981613f06565b91508282048414831517614b1057614b0f614974565b5b5092915050565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b6000614b4d601483614000565b9150614b5882614b17565b602082019050919050565b60006020820190508181036000830152614b7c81614b40565b9050919050565b7f416c726561647920636c61696d656420746865206d617820616d6f756e74206f60008201527f6620776f6c76657320616c6c6f77656400000000000000000000000000000000602082015250565b6000614bdf603083614000565b9150614bea82614b83565b604082019050919050565b60006020820190508181036000830152614c0e81614bd2565b9050919050565b60008160601b9050919050565b6000614c2d82614c15565b9050919050565b6000614c3f82614c22565b9050919050565b614c57614c5282613e9b565b614c34565b82525050565b6000614c698284614c46565b60148201915081905092915050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614cae600d83614000565b9150614cb982614c78565b602082019050919050565b60006020820190508181036000830152614cdd81614ca1565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614d467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614d09565b614d508683614d09565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614d8d614d88614d8384613f06565b614d68565b613f06565b9050919050565b6000819050919050565b614da783614d72565b614dbb614db382614d94565b848454614d16565b825550505050565b600090565b614dd0614dc3565b614ddb818484614d9e565b505050565b5b81811015614dff57614df4600082614dc8565b600181019050614de1565b5050565b601f821115614e4457614e1581614ce4565b614e1e84614cf9565b81016020851015614e2d578190505b614e41614e3985614cf9565b830182614de0565b50505b505050565b600082821c905092915050565b6000614e6760001984600802614e49565b1980831691505092915050565b6000614e808383614e56565b9150826002028217905092915050565b614e9982613ff5565b67ffffffffffffffff811115614eb257614eb161424f565b5b614ebc8254614793565b614ec7828285614e03565b600060209050601f831160018114614efa5760008415614ee8578287015190505b614ef28582614e74565b865550614f5a565b601f198416614f0886614ce4565b60005b82811015614f3057848901518255600182019150602085019450602081019050614f0b565b86831015614f4d5784890151614f49601f891682614e56565b8355505b6001600288020188555050505b505050505050565b7f596f7520617265206e6f742061207465616d206d656d65626572000000000000600082015250565b6000614f98601a83614000565b9150614fa382614f62565b602082019050919050565b60006020820190508181036000830152614fc781614f8b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061500882613f06565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361503a57615039614974565b5b600182019050919050565b600081905092915050565b600061505b82613ff5565b6150658185615045565b9350615075818560208601614011565b80840191505092915050565b600061508d8285615050565b91506150998284615050565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615101602683614000565b915061510c826150a5565b604082019050919050565b60006020820190508181036000830152615130816150f4565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061515e82615137565b6151688185615142565b9350615178818560208601614011565b6151818161403b565b840191505092915050565b60006080820190506151a16000830187614100565b6151ae6020830186614100565b6151bb6040830185613f10565b81810360608301526151cd8184615153565b905095945050505050565b6000815190506151e781613f66565b92915050565b60006020828403121561520357615202613e71565b5b6000615211848285016151d8565b9150509291505056fea264697066735822122061800e72587edddf9137440bed5f0696817034d4703878c2350df19efd34a3b364736f6c63430008120033

Deployed Bytecode Sourcemap

57339:8297:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58045:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24234:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25136:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31627:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59155:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58159:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20887:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35266:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57762:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60278:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58267:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58102:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65411:114;;;:::i;:::-;;58328:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38187:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61340:877;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57467:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57802:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59848:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64358:662;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26529:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57933:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57988:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22071:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5013:103;;;;;;;;;;;;;:::i;:::-;;65318:85;;;;;;;;;;;;;:::i;:::-;;4362:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57841:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25312:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58952:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59568:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63763:587;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63119:636;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59342:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62225:886;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59958:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57884:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57419:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38978:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57515:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25522:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58757:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65219:91;;;;;;;;;;;;;:::i;:::-;;65028:88;;;;;;;;;;;;;:::i;:::-;;60444:880;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60120:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57557:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32576:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65124:87;;;;;;;;;;;;;:::i;:::-;;58215:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5271:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58045:50;;;;;;;;;;;;;;;;;:::o;24234:639::-;24319:4;24658:10;24643:25;;:11;:25;;;;:102;;;;24735:10;24720:25;;:11;:25;;;;24643:102;:179;;;;24812:10;24797:25;;:11;:25;;;;24643:179;24623:199;;24234:639;;;:::o;25136:100::-;25190:13;25223:5;25216:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25136:100;:::o;31627:218::-;31703:7;31728:16;31736:7;31728;:16::i;:::-;31723:64;;31753:34;;;;;;;;;;;;;;31723:64;31807:15;:24;31823:7;31807:24;;;;;;;;;;;:30;;;;;;;;;;;;31800:37;;31627:218;;;:::o;59155:179::-;59247:19;:23;59267:2;59247:23;;;;;;;;;;;;;;;;;;;;;;;;;59239:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;59305:21;59319:2;59323;59305:13;:21::i;:::-;59155:179;;:::o;58159:49::-;;;;;;;;;;;;;;;;;:::o;20887:323::-;20948:7;21176:15;:13;:15::i;:::-;21161:12;;21145:13;;:28;:46;21138:53;;20887:323;:::o;35266:2825::-;35408:27;35438;35457:7;35438:18;:27::i;:::-;35408:57;;35523:4;35482:45;;35498:19;35482:45;;;35478:86;;35536:28;;;;;;;;;;;;;;35478:86;35578:27;35607:23;35634:35;35661:7;35634:26;:35::i;:::-;35577:92;;;;35769:68;35794:15;35811:4;35817:19;:17;:19::i;:::-;35769:24;:68::i;:::-;35764:180;;35857:43;35874:4;35880:19;:17;:19::i;:::-;35857:16;:43::i;:::-;35852:92;;35909:35;;;;;;;;;;;;;;35852:92;35764:180;35975:1;35961:16;;:2;:16;;;35957:52;;35986:23;;;;;;;;;;;;;;35957:52;36022:43;36044:4;36050:2;36054:7;36063:1;36022:21;:43::i;:::-;36158:15;36155:160;;;36298:1;36277:19;36270:30;36155:160;36695:18;:24;36714:4;36695:24;;;;;;;;;;;;;;;;36693:26;;;;;;;;;;;;36764:18;:22;36783:2;36764:22;;;;;;;;;;;;;;;;36762:24;;;;;;;;;;;37086:146;37123:2;37172:45;37187:4;37193:2;37197:19;37172:14;:45::i;:::-;17286:8;37144:73;37086:18;:146::i;:::-;37057:17;:26;37075:7;37057:26;;;;;;;;;;;:175;;;;37403:1;17286:8;37352:19;:47;:52;37348:627;;37425:19;37457:1;37447:7;:11;37425:33;;37614:1;37580:17;:30;37598:11;37580:30;;;;;;;;;;;;:35;37576:384;;37718:13;;37703:11;:28;37699:242;;37898:19;37865:17;:30;37883:11;37865:30;;;;;;;;;;;:52;;;;37699:242;37576:384;37406:569;37348:627;38022:7;38018:2;38003:27;;38012:4;38003:27;;;;;;;;;;;;38041:42;38062:4;38068:2;38072:7;38081:1;38041:20;:42::i;:::-;35397:2694;;;35266:2825;;;:::o;57762:33::-;;;;:::o;60278:158::-;4593:12;:10;:12::i;:::-;4582:23;;:7;:5;:7::i;:::-;:23;;;4574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60408:20:::1;60386:19;:42;;;;60278:158:::0;:::o;58267:48::-;;;;;;;;;;;;;;;;;:::o;58102:50::-;;;;;;;;;;;;;;;;;:::o;65411:114::-;4593:12;:10;:12::i;:::-;4582:23;;:7;:5;:7::i;:::-;:23;;;4574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65477:7:::1;:5;:7::i;:::-;65469:25;;:48;65495:21;65469:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;65411:114::o:0;58328:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;38187:193::-;38333:39;38350:4;38356:2;38360:7;38333:39;;;;;;;;;;;;:16;:39::i;:::-;38187:193;;;:::o;61340:877::-;59775:10;59762:23;;:9;:23;;;59754:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;61452:11:::1;;;;;;;;;;;61444:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;61532:10;;61519:8;61503:13;:11;:13::i;:::-;:24;;;;:::i;:::-;61502:40;;61494:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;61640:1;61610:14;:26;61625:10;61610:26;;;;;;;;;;;;;;;;61599:8;:37;;;;:::i;:::-;:42;;61591:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;61708:8;61693:12;;:23;;;;:::i;:::-;61680:9;:36;;61671:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;61805:1;61775:14;:26;61790:10;61775:26;;;;;;;;;;;;;;;;:31;;61753:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;61895:12;61937:10;61920:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;61910:39;;;;;;61895:54;;61982:50;62001:5;62008:17;;62027:4;61982:18;:50::i;:::-;61960:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;62088:31;62098:10;62110:8;62088:9;:31::i;:::-;62160:8;62130:14;:26;62145:10;62130:26;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;62198:10;62184:25;;;;;;;;;;;;61433:784;61340:877:::0;;:::o;57467:41::-;;;;:::o;57802:32::-;;;;:::o;59848:102::-;4593:12;:10;:12::i;:::-;4582:23;;:7;:5;:7::i;:::-;:23;;;4574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59933:9:::1;59923:7;:19;;;;;;:::i;:::-;;59848:102:::0;:::o;64358:662::-;59775:10;59762:23;;:9;:23;;;59754:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;64447:12:::1;:24;64460:10;64447:24;;;;;;;;;;;;;;;;;;;;;;;;;64439:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;64551:10;;64538:8;64522:13;:11;:13::i;:::-;:24;;;;:::i;:::-;64521:40;;64513:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;64630:1;64618:8;:13;;64610:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;64709:1;64680:13;:25;64694:10;64680:25;;;;;;;;;;;;;;;;64669:8;:36;;;;:::i;:::-;:41;;64661:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64791:1;64762:13;:25;64776:10;64762:25;;;;;;;;;;;;;;;;:30;;64740:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;64891:31;64901:10;64913:8;64891:9;:31::i;:::-;64962:8;64933:13;:25;64947:10;64933:25;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;65001:10;64986:26;;;;;;;;;;;;64358:662:::0;:::o;26529:152::-;26601:7;26644:27;26663:7;26644:18;:27::i;:::-;26621:52;;26529:152;;;:::o;57933:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;57988:50::-;;;;;;;;;;;;;;;;;:::o;22071:233::-;22143:7;22184:1;22167:19;;:5;:19;;;22163:60;;22195:28;;;;;;;;;;;;;;22163:60;16230:13;22241:18;:25;22260:5;22241:25;;;;;;;;;;;;;;;;:55;22234:62;;22071:233;;;:::o;5013:103::-;4593:12;:10;:12::i;:::-;4582:23;;:7;:5;:7::i;:::-;:23;;;4574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5078:30:::1;5105:1;5078:18;:30::i;:::-;5013:103::o:0;65318:85::-;4593:12;:10;:12::i;:::-;4582:23;;:7;:5;:7::i;:::-;:23;;;4574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65391:4:::1;65378:10;;:17;;;;;;;;;;;;;;;;;;65318:85::o:0;4362:87::-;4408:7;4435:6;;;;;;;;;;;4428:13;;4362:87;:::o;57841:34::-;;;;:::o;25312:104::-;25368:13;25401:7;25394:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25312:104;:::o;58952:195::-;4593:12;:10;:12::i;:::-;4582:23;;:7;:5;:7::i;:::-;:23;;;4574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59039:9:::1;59035:105;59058:9;;:16;;59054:1;:20;59035:105;;;59124:4;59095:12;:26;59108:9;;59118:1;59108:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;59095:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;59076:3;;;;;:::i;:::-;;;;59035:105;;;;58952:195:::0;;:::o;59568:143::-;4593:12;:10;:12::i;:::-;4582:23;;:7;:5;:7::i;:::-;:23;;;4574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59696:7:::1;59661:19;:32;59681:11;59661:32;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;59568:143:::0;;:::o;63763:587::-;59775:10;59762:23;;:9;:23;;;59754:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;63848:8:::1;:20;63857:10;63848:20;;;;;;;;;;;;;;;;;;;;;;;;;63840:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;63948:10;;63935:8;63919:13;:11;:13::i;:::-;:24;;;;:::i;:::-;63918:40;;63910:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;64051:1;64026:9;:21;64036:10;64026:21;;;;;;;;;;;;;;;;64015:8;:32;;;;:::i;:::-;:37;;64007:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;64129:1;64104:9;:21;64114:10;64104:21;;;;;;;;;;;;;;;;:26;;64082:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;64229:31;64239:10;64251:8;64229:9;:31::i;:::-;64296:8;64271:9;:21;64281:10;64271:21;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;64331:10;64320:22;;;;;;;;;;;;63763:587:::0;:::o;63119:636::-;59775:10;59762:23;;:9;:23;;;59754:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;63200:10:::1;;;;;;;;;;;63192:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;63279:10;;63266:8;63250:13;:11;:13::i;:::-;:24;;;;:::i;:::-;63249:40;;63241:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;63385:1;63357:12;:24;63370:10;63357:24;;;;;;;;;;;;;;;;63346:8;:35;;;;:::i;:::-;:40;;63338:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;63450:8;63438:9;;:20;;;;:::i;:::-;63425:9;:33;;63416:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63545:1;63517:12;:24;63530:10;63517:24;;;;;;;;;;;;;;;;:29;;63495:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;63635:31;63645:10;63657:8;63635:9;:31::i;:::-;63705:8;63677:12;:24;63690:10;63677:24;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;63736:10;63729:18;;;;;;;;;;;;63119:636:::0;:::o;59342:218::-;59445:19;:29;59465:8;59445:29;;;;;;;;;;;;;;;;;;;;;;;;;59437:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;59509:43;59533:8;59543;59509:23;:43::i;:::-;59342:218;;:::o;62225:886::-;59775:10;59762:23;;:9;:23;;;59754:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62339:13:::1;;;;;;;;;;;62331:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;62421:10;;62408:8;62392:13;:11;:13::i;:::-;:24;;;;:::i;:::-;62391:40;;62383:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;62529:1;62499:14;:26;62514:10;62499:26;;;;;;;;;;;;;;;;62488:8;:37;;;;:::i;:::-;:42;;62480:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;62592:8;62582:7;;:18;;;;:::i;:::-;62569:9;:31;;62560:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62699:1;62669:14;:26;62684:10;62669:26;;;;;;;;;;;;;;;;:31;;62647:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;62789:12;62831:10;62814:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;62804:39;;;;;;62789:54;;62876:50;62895:5;62902:17;;62921:4;62876:18;:50::i;:::-;62854:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;62980:31;62990:10;63002:8;62980:9;:31::i;:::-;63052:8;63022:14;:26;63037:10;63022:26;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;63092:10;63076:27;;;;;;;;;;;;62320:791;62225:886:::0;;:::o;59958:154::-;4593:12;:10;:12::i;:::-;4582:23;;:7;:5;:7::i;:::-;:23;;;4574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60085:19:::1;60064:18;:40;;;;59958:154:::0;:::o;57884:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;57419:41::-;;;;:::o;38978:407::-;39153:31;39166:4;39172:2;39176:7;39153:12;:31::i;:::-;39217:1;39199:2;:14;;;:19;39195:183;;39238:56;39269:4;39275:2;39279:7;39288:5;39238:30;:56::i;:::-;39233:145;;39322:40;;;;;;;;;;;;;;39233:145;39195:183;38978:407;;;;:::o;57515:35::-;;;;:::o;25522:318::-;25595:13;25626:16;25634:7;25626;:16::i;:::-;25621:59;;25651:29;;;;;;;;;;;;;;25621:59;25693:21;25717:10;:8;:10::i;:::-;25693:34;;25770:1;25751:7;25745:21;:26;:87;;;;;;;;;;;;;;;;;25798:7;25807:18;25817:7;25807:9;:18::i;:::-;25781:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25745:87;25738:94;;;25522:318;;;:::o;58757:187::-;4593:12;:10;:12::i;:::-;4582:23;;:7;:5;:7::i;:::-;:23;;;4574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58840:9:::1;58836:101;58859:9;;:16;;58855:1;:20;58836:101;;;58921:4;58896:8;:22;58905:9;;58915:1;58905:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;58896:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;58877:3;;;;;:::i;:::-;;;;58836:101;;;;58757:187:::0;;:::o;65219:91::-;4593:12;:10;:12::i;:::-;4582:23;;:7;:5;:7::i;:::-;:23;;;4574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65298:4:::1;65282:13;;:20;;;;;;;;;;;;;;;;;;65219:91::o:0;65028:88::-;4593:12;:10;:12::i;:::-;4582:23;;:7;:5;:7::i;:::-;:23;;;4574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65104:4:::1;65089:12;;:19;;;;;;;;;;;;;;;;;;65028:88::o:0;60444:880::-;59775:10;59762:23;;:9;:23;;;59754:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;60557:12:::1;;;;;;;;;;;60549:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;60638:10;;60625:8;60609:13;:11;:13::i;:::-;:24;;;;:::i;:::-;60608:40;;60600:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;60746:1;60716:14;:26;60731:10;60716:26;;;;;;;;;;;;;;;;60705:8;:37;;;;:::i;:::-;:42;;60697:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;60815:8;60799:13;;:24;;;;:::i;:::-;60786:9;:37;;60777:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;60912:1;60882:14;:26;60897:10;60882:26;;;;;;;;;;;;;;;;:31;;60860:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;61002:12;61044:10;61027:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;61017:39;;;;;;61002:54;;61089:51;61108:5;61115:18;;61135:4;61089:18;:51::i;:::-;61067:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;61194:31;61204:10;61216:8;61194:9;:31::i;:::-;61266:8;61236:14;:26;61251:10;61236:26;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;61305:10;61290:26;;;;;;;;;;;;60538:786;60444:880:::0;;:::o;60120:150::-;4593:12;:10;:12::i;:::-;4582:23;;:7;:5;:7::i;:::-;:23;;;4574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60244:18:::1;60224:17;:38;;;;60120:150:::0;:::o;57557:37::-;;;;:::o;32576:164::-;32673:4;32697:18;:25;32716:5;32697:25;;;;;;;;;;;;;;;:35;32723:8;32697:35;;;;;;;;;;;;;;;;;;;;;;;;;32690:42;;32576:164;;;;:::o;65124:87::-;4593:12;:10;:12::i;:::-;4582:23;;:7;:5;:7::i;:::-;:23;;;4574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65199:4:::1;65185:11;;:18;;;;;;;;;;;;;;;;;;65124:87::o:0;58215:45::-;;;;;;;;;;;;;;;;;:::o;5271:201::-;4593:12;:10;:12::i;:::-;4582:23;;:7;:5;:7::i;:::-;:23;;;4574:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5380:1:::1;5360:22;;:8;:22;;::::0;5352:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5436:28;5455:8;5436:18;:28::i;:::-;5271:201:::0;:::o;32998:282::-;33063:4;33119:7;33100:15;:13;:15::i;:::-;:26;;:66;;;;;33153:13;;33143:7;:23;33100:66;:153;;;;;33252:1;17006:8;33204:17;:26;33222:7;33204:26;;;;;;;;;;;;:44;:49;33100:153;33080:173;;32998:282;;;:::o;31060:408::-;31149:13;31165:16;31173:7;31165;:16::i;:::-;31149:32;;31221:5;31198:28;;:19;:17;:19::i;:::-;:28;;;31194:175;;31246:44;31263:5;31270:19;:17;:19::i;:::-;31246:16;:44::i;:::-;31241:128;;31318:35;;;;;;;;;;;;;;31241:128;31194:175;31414:2;31381:15;:24;31397:7;31381:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;31452:7;31448:2;31432:28;;31441:5;31432:28;;;;;;;;;;;;31138:330;31060:408;;:::o;20403:92::-;20459:7;20403:92;:::o;27684:1275::-;27751:7;27771:12;27786:7;27771:22;;27854:4;27835:15;:13;:15::i;:::-;:23;27831:1061;;27888:13;;27881:4;:20;27877:1015;;;27926:14;27943:17;:23;27961:4;27943:23;;;;;;;;;;;;27926:40;;28060:1;17006:8;28032:6;:24;:29;28028:845;;28697:113;28714:1;28704:6;:11;28697:113;;28757:17;:25;28775:6;;;;;;;28757:25;;;;;;;;;;;;28748:34;;28697:113;;;28843:6;28836:13;;;;;;28028:845;27903:989;27877:1015;27831:1061;28920:31;;;;;;;;;;;;;;27684:1275;;;;:::o;34161:485::-;34263:27;34292:23;34333:38;34374:15;:24;34390:7;34374:24;;;;;;;;;;;34333:65;;34551:18;34528:41;;34608:19;34602:26;34583:45;;34513:126;34161:485;;;:::o;55306:105::-;55366:7;55393:10;55386:17;;55306:105;:::o;33389:659::-;33538:11;33703:16;33696:5;33692:28;33683:37;;33863:16;33852:9;33848:32;33835:45;;34013:15;34002:9;33999:30;33991:5;33980:9;33977:20;33974:56;33964:66;;33389:659;;;;;:::o;40047:159::-;;;;;:::o;54615:311::-;54750:7;54770:16;17410:3;54796:19;:41;;54770:68;;17410:3;54864:31;54875:4;54881:2;54885:9;54864:10;:31::i;:::-;54856:40;;:62;;54849:69;;;54615:311;;;;;:::o;29507:450::-;29587:14;29755:16;29748:5;29744:28;29735:37;;29932:5;29918:11;29893:23;29889:41;29886:52;29879:5;29876:63;29866:73;;29507:450;;;;:::o;40871:158::-;;;;;:::o;3080:98::-;3133:7;3160:10;3153:17;;3080:98;:::o;929:190::-;1054:4;1107;1078:25;1091:5;1098:4;1078:12;:25::i;:::-;:33;1071:40;;929:190;;;;;:::o;49138:112::-;49215:27;49225:2;49229:8;49215:27;;;;;;;;;;;;:9;:27::i;:::-;49138:112;;:::o;5632:191::-;5706:16;5725:6;;;;;;;;;;;5706:25;;5751:8;5742:6;;:17;;;;;;;;;;;;;;;;;;5806:8;5775:40;;5796:8;5775:40;;;;;;;;;;;;5695:128;5632:191;:::o;32185:234::-;32332:8;32280:18;:39;32299:19;:17;:19::i;:::-;32280:39;;;;;;;;;;;;;;;:49;32320:8;32280:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;32392:8;32356:55;;32371:19;:17;:19::i;:::-;32356:55;;;32402:8;32356:55;;;;;;:::i;:::-;;;;;;;;32185:234;;:::o;41469:716::-;41632:4;41678:2;41653:45;;;41699:19;:17;:19::i;:::-;41720:4;41726:7;41735:5;41653:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41649:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41953:1;41936:6;:13;:18;41932:235;;41982:40;;;;;;;;;;;;;;41932:235;42125:6;42119:13;42110:6;42106:2;42102:15;42095:38;41649:529;41822:54;;;41812:64;;;:6;:64;;;;41805:71;;;41469:716;;;;;;:::o;65533:100::-;65585:13;65618:7;65611:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65533:100;:::o;55513:1745::-;55578:17;56012:4;56005;55999:11;55995:22;56104:1;56098:4;56091:15;56179:4;56176:1;56172:12;56165:19;;56261:1;56256:3;56249:14;56365:3;56604:5;56586:428;56612:1;56586:428;;;56652:1;56647:3;56643:11;56636:18;;56823:2;56817:4;56813:13;56809:2;56805:22;56800:3;56792:36;56917:2;56911:4;56907:13;56899:21;;56984:4;56586:428;56974:25;56586:428;56590:21;57053:3;57048;57044:13;57168:4;57163:3;57159:14;57152:21;;57233:6;57228:3;57221:19;55617:1634;;;55513:1745;;;:::o;54316:147::-;54453:6;54316:147;;;;;:::o;1481:675::-;1564:7;1584:20;1607:4;1584:27;;1627:9;1622:497;1646:5;:12;1642:1;:16;1622:497;;;1680:20;1703:5;1709:1;1703:8;;;;;;;;:::i;:::-;;;;;;;;1680:31;;1746:12;1730;:28;1726:382;;1873:42;1888:12;1902;1873:14;:42::i;:::-;1858:57;;1726:382;;;2050:42;2065:12;2079;2050:14;:42::i;:::-;2035:57;;1726:382;1665:454;1660:3;;;;;:::i;:::-;;;;1622:497;;;;2136:12;2129:19;;;1481:675;;;;:::o;48365:689::-;48496:19;48502:2;48506:8;48496:5;:19::i;:::-;48575:1;48557:2;:14;;;:19;48553:483;;48597:11;48611:13;;48597:27;;48643:13;48665:8;48659:3;:14;48643:30;;48692:233;48723:62;48762:1;48766:2;48770:7;;;;;;48779:5;48723:30;:62::i;:::-;48718:167;;48821:40;;;;;;;;;;;;;;48718:167;48920:3;48912:5;:11;48692:233;;49007:3;48990:13;;:20;48986:34;;49012:8;;;48986:34;48578:458;;48553:483;48365:689;;;:::o;2164:224::-;2232:13;2295:1;2289:4;2282:15;2324:1;2318:4;2311:15;2365:4;2359;2349:21;2340:30;;2164:224;;;;:::o;42647:2966::-;42720:20;42743:13;;42720:36;;42783:1;42771:8;:13;42767:44;;42793:18;;;;;;;;;;;;;;42767:44;42824:61;42854:1;42858:2;42862:12;42876:8;42824:21;:61::i;:::-;43368:1;16368:2;43338:1;:26;;43337:32;43325:8;:45;43299:18;:22;43318:2;43299:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;43647:139;43684:2;43738:33;43761:1;43765:2;43769:1;43738:14;:33::i;:::-;43705:30;43726:8;43705:20;:30::i;:::-;:66;43647:18;:139::i;:::-;43613:17;:31;43631:12;43613:31;;;;;;;;;;;:173;;;;43803:16;43834:11;43863:8;43848:12;:23;43834:37;;44384:16;44380:2;44376:25;44364:37;;44756:12;44716:8;44675:1;44613:25;44554:1;44493;44466:335;45127:1;45113:12;45109:20;45067:346;45168:3;45159:7;45156:16;45067:346;;45386:7;45376:8;45373:1;45346:25;45343:1;45340;45335:59;45221:1;45212:7;45208:15;45197:26;;45067:346;;;45071:77;45458:1;45446:8;:13;45442:45;;45468:19;;;;;;;;;;;;;;45442:45;45520:3;45504:13;:19;;;;43073:2462;;45545:60;45574:1;45578:2;45582:12;45596:8;45545:20;:60::i;:::-;42709:2904;42647:2966;;:::o;30059:324::-;30129:14;30362:1;30352:8;30349:15;30323:24;30319:46;30309:56;;30059:324;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:149::-;1647:7;1687:66;1680:5;1676:78;1665:89;;1611:149;;;:::o;1766:120::-;1838:23;1855:5;1838:23;:::i;:::-;1831:5;1828:34;1818:62;;1876:1;1873;1866:12;1818:62;1766:120;:::o;1892:137::-;1937:5;1975:6;1962:20;1953:29;;1991:32;2017:5;1991:32;:::i;:::-;1892:137;;;;:::o;2035:327::-;2093:6;2142:2;2130:9;2121:7;2117:23;2113:32;2110:119;;;2148:79;;:::i;:::-;2110:119;2268:1;2293:52;2337:7;2328:6;2317:9;2313:22;2293:52;:::i;:::-;2283:62;;2239:116;2035:327;;;;:::o;2368:90::-;2402:7;2445:5;2438:13;2431:21;2420:32;;2368:90;;;:::o;2464:109::-;2545:21;2560:5;2545:21;:::i;:::-;2540:3;2533:34;2464:109;;:::o;2579:210::-;2666:4;2704:2;2693:9;2689:18;2681:26;;2717:65;2779:1;2768:9;2764:17;2755:6;2717:65;:::i;:::-;2579:210;;;;:::o;2795:99::-;2847:6;2881:5;2875:12;2865:22;;2795:99;;;:::o;2900:169::-;2984:11;3018:6;3013:3;3006:19;3058:4;3053:3;3049:14;3034:29;;2900:169;;;;:::o;3075:246::-;3156:1;3166:113;3180:6;3177:1;3174:13;3166:113;;;3265:1;3260:3;3256:11;3250:18;3246:1;3241:3;3237:11;3230:39;3202:2;3199:1;3195:10;3190:15;;3166:113;;;3313:1;3304:6;3299:3;3295:16;3288:27;3137:184;3075:246;;;:::o;3327:102::-;3368:6;3419:2;3415:7;3410:2;3403:5;3399:14;3395:28;3385:38;;3327:102;;;:::o;3435:377::-;3523:3;3551:39;3584:5;3551:39;:::i;:::-;3606:71;3670:6;3665:3;3606:71;:::i;:::-;3599:78;;3686:65;3744:6;3739:3;3732:4;3725:5;3721:16;3686:65;:::i;:::-;3776:29;3798:6;3776:29;:::i;:::-;3771:3;3767:39;3760:46;;3527:285;3435:377;;;;:::o;3818:313::-;3931:4;3969:2;3958:9;3954:18;3946:26;;4018:9;4012:4;4008:20;4004:1;3993:9;3989:17;3982:47;4046:78;4119:4;4110:6;4046:78;:::i;:::-;4038:86;;3818:313;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:329::-;4469:6;4518:2;4506:9;4497:7;4493:23;4489:32;4486:119;;;4524:79;;:::i;:::-;4486:119;4644:1;4669:53;4714:7;4705:6;4694:9;4690:22;4669:53;:::i;:::-;4659:63;;4615:117;4410:329;;;;:::o;4745:118::-;4832:24;4850:5;4832:24;:::i;:::-;4827:3;4820:37;4745:118;;:::o;4869:222::-;4962:4;5000:2;4989:9;4985:18;4977:26;;5013:71;5081:1;5070:9;5066:17;5057:6;5013:71;:::i;:::-;4869:222;;;;:::o;5097:474::-;5165:6;5173;5222:2;5210:9;5201:7;5197:23;5193:32;5190:119;;;5228:79;;:::i;:::-;5190:119;5348:1;5373:53;5418:7;5409:6;5398:9;5394:22;5373:53;:::i;:::-;5363:63;;5319:117;5475:2;5501:53;5546:7;5537:6;5526:9;5522:22;5501:53;:::i;:::-;5491:63;;5446:118;5097:474;;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:77::-;6239:7;6268:5;6257:16;;6202:77;;;:::o;6285:118::-;6372:24;6390:5;6372:24;:::i;:::-;6367:3;6360:37;6285:118;;:::o;6409:222::-;6502:4;6540:2;6529:9;6525:18;6517:26;;6553:71;6621:1;6610:9;6606:17;6597:6;6553:71;:::i;:::-;6409:222;;;;:::o;6637:122::-;6710:24;6728:5;6710:24;:::i;:::-;6703:5;6700:35;6690:63;;6749:1;6746;6739:12;6690:63;6637:122;:::o;6765:139::-;6811:5;6849:6;6836:20;6827:29;;6865:33;6892:5;6865:33;:::i;:::-;6765:139;;;;:::o;6910:329::-;6969:6;7018:2;7006:9;6997:7;6993:23;6989:32;6986:119;;;7024:79;;:::i;:::-;6986:119;7144:1;7169:53;7214:7;7205:6;7194:9;7190:22;7169:53;:::i;:::-;7159:63;;7115:117;6910:329;;;;:::o;7245:117::-;7354:1;7351;7344:12;7368:180;7416:77;7413:1;7406:88;7513:4;7510:1;7503:15;7537:4;7534:1;7527:15;7554:281;7637:27;7659:4;7637:27;:::i;:::-;7629:6;7625:40;7767:6;7755:10;7752:22;7731:18;7719:10;7716:34;7713:62;7710:88;;;7778:18;;:::i;:::-;7710:88;7818:10;7814:2;7807:22;7597:238;7554:281;;:::o;7841:129::-;7875:6;7902:20;;:::i;:::-;7892:30;;7931:33;7959:4;7951:6;7931:33;:::i;:::-;7841:129;;;:::o;7976:311::-;8053:4;8143:18;8135:6;8132:30;8129:56;;;8165:18;;:::i;:::-;8129:56;8215:4;8207:6;8203:17;8195:25;;8275:4;8269;8265:15;8257:23;;7976:311;;;:::o;8293:117::-;8402:1;8399;8392:12;8433:710;8529:5;8554:81;8570:64;8627:6;8570:64;:::i;:::-;8554:81;:::i;:::-;8545:90;;8655:5;8684:6;8677:5;8670:21;8718:4;8711:5;8707:16;8700:23;;8771:4;8763:6;8759:17;8751:6;8747:30;8800:3;8792:6;8789:15;8786:122;;;8819:79;;:::i;:::-;8786:122;8934:6;8917:220;8951:6;8946:3;8943:15;8917:220;;;9026:3;9055:37;9088:3;9076:10;9055:37;:::i;:::-;9050:3;9043:50;9122:4;9117:3;9113:14;9106:21;;8993:144;8977:4;8972:3;8968:14;8961:21;;8917:220;;;8921:21;8535:608;;8433:710;;;;;:::o;9166:370::-;9237:5;9286:3;9279:4;9271:6;9267:17;9263:27;9253:122;;9294:79;;:::i;:::-;9253:122;9411:6;9398:20;9436:94;9526:3;9518:6;9511:4;9503:6;9499:17;9436:94;:::i;:::-;9427:103;;9243:293;9166:370;;;;:::o;9542:684::-;9635:6;9643;9692:2;9680:9;9671:7;9667:23;9663:32;9660:119;;;9698:79;;:::i;:::-;9660:119;9846:1;9835:9;9831:17;9818:31;9876:18;9868:6;9865:30;9862:117;;;9898:79;;:::i;:::-;9862:117;10003:78;10073:7;10064:6;10053:9;10049:22;10003:78;:::i;:::-;9993:88;;9789:302;10130:2;10156:53;10201:7;10192:6;10181:9;10177:22;10156:53;:::i;:::-;10146:63;;10101:118;9542:684;;;;;:::o;10232:117::-;10341:1;10338;10331:12;10355:308;10417:4;10507:18;10499:6;10496:30;10493:56;;;10529:18;;:::i;:::-;10493:56;10567:29;10589:6;10567:29;:::i;:::-;10559:37;;10651:4;10645;10641:15;10633:23;;10355:308;;;:::o;10669:146::-;10766:6;10761:3;10756;10743:30;10807:1;10798:6;10793:3;10789:16;10782:27;10669:146;;;:::o;10821:425::-;10899:5;10924:66;10940:49;10982:6;10940:49;:::i;:::-;10924:66;:::i;:::-;10915:75;;11013:6;11006:5;10999:21;11051:4;11044:5;11040:16;11089:3;11080:6;11075:3;11071:16;11068:25;11065:112;;;11096:79;;:::i;:::-;11065:112;11186:54;11233:6;11228:3;11223;11186:54;:::i;:::-;10905:341;10821:425;;;;;:::o;11266:340::-;11322:5;11371:3;11364:4;11356:6;11352:17;11348:27;11338:122;;11379:79;;:::i;:::-;11338:122;11496:6;11483:20;11521:79;11596:3;11588:6;11581:4;11573:6;11569:17;11521:79;:::i;:::-;11512:88;;11328:278;11266:340;;;;:::o;11612:509::-;11681:6;11730:2;11718:9;11709:7;11705:23;11701:32;11698:119;;;11736:79;;:::i;:::-;11698:119;11884:1;11873:9;11869:17;11856:31;11914:18;11906:6;11903:30;11900:117;;;11936:79;;:::i;:::-;11900:117;12041:63;12096:7;12087:6;12076:9;12072:22;12041:63;:::i;:::-;12031:73;;11827:287;11612:509;;;;:::o;12127:117::-;12236:1;12233;12226:12;12267:568;12340:8;12350:6;12400:3;12393:4;12385:6;12381:17;12377:27;12367:122;;12408:79;;:::i;:::-;12367:122;12521:6;12508:20;12498:30;;12551:18;12543:6;12540:30;12537:117;;;12573:79;;:::i;:::-;12537:117;12687:4;12679:6;12675:17;12663:29;;12741:3;12733:4;12725:6;12721:17;12711:8;12707:32;12704:41;12701:128;;;12748:79;;:::i;:::-;12701:128;12267:568;;;;;:::o;12841:559::-;12927:6;12935;12984:2;12972:9;12963:7;12959:23;12955:32;12952:119;;;12990:79;;:::i;:::-;12952:119;13138:1;13127:9;13123:17;13110:31;13168:18;13160:6;13157:30;13154:117;;;13190:79;;:::i;:::-;13154:117;13303:80;13375:7;13366:6;13355:9;13351:22;13303:80;:::i;:::-;13285:98;;;;13081:312;12841:559;;;;;:::o;13406:116::-;13476:21;13491:5;13476:21;:::i;:::-;13469:5;13466:32;13456:60;;13512:1;13509;13502:12;13456:60;13406:116;:::o;13528:133::-;13571:5;13609:6;13596:20;13587:29;;13625:30;13649:5;13625:30;:::i;:::-;13528:133;;;;:::o;13667:468::-;13732:6;13740;13789:2;13777:9;13768:7;13764:23;13760:32;13757:119;;;13795:79;;:::i;:::-;13757:119;13915:1;13940:53;13985:7;13976:6;13965:9;13961:22;13940:53;:::i;:::-;13930:63;;13886:117;14042:2;14068:50;14110:7;14101:6;14090:9;14086:22;14068:50;:::i;:::-;14058:60;;14013:115;13667:468;;;;;:::o;14141:307::-;14202:4;14292:18;14284:6;14281:30;14278:56;;;14314:18;;:::i;:::-;14278:56;14352:29;14374:6;14352:29;:::i;:::-;14344:37;;14436:4;14430;14426:15;14418:23;;14141:307;;;:::o;14454:423::-;14531:5;14556:65;14572:48;14613:6;14572:48;:::i;:::-;14556:65;:::i;:::-;14547:74;;14644:6;14637:5;14630:21;14682:4;14675:5;14671:16;14720:3;14711:6;14706:3;14702:16;14699:25;14696:112;;;14727:79;;:::i;:::-;14696:112;14817:54;14864:6;14859:3;14854;14817:54;:::i;:::-;14537:340;14454:423;;;;;:::o;14896:338::-;14951:5;15000:3;14993:4;14985:6;14981:17;14977:27;14967:122;;15008:79;;:::i;:::-;14967:122;15125:6;15112:20;15150:78;15224:3;15216:6;15209:4;15201:6;15197:17;15150:78;:::i;:::-;15141:87;;14957:277;14896:338;;;;:::o;15240:943::-;15335:6;15343;15351;15359;15408:3;15396:9;15387:7;15383:23;15379:33;15376:120;;;15415:79;;:::i;:::-;15376:120;15535:1;15560:53;15605:7;15596:6;15585:9;15581:22;15560:53;:::i;:::-;15550:63;;15506:117;15662:2;15688:53;15733:7;15724:6;15713:9;15709:22;15688:53;:::i;:::-;15678:63;;15633:118;15790:2;15816:53;15861:7;15852:6;15841:9;15837:22;15816:53;:::i;:::-;15806:63;;15761:118;15946:2;15935:9;15931:18;15918:32;15977:18;15969:6;15966:30;15963:117;;;15999:79;;:::i;:::-;15963:117;16104:62;16158:7;16149:6;16138:9;16134:22;16104:62;:::i;:::-;16094:72;;15889:287;15240:943;;;;;;;:::o;16189:474::-;16257:6;16265;16314:2;16302:9;16293:7;16289:23;16285:32;16282:119;;;16320:79;;:::i;:::-;16282:119;16440:1;16465:53;16510:7;16501:6;16490:9;16486:22;16465:53;:::i;:::-;16455:63;;16411:117;16567:2;16593:53;16638:7;16629:6;16618:9;16614:22;16593:53;:::i;:::-;16583:63;;16538:118;16189:474;;;;;:::o;16669:180::-;16717:77;16714:1;16707:88;16814:4;16811:1;16804:15;16838:4;16835:1;16828:15;16855:320;16899:6;16936:1;16930:4;16926:12;16916:22;;16983:1;16977:4;16973:12;17004:18;16994:81;;17060:4;17052:6;17048:17;17038:27;;16994:81;17122:2;17114:6;17111:14;17091:18;17088:38;17085:84;;17141:18;;:::i;:::-;17085:84;16906:269;16855:320;;;:::o;17181:169::-;17321:21;17317:1;17309:6;17305:14;17298:45;17181:169;:::o;17356:366::-;17498:3;17519:67;17583:2;17578:3;17519:67;:::i;:::-;17512:74;;17595:93;17684:3;17595:93;:::i;:::-;17713:2;17708:3;17704:12;17697:19;;17356:366;;;:::o;17728:419::-;17894:4;17932:2;17921:9;17917:18;17909:26;;17981:9;17975:4;17971:20;17967:1;17956:9;17952:17;17945:47;18009:131;18135:4;18009:131;:::i;:::-;18001:139;;17728:419;;;:::o;18153:182::-;18293:34;18289:1;18281:6;18277:14;18270:58;18153:182;:::o;18341:366::-;18483:3;18504:67;18568:2;18563:3;18504:67;:::i;:::-;18497:74;;18580:93;18669:3;18580:93;:::i;:::-;18698:2;18693:3;18689:12;18682:19;;18341:366;;;:::o;18713:419::-;18879:4;18917:2;18906:9;18902:18;18894:26;;18966:9;18960:4;18956:20;18952:1;18941:9;18937:17;18930:47;18994:131;19120:4;18994:131;:::i;:::-;18986:139;;18713:419;;;:::o;19138:180::-;19278:32;19274:1;19266:6;19262:14;19255:56;19138:180;:::o;19324:366::-;19466:3;19487:67;19551:2;19546:3;19487:67;:::i;:::-;19480:74;;19563:93;19652:3;19563:93;:::i;:::-;19681:2;19676:3;19672:12;19665:19;;19324:366;;;:::o;19696:419::-;19862:4;19900:2;19889:9;19885:18;19877:26;;19949:9;19943:4;19939:20;19935:1;19924:9;19920:17;19913:47;19977:131;20103:4;19977:131;:::i;:::-;19969:139;;19696:419;;;:::o;20121:165::-;20261:17;20257:1;20249:6;20245:14;20238:41;20121:165;:::o;20292:366::-;20434:3;20455:67;20519:2;20514:3;20455:67;:::i;:::-;20448:74;;20531:93;20620:3;20531:93;:::i;:::-;20649:2;20644:3;20640:12;20633:19;;20292:366;;;:::o;20664:419::-;20830:4;20868:2;20857:9;20853:18;20845:26;;20917:9;20911:4;20907:20;20903:1;20892:9;20888:17;20881:47;20945:131;21071:4;20945:131;:::i;:::-;20937:139;;20664:419;;;:::o;21089:180::-;21137:77;21134:1;21127:88;21234:4;21231:1;21224:15;21258:4;21255:1;21248:15;21275:191;21315:3;21334:20;21352:1;21334:20;:::i;:::-;21329:25;;21368:20;21386:1;21368:20;:::i;:::-;21363:25;;21411:1;21408;21404:9;21397:16;;21432:3;21429:1;21426:10;21423:36;;;21439:18;;:::i;:::-;21423:36;21275:191;;;;:::o;21472:220::-;21612:34;21608:1;21600:6;21596:14;21589:58;21681:3;21676:2;21668:6;21664:15;21657:28;21472:220;:::o;21698:366::-;21840:3;21861:67;21925:2;21920:3;21861:67;:::i;:::-;21854:74;;21937:93;22026:3;21937:93;:::i;:::-;22055:2;22050:3;22046:12;22039:19;;21698:366;;;:::o;22070:419::-;22236:4;22274:2;22263:9;22259:18;22251:26;;22323:9;22317:4;22313:20;22309:1;22298:9;22294:17;22287:47;22351:131;22477:4;22351:131;:::i;:::-;22343:139;;22070:419;;;:::o;22495:164::-;22635:16;22631:1;22623:6;22619:14;22612:40;22495:164;:::o;22665:366::-;22807:3;22828:67;22892:2;22887:3;22828:67;:::i;:::-;22821:74;;22904:93;22993:3;22904:93;:::i;:::-;23022:2;23017:3;23013:12;23006:19;;22665:366;;;:::o;23037:419::-;23203:4;23241:2;23230:9;23226:18;23218:26;;23290:9;23284:4;23280:20;23276:1;23265:9;23261:17;23254:47;23318:131;23444:4;23318:131;:::i;:::-;23310:139;;23037:419;;;:::o;23462:410::-;23502:7;23525:20;23543:1;23525:20;:::i;:::-;23520:25;;23559:20;23577:1;23559:20;:::i;:::-;23554:25;;23614:1;23611;23607:9;23636:30;23654:11;23636:30;:::i;:::-;23625:41;;23815:1;23806:7;23802:15;23799:1;23796:22;23776:1;23769:9;23749:83;23726:139;;23845:18;;:::i;:::-;23726:139;23510:362;23462:410;;;;:::o;23878:170::-;24018:22;24014:1;24006:6;24002:14;23995:46;23878:170;:::o;24054:366::-;24196:3;24217:67;24281:2;24276:3;24217:67;:::i;:::-;24210:74;;24293:93;24382:3;24293:93;:::i;:::-;24411:2;24406:3;24402:12;24395:19;;24054:366;;;:::o;24426:419::-;24592:4;24630:2;24619:9;24615:18;24607:26;;24679:9;24673:4;24669:20;24665:1;24654:9;24650:17;24643:47;24707:131;24833:4;24707:131;:::i;:::-;24699:139;;24426:419;;;:::o;24851:235::-;24991:34;24987:1;24979:6;24975:14;24968:58;25060:18;25055:2;25047:6;25043:15;25036:43;24851:235;:::o;25092:366::-;25234:3;25255:67;25319:2;25314:3;25255:67;:::i;:::-;25248:74;;25331:93;25420:3;25331:93;:::i;:::-;25449:2;25444:3;25440:12;25433:19;;25092:366;;;:::o;25464:419::-;25630:4;25668:2;25657:9;25653:18;25645:26;;25717:9;25711:4;25707:20;25703:1;25692:9;25688:17;25681:47;25745:131;25871:4;25745:131;:::i;:::-;25737:139;;25464:419;;;:::o;25889:94::-;25922:8;25970:5;25966:2;25962:14;25941:35;;25889:94;;;:::o;25989:::-;26028:7;26057:20;26071:5;26057:20;:::i;:::-;26046:31;;25989:94;;;:::o;26089:100::-;26128:7;26157:26;26177:5;26157:26;:::i;:::-;26146:37;;26089:100;;;:::o;26195:157::-;26300:45;26320:24;26338:5;26320:24;:::i;:::-;26300:45;:::i;:::-;26295:3;26288:58;26195:157;;:::o;26358:256::-;26470:3;26485:75;26556:3;26547:6;26485:75;:::i;:::-;26585:2;26580:3;26576:12;26569:19;;26605:3;26598:10;;26358:256;;;;:::o;26620:163::-;26760:15;26756:1;26748:6;26744:14;26737:39;26620:163;:::o;26789:366::-;26931:3;26952:67;27016:2;27011:3;26952:67;:::i;:::-;26945:74;;27028:93;27117:3;27028:93;:::i;:::-;27146:2;27141:3;27137:12;27130:19;;26789:366;;;:::o;27161:419::-;27327:4;27365:2;27354:9;27350:18;27342:26;;27414:9;27408:4;27404:20;27400:1;27389:9;27385:17;27378:47;27442:131;27568:4;27442:131;:::i;:::-;27434:139;;27161:419;;;:::o;27586:141::-;27635:4;27658:3;27650:11;;27681:3;27678:1;27671:14;27715:4;27712:1;27702:18;27694:26;;27586:141;;;:::o;27733:93::-;27770:6;27817:2;27812;27805:5;27801:14;27797:23;27787:33;;27733:93;;;:::o;27832:107::-;27876:8;27926:5;27920:4;27916:16;27895:37;;27832:107;;;;:::o;27945:393::-;28014:6;28064:1;28052:10;28048:18;28087:97;28117:66;28106:9;28087:97;:::i;:::-;28205:39;28235:8;28224:9;28205:39;:::i;:::-;28193:51;;28277:4;28273:9;28266:5;28262:21;28253:30;;28326:4;28316:8;28312:19;28305:5;28302:30;28292:40;;28021:317;;27945:393;;;;;:::o;28344:60::-;28372:3;28393:5;28386:12;;28344:60;;;:::o;28410:142::-;28460:9;28493:53;28511:34;28520:24;28538:5;28520:24;:::i;:::-;28511:34;:::i;:::-;28493:53;:::i;:::-;28480:66;;28410:142;;;:::o;28558:75::-;28601:3;28622:5;28615:12;;28558:75;;;:::o;28639:269::-;28749:39;28780:7;28749:39;:::i;:::-;28810:91;28859:41;28883:16;28859:41;:::i;:::-;28851:6;28844:4;28838:11;28810:91;:::i;:::-;28804:4;28797:105;28715:193;28639:269;;;:::o;28914:73::-;28959:3;28914:73;:::o;28993:189::-;29070:32;;:::i;:::-;29111:65;29169:6;29161;29155:4;29111:65;:::i;:::-;29046:136;28993:189;;:::o;29188:186::-;29248:120;29265:3;29258:5;29255:14;29248:120;;;29319:39;29356:1;29349:5;29319:39;:::i;:::-;29292:1;29285:5;29281:13;29272:22;;29248:120;;;29188:186;;:::o;29380:543::-;29481:2;29476:3;29473:11;29470:446;;;29515:38;29547:5;29515:38;:::i;:::-;29599:29;29617:10;29599:29;:::i;:::-;29589:8;29585:44;29782:2;29770:10;29767:18;29764:49;;;29803:8;29788:23;;29764:49;29826:80;29882:22;29900:3;29882:22;:::i;:::-;29872:8;29868:37;29855:11;29826:80;:::i;:::-;29485:431;;29470:446;29380:543;;;:::o;29929:117::-;29983:8;30033:5;30027:4;30023:16;30002:37;;29929:117;;;;:::o;30052:169::-;30096:6;30129:51;30177:1;30173:6;30165:5;30162:1;30158:13;30129:51;:::i;:::-;30125:56;30210:4;30204;30200:15;30190:25;;30103:118;30052:169;;;;:::o;30226:295::-;30302:4;30448:29;30473:3;30467:4;30448:29;:::i;:::-;30440:37;;30510:3;30507:1;30503:11;30497:4;30494:21;30486:29;;30226:295;;;;:::o;30526:1395::-;30643:37;30676:3;30643:37;:::i;:::-;30745:18;30737:6;30734:30;30731:56;;;30767:18;;:::i;:::-;30731:56;30811:38;30843:4;30837:11;30811:38;:::i;:::-;30896:67;30956:6;30948;30942:4;30896:67;:::i;:::-;30990:1;31014:4;31001:17;;31046:2;31038:6;31035:14;31063:1;31058:618;;;;31720:1;31737:6;31734:77;;;31786:9;31781:3;31777:19;31771:26;31762:35;;31734:77;31837:67;31897:6;31890:5;31837:67;:::i;:::-;31831:4;31824:81;31693:222;31028:887;;31058:618;31110:4;31106:9;31098:6;31094:22;31144:37;31176:4;31144:37;:::i;:::-;31203:1;31217:208;31231:7;31228:1;31225:14;31217:208;;;31310:9;31305:3;31301:19;31295:26;31287:6;31280:42;31361:1;31353:6;31349:14;31339:24;;31408:2;31397:9;31393:18;31380:31;;31254:4;31251:1;31247:12;31242:17;;31217:208;;;31453:6;31444:7;31441:19;31438:179;;;31511:9;31506:3;31502:19;31496:26;31554:48;31596:4;31588:6;31584:17;31573:9;31554:48;:::i;:::-;31546:6;31539:64;31461:156;31438:179;31663:1;31659;31651:6;31647:14;31643:22;31637:4;31630:36;31065:611;;;31028:887;;30618:1303;;;30526:1395;;:::o;31927:176::-;32067:28;32063:1;32055:6;32051:14;32044:52;31927:176;:::o;32109:366::-;32251:3;32272:67;32336:2;32331:3;32272:67;:::i;:::-;32265:74;;32348:93;32437:3;32348:93;:::i;:::-;32466:2;32461:3;32457:12;32450:19;;32109:366;;;:::o;32481:419::-;32647:4;32685:2;32674:9;32670:18;32662:26;;32734:9;32728:4;32724:20;32720:1;32709:9;32705:17;32698:47;32762:131;32888:4;32762:131;:::i;:::-;32754:139;;32481:419;;;:::o;32906:180::-;32954:77;32951:1;32944:88;33051:4;33048:1;33041:15;33075:4;33072:1;33065:15;33092:233;33131:3;33154:24;33172:5;33154:24;:::i;:::-;33145:33;;33200:66;33193:5;33190:77;33187:103;;33270:18;;:::i;:::-;33187:103;33317:1;33310:5;33306:13;33299:20;;33092:233;;;:::o;33331:148::-;33433:11;33470:3;33455:18;;33331:148;;;;:::o;33485:390::-;33591:3;33619:39;33652:5;33619:39;:::i;:::-;33674:89;33756:6;33751:3;33674:89;:::i;:::-;33667:96;;33772:65;33830:6;33825:3;33818:4;33811:5;33807:16;33772:65;:::i;:::-;33862:6;33857:3;33853:16;33846:23;;33595:280;33485:390;;;;:::o;33881:435::-;34061:3;34083:95;34174:3;34165:6;34083:95;:::i;:::-;34076:102;;34195:95;34286:3;34277:6;34195:95;:::i;:::-;34188:102;;34307:3;34300:10;;33881:435;;;;;:::o;34322:225::-;34462:34;34458:1;34450:6;34446:14;34439:58;34531:8;34526:2;34518:6;34514:15;34507:33;34322:225;:::o;34553:366::-;34695:3;34716:67;34780:2;34775:3;34716:67;:::i;:::-;34709:74;;34792:93;34881:3;34792:93;:::i;:::-;34910:2;34905:3;34901:12;34894:19;;34553:366;;;:::o;34925:419::-;35091:4;35129:2;35118:9;35114:18;35106:26;;35178:9;35172:4;35168:20;35164:1;35153:9;35149:17;35142:47;35206:131;35332:4;35206:131;:::i;:::-;35198:139;;34925:419;;;:::o;35350:98::-;35401:6;35435:5;35429:12;35419:22;;35350:98;;;:::o;35454:168::-;35537:11;35571:6;35566:3;35559:19;35611:4;35606:3;35602:14;35587:29;;35454:168;;;;:::o;35628:373::-;35714:3;35742:38;35774:5;35742:38;:::i;:::-;35796:70;35859:6;35854:3;35796:70;:::i;:::-;35789:77;;35875:65;35933:6;35928:3;35921:4;35914:5;35910:16;35875:65;:::i;:::-;35965:29;35987:6;35965:29;:::i;:::-;35960:3;35956:39;35949:46;;35718:283;35628:373;;;;:::o;36007:640::-;36202:4;36240:3;36229:9;36225:19;36217:27;;36254:71;36322:1;36311:9;36307:17;36298:6;36254:71;:::i;:::-;36335:72;36403:2;36392:9;36388:18;36379:6;36335:72;:::i;:::-;36417;36485:2;36474:9;36470:18;36461:6;36417:72;:::i;:::-;36536:9;36530:4;36526:20;36521:2;36510:9;36506:18;36499:48;36564:76;36635:4;36626:6;36564:76;:::i;:::-;36556:84;;36007:640;;;;;;;:::o;36653:141::-;36709:5;36740:6;36734:13;36725:22;;36756:32;36782:5;36756:32;:::i;:::-;36653:141;;;;:::o;36800:349::-;36869:6;36918:2;36906:9;36897:7;36893:23;36889:32;36886:119;;;36924:79;;:::i;:::-;36886:119;37044:1;37069:63;37124:7;37115:6;37104:9;37100:22;37069:63;:::i;:::-;37059:73;;37015:127;36800:349;;;;:::o

Swarm Source

ipfs://61800e72587edddf9137440bed5f0696817034d4703878c2350df19efd34a3b3
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.