ETH Price: $2,369.00 (-2.79%)

Token

DOGS (DOGS)
 

Overview

Max Total Supply

170 DOGS

Holders

60

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mml.eth
Balance
9 DOGS
0xa19801bbb26c0412875876fdfc1ea63c45ca8187
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:
DOGS

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-02
*/

/**
 *Submitted for verification at Etherscan.io on 2021-12-1
*/

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint _value; // default: 0
    }

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

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

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

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


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


pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(
        address indexed owner,
        address indexed approved,
        uint 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 (uint balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint 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,
        uint tokenId
    ) external;

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

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

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

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

    /**
     * @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,
        uint tokenId,
        bytes calldata data
    ) external;
}


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() {
        _setOwner(_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 {
        _setOwner(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"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


pragma solidity ^0.8.0;

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

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

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


pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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

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

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

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

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


pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


pragma solidity ^0.8.0;

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

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

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


pragma solidity ^0.8.0;

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



pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner)
    public
    view
    virtual
    override
    returns (uint)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint tokenId)
    public
    view
    virtual
    override
    returns (address)
    {
        address owner = _owners[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint tokenId)
    public
    view
    virtual
    override
    returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory baseURI = _baseURI();
        return
        bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, tokenId.toString()))
        : "";
    }

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint tokenId)
    public
    view
    virtual
    override
    returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
    public
    virtual
    override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint tokenId,
        bytes memory _data
    ) public virtual override {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint tokenId)
    internal
    view
    virtual
    returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
        getApproved(tokenId) == spender ||
        isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint tokenId
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
            IERC721Receiver(to).onERC721Received(
                _msgSender(),
                from,
                tokenId,
                _data
            )
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                    "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint tokenId
    ) internal virtual {}
}



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

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

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

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

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

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


    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {

        if (uint(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

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

        return (signer, RecoverError.NoError);
    }


    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {

        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

pragma solidity ^0.8.0;

contract DOGS is ERC721Enumerable, Ownable {
    using Strings for uint;
    using ECDSA for bytes32;

    uint public constant DOGS_PRESALE = 7227; //presale
    uint public constant DOGS_WALLET_PRESALE_LIMIT = 10; //dogsperwalletInWholeDuration
    uint public constant DOGS_PER_TRANSACTION_LIMIT = 20; //dogsperwalletInWholeDuration
    uint public constant DOGS_MAX_COUNT =  7777; //maxSupply
    uint public constant DOGS_FREE_SALE_LIMIT =  550; //maxSupply
    uint public totalTokensSoldInPresale;
    uint public freeSaleCounter;
    uint public preSaleAmountMinted;
    //uint public DOGS_MAIN_SALE = 7200 - totalTokensSoldInPresale;

    //todo place the finalised price
    uint public constant DOGS_MAINSALE_PRICE = 0.045 ether; //priceInMainSale
    uint public constant DOGS_PRESALE_PRICE = 0.045 ether; //priceInPreSale
    mapping (address => uint) public saleListPurchase;
    mapping (address => uint) public presalerListPurchases;
    mapping (address => uint) public freesaleListPurchases;
    mapping (address => uint) public freeSalePurchaseLimitPerWallet;

    //todo : we need to change this baseURI
    string private _tokenBaseURI = "https://gateway.pinata.cloud/ipfs/QmNoz6JpSnMoq3xjf3dV4vD9oM4pj11wwNE6RDe4auMgGL/";
    string private constant Sig_WORD = "private";
    address private _signerAddress = 0x956231B802D9494296acdE7B3Ce3890c8b0438b8;

    // address public ownerAddress;
    uint public privateAmountMinted;
    bool public presaleLive;
    bool public saleLive;
    bool public locked;
    bool public freesaleLive;
    modifier notLocked {
        require(!locked, "Contract metadata methods are locked");
        _;
    }

    constructor() ERC721("DOGS", "DOGS") {}

    function setFreeMintLimitToAddress(address[] memory _address, uint[] memory _amount) external onlyOwner {
        require (_address.length == _amount.length);
        for (uint i=0;i< _address.length;i++) {
            freeSalePurchaseLimitPerWallet[_address[i]] =_amount[i];
        }
    }

    function matchAddresSigner(bytes memory signature) private view returns(bool) {
        bytes32 hash = keccak256(abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                keccak256(abi.encodePacked(msg.sender, Sig_WORD)))
        );
        return _signerAddress == hash.recover(signature);
    }

    //todo : need to mint 40 tokens for the user at the beginning
    function gift(address[] calldata receivers) external onlyOwner {
        require(totalSupply() + receivers.length <= DOGS_MAX_COUNT, "EXCEED_MAX");
        for (uint i = 0; i < receivers.length; i++) {
            _safeMint(receivers[i], totalSupply() + 1);
        }
    }

    function buy(uint tokenQuantity) external payable {
        require (saleLive, "SALE_CLOSED");
        require (tokenQuantity <= DOGS_PER_TRANSACTION_LIMIT, "TOKEN REQUEST EXCEED PER TRANSACTION");
        require (totalSupply() + tokenQuantity <= (DOGS_MAX_COUNT - DOGS_FREE_SALE_LIMIT), "EXCEED_MAX");
        require (DOGS_MAINSALE_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");
        saleListPurchase[msg.sender] += tokenQuantity;
        for (uint i = 0; i < tokenQuantity; i++) {
            _safeMint(msg.sender, totalSupply() + 1);
        }
    }

    function freeSaleBuy() external {
        require (freesaleLive && !saleLive && !presaleLive, "Freesale_Closed");
        require (freeSaleCounter <= DOGS_FREE_SALE_LIMIT, "Freesale_Limit_Exceeded");
        uint _freeTokenLeft = freeSalePurchaseLimitPerWallet[msg.sender];
        freeSalePurchaseLimitPerWallet[msg.sender] = 0;
        require (_freeTokenLeft > 0, "Limit Exceeded");
        freesaleListPurchases[msg.sender]=_freeTokenLeft;
        freeSaleCounter += _freeTokenLeft;
        for (uint i=0;i<_freeTokenLeft;i++) {
            _safeMint( msg.sender, totalSupply()+1 );
        }
    }

    function freeSalePurchaseCount(address _address) external view returns (uint) {
        return freesaleListPurchases[_address];
    }

    function presaleBuy(bytes memory signature , uint tokenQuantity) external payable {
        require(presaleLive, "PRESALE_CLOSED");//DOGS_WALLET_PRESALE_LIMIT
        require(matchAddresSigner(signature), "DIRECT_MINT_DISALLOWED");
        require(preSaleAmountMinted + tokenQuantity <= DOGS_PRESALE, "EXCEED_PRIVATE");
        require(presalerListPurchases[msg.sender] + tokenQuantity <= DOGS_WALLET_PRESALE_LIMIT, "EXCEED_ALLOC");
        require(DOGS_MAINSALE_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");
        presalerListPurchases[msg.sender] += tokenQuantity;
        preSaleAmountMinted += tokenQuantity;
        for(uint i = 0; i < tokenQuantity; i++) {
            _safeMint(msg.sender, totalSupply() + 1);
        }
    }

    function withdraw() external {
        uint balance = address(this).balance;
        require(balance > 0);
        address payable _dylanAddress = payable (0xAA7484F5Be0AD8B1F51684E79E432307a54E9a8D);
        uint dylanTransfer =  (balance*(10))/(100);
        _dylanAddress.transfer(dylanTransfer);
        //todo: use owner address from the contract to send the money
        payable(owner()).transfer(address(this).balance);
    }

    function presalePurchasedCount(address addr) external view returns (uint) {
        return presalerListPurchases[addr];
    }

    function lockMetadata(bool _assertion) external onlyOwner {
        locked = _assertion;
    }

    function toggleFreesaleStatus() external onlyOwner {
        freesaleLive = !freesaleLive;
    }

    function togglePresaleStatus() external onlyOwner {
        presaleLive = !presaleLive;
    }

    function toggleSaleStatus() external onlyOwner {
        saleLive = !saleLive;
    }


    function setSignerAddress(address addr) external onlyOwner {
        _signerAddress = addr;
    }

    function setBaseURI(string calldata URI) external onlyOwner notLocked {
        _tokenBaseURI = URI;
    }

    function tokenURI(uint tokenId) public view override(ERC721) returns (string memory) {
        require(_exists(tokenId), "Cannot query non-existent token");

        return string(abi.encodePacked(_tokenBaseURI, tokenId.toString()));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOGS_FREE_SALE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOGS_MAINSALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOGS_MAX_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOGS_PER_TRANSACTION_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOGS_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOGS_PRESALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOGS_WALLET_PRESALE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"freeSaleBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeSaleCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"freeSalePurchaseCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeSalePurchaseLimitPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freesaleListPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freesaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_assertion","type":"bool"}],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleAmountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"presaleBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"presalePurchasedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerListPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateAmountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"saleListPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"setFreeMintLimitToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setSignerAddress","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":[],"name":"toggleFreesaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensSoldInPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052604051806080016040528060518152602001620060786051913960129080519060200190620000359291906200022d565b5073956231b802d9494296acde7b3ce3890c8b0438b8601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200009857600080fd5b506040518060400160405280600481526020017f444f4753000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f444f47530000000000000000000000000000000000000000000000000000000081525081600090805190602001906200011d9291906200022d565b508060019080519060200190620001369291906200022d565b505050620001596200014d6200015f60201b60201c565b6200016760201b60201c565b62000342565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023b90620002dd565b90600052602060002090601f0160209004810192826200025f5760008555620002ab565b82601f106200027a57805160ff1916838001178555620002ab565b82800160010185558215620002ab579182015b82811115620002aa5782518255916020019190600101906200028d565b5b509050620002ba9190620002be565b5090565b5b80821115620002d9576000816000905550600101620002bf565b5090565b60006002820490506001821680620002f657607f821691505b602082108114156200030d576200030c62000313565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615d2680620003526000396000f3fe6080604052600436106102ff5760003560e01c80636352211e11610190578063b88d4fde116100dc578063d96a094a11610095578063e081b7811161006f578063e081b78114610b63578063e985e9c514610b8e578063f2fde38b14610bcb578063fd917b0714610bf4576102ff565b8063d96a094a14610b05578063de232a4b14610b21578063dece9b2714610b4c576102ff565b8063b88d4fde146109e3578063c534dca314610a0c578063c757428814610a23578063c87b56dd14610a60578063cf30901214610a9d578063d8b02ab714610ac8576102ff565b80637e80fc4e1161014957806395d89b411161012357806395d89b41146109155780639bf8031614610940578063a22cb4651461097d578063b0fd7811146109a6576102ff565b80637e80fc4e1461089657806383a9e049146108bf5780638da5cb5b146108ea576102ff565b80636352211e146107985780636d29e32f146107d5578063702377181461080057806370a082311461082b578063715018a6146108685780637bffb4ce1461087f576102ff565b806323b872dd1161024f5780634f6ccce71161020857806359a12ad5116101e257806359a12ad5146106da5780635ce7af1f146107055780635f54e0a9146107425780635ff146ee1461076d576102ff565b80634f6ccce71461064957806355061a131461068657806355f804b3146106b1576102ff565b806323b872dd1461054f5780632f745c59146105785780633ccfd60b146105b557806342842e0e146105cc57806345e3286b146105f55780634da527541461061e576102ff565b80630f5b5c9c116102bc578063163e1e6111610296578063163e1e61146104a5578063175b385b146104ce57806318160ddd146104f95780631f5c3f8714610524576102ff565b80630f5b5c9c146104125780631162bea41461043d578063153f371b1461047a576102ff565b806301ffc9a714610304578063046dc16614610341578063049c5c491461036a57806306fdde0314610381578063081812fc146103ac578063095ea7b3146103e9575b600080fd5b34801561031057600080fd5b5061032b600480360381019061032691906141b1565b610c10565b6040516103389190614a1e565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190613efc565b610c8a565b005b34801561037657600080fd5b5061037f610d4a565b005b34801561038d57600080fd5b50610396610df2565b6040516103a39190614a7e565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce91906142b4565b610e84565b6040516103e091906149b7565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b919061407f565b610f09565b005b34801561041e57600080fd5b50610427611021565b6040516104349190614ee0565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f9190613efc565b611027565b6040516104719190614ee0565b60405180910390f35b34801561048657600080fd5b5061048f61103f565b60405161049c9190614a1e565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c791906140bf565b611052565b005b3480156104da57600080fd5b506104e3611192565b6040516104f09190614ee0565b60405180910390f35b34801561050557600080fd5b5061050e61119d565b60405161051b9190614ee0565b60405180910390f35b34801561053057600080fd5b506105396111aa565b6040516105469190614ee0565b60405180910390f35b34801561055b57600080fd5b5061057660048036038101906105719190613f69565b6111b5565b005b34801561058457600080fd5b5061059f600480360381019061059a919061407f565b611215565b6040516105ac9190614ee0565b60405180910390f35b3480156105c157600080fd5b506105ca6112ba565b005b3480156105d857600080fd5b506105f360048036038101906105ee9190613f69565b61139c565b005b34801561060157600080fd5b5061061c6004803603810190610617919061410c565b6113bc565b005b34801561062a57600080fd5b506106336114e2565b6040516106409190614ee0565b60405180910390f35b34801561065557600080fd5b50610670600480360381019061066b91906142b4565b6114e8565b60405161067d9190614ee0565b60405180910390f35b34801561069257600080fd5b5061069b611559565b6040516106a89190614ee0565b60405180910390f35b3480156106bd57600080fd5b506106d860048036038101906106d39190614267565b61155e565b005b3480156106e657600080fd5b506106ef611640565b6040516106fc9190614ee0565b60405180910390f35b34801561071157600080fd5b5061072c60048036038101906107279190613efc565b611646565b6040516107399190614ee0565b60405180910390f35b34801561074e57600080fd5b5061075761168f565b6040516107649190614ee0565b60405180910390f35b34801561077957600080fd5b50610782611695565b60405161078f9190614ee0565b60405180910390f35b3480156107a457600080fd5b506107bf60048036038101906107ba91906142b4565b61169a565b6040516107cc91906149b7565b60405180910390f35b3480156107e157600080fd5b506107ea61174c565b6040516107f79190614ee0565b60405180910390f35b34801561080c57600080fd5b50610815611752565b6040516108229190614ee0565b60405180910390f35b34801561083757600080fd5b50610852600480360381019061084d9190613efc565b611758565b60405161085f9190614ee0565b60405180910390f35b34801561087457600080fd5b5061087d611810565b005b34801561088b57600080fd5b50610894611898565b005b3480156108a257600080fd5b506108bd60048036038101906108b89190614184565b611940565b005b3480156108cb57600080fd5b506108d46119d9565b6040516108e19190614a1e565b60405180910390f35b3480156108f657600080fd5b506108ff6119ec565b60405161090c91906149b7565b60405180910390f35b34801561092157600080fd5b5061092a611a16565b6040516109379190614a7e565b60405180910390f35b34801561094c57600080fd5b5061096760048036038101906109629190613efc565b611aa8565b6040516109749190614ee0565b60405180910390f35b34801561098957600080fd5b506109a4600480360381019061099f919061403f565b611ac0565b005b3480156109b257600080fd5b506109cd60048036038101906109c89190613efc565b611c41565b6040516109da9190614ee0565b60405180910390f35b3480156109ef57600080fd5b50610a0a6004803603810190610a059190613fbc565b611c59565b005b348015610a1857600080fd5b50610a21611cbb565b005b348015610a2f57600080fd5b50610a4a6004803603810190610a459190613efc565b611d63565b604051610a579190614ee0565b60405180910390f35b348015610a6c57600080fd5b50610a876004803603810190610a8291906142b4565b611d7b565b604051610a949190614a7e565b60405180910390f35b348015610aa957600080fd5b50610ab2611df7565b604051610abf9190614a1e565b60405180910390f35b348015610ad457600080fd5b50610aef6004803603810190610aea9190613efc565b611e0a565b604051610afc9190614ee0565b60405180910390f35b610b1f6004803603810190610b1a91906142b4565b611e53565b005b348015610b2d57600080fd5b50610b36612034565b604051610b439190614ee0565b60405180910390f35b348015610b5857600080fd5b50610b6161203a565b005b348015610b6f57600080fd5b50610b7861226a565b604051610b859190614a1e565b60405180910390f35b348015610b9a57600080fd5b50610bb56004803603810190610bb09190613f29565b61227d565b604051610bc29190614a1e565b60405180910390f35b348015610bd757600080fd5b50610bf26004803603810190610bed9190613efc565b612311565b005b610c0e6004803603810190610c09919061420b565b612409565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c835750610c8282612684565b5b9050919050565b610c92612766565b73ffffffffffffffffffffffffffffffffffffffff16610cb06119ec565b73ffffffffffffffffffffffffffffffffffffffff1614610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614d60565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610d52612766565b73ffffffffffffffffffffffffffffffffffffffff16610d706119ec565b73ffffffffffffffffffffffffffffffffffffffff1614610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd90614d60565b60405180910390fd5b601560019054906101000a900460ff1615601560016101000a81548160ff021916908315150217905550565b606060008054610e01906151e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2d906151e3565b8015610e7a5780601f10610e4f57610100808354040283529160200191610e7a565b820191906000526020600020905b815481529060010190602001808311610e5d57829003601f168201915b5050505050905090565b6000610e8f8261276e565b610ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec590614d20565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f148261169a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7c90614de0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fa4612766565b73ffffffffffffffffffffffffffffffffffffffff161480610fd35750610fd281610fcd612766565b61227d565b5b611012576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100990614c80565b60405180910390fd5b61101c83836127da565b505050565b600c5481565b60106020528060005260406000206000915090505481565b601560039054906101000a900460ff1681565b61105a612766565b73ffffffffffffffffffffffffffffffffffffffff166110786119ec565b73ffffffffffffffffffffffffffffffffffffffff16146110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590614d60565b60405180910390fd5b611e61828290506110dd61119d565b6110e79190615001565b1115611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f90614e00565b60405180910390fd5b60005b8282905081101561118d5761117a83838381811061114c5761114b6153d9565b5b90506020020160208101906111619190613efc565b600161116b61119d565b6111759190615001565b612893565b808061118590615246565b91505061112b565b505050565b669fdf42f6e4800081565b6000600880549050905090565b669fdf42f6e4800081565b6111c66111c0612766565b826128b1565b611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fc90614e20565b60405180910390fd5b61121083838361298f565b505050565b600061122083611758565b8210611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890614b20565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000479050600081116112cc57600080fd5b600073aa7484f5be0ad8b1f51684e79e432307a54e9a8d905060006064600a846112f69190615088565b6113009190615057565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611348573d6000803e3d6000fd5b506113516119ec565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611396573d6000803e3d6000fd5b50505050565b6113b783838360405180602001604052806000815250611c59565b505050565b6113c4612766565b73ffffffffffffffffffffffffffffffffffffffff166113e26119ec565b73ffffffffffffffffffffffffffffffffffffffff1614611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f90614d60565b60405180910390fd5b805182511461144657600080fd5b60005b82518110156114dd57818181518110611465576114646153d9565b5b602002602001015160116000858481518110611484576114836153d9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806114d590615246565b915050611449565b505050565b61022681565b60006114f261119d565b8210611533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152a90614e40565b60405180910390fd5b60088281548110611547576115466153d9565b5b90600052602060002001549050919050565b600a81565b611566612766565b73ffffffffffffffffffffffffffffffffffffffff166115846119ec565b73ffffffffffffffffffffffffffffffffffffffff16146115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d190614d60565b60405180910390fd5b601560029054906101000a900460ff161561162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162190614da0565b60405180910390fd5b81816012919061163b929190613b98565b505050565b60145481565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e6181565b601481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90614cc0565b60405180910390fd5b80915050919050565b600b5481565b600d5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c090614ca0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611818612766565b73ffffffffffffffffffffffffffffffffffffffff166118366119ec565b73ffffffffffffffffffffffffffffffffffffffff161461188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188390614d60565b60405180910390fd5b6118966000612beb565b565b6118a0612766565b73ffffffffffffffffffffffffffffffffffffffff166118be6119ec565b73ffffffffffffffffffffffffffffffffffffffff1614611914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190b90614d60565b60405180910390fd5b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b611948612766565b73ffffffffffffffffffffffffffffffffffffffff166119666119ec565b73ffffffffffffffffffffffffffffffffffffffff16146119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b390614d60565b60405180910390fd5b80601560026101000a81548160ff02191690831515021790555050565b601560009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611a25906151e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611a51906151e3565b8015611a9e5780601f10611a7357610100808354040283529160200191611a9e565b820191906000526020600020905b815481529060010190602001808311611a8157829003601f168201915b5050505050905090565b600f6020528060005260406000206000915090505481565b611ac8612766565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2d90614bc0565b60405180910390fd5b8060056000611b43612766565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bf0612766565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c359190614a1e565b60405180910390a35050565b60116020528060005260406000206000915090505481565b611c6a611c64612766565b836128b1565b611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca090614e20565b60405180910390fd5b611cb584848484612cb1565b50505050565b611cc3612766565b73ffffffffffffffffffffffffffffffffffffffff16611ce16119ec565b73ffffffffffffffffffffffffffffffffffffffff1614611d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2e90614d60565b60405180910390fd5b601560039054906101000a900460ff1615601560036101000a81548160ff021916908315150217905550565b600e6020528060005260406000206000915090505481565b6060611d868261276e565b611dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbc90614dc0565b60405180910390fd5b6012611dd083612d0d565b604051602001611de192919061496d565b6040516020818303038152906040529050919050565b601560029054906101000a900460ff1681565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601560019054906101000a900460ff16611ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9990614c20565b60405180910390fd5b6014811115611ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edd90614be0565b60405180910390fd5b610226611e61611ef691906150e2565b81611eff61119d565b611f099190615001565b1115611f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4190614e00565b60405180910390fd5b3481669fdf42f6e48000611f5e9190615088565b1115611f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9690614ec0565b60405180910390fd5b80600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fee9190615001565b9250508190555060005b818110156120305761201d33600161200e61119d565b6120189190615001565b612893565b808061202890615246565b915050611ff8565b5050565b611c3b81565b601560039054906101000a900460ff1680156120635750601560019054906101000a900460ff16155b801561207c5750601560009054906101000a900460ff16155b6120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b290614d40565b60405180910390fd5b610226600c541115612102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f990614c60565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600081116121ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c590614e80565b60405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c60008282546122249190615001565b9250508190555060005b818110156122665761225333600161224461119d565b61224e9190615001565b612893565b808061225e90615246565b91505061222e565b5050565b601560019054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612319612766565b73ffffffffffffffffffffffffffffffffffffffff166123376119ec565b73ffffffffffffffffffffffffffffffffffffffff161461238d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238490614d60565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f490614b60565b60405180910390fd5b61240681612beb565b50565b601560009054906101000a900460ff16612458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244f90614ac0565b60405180910390fd5b61246182612e6e565b6124a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249790614ae0565b60405180910390fd5b611c3b81600d546124b19190615001565b11156124f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e990614e60565b60405180910390fd5b600a81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461253f9190615001565b1115612580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257790614ea0565b60405180910390fd5b3481669fdf42f6e480006125949190615088565b11156125d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cc90614ec0565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126249190615001565b9250508190555080600d600082825461263d9190615001565b9250508190555060005b8181101561267f5761266c33600161265d61119d565b6126679190615001565b612893565b808061267790615246565b915050612647565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061274f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061275f575061275e82612f62565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661284d8361169a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6128ad828260405180602001604052806000815250612fcc565b5050565b60006128bc8261276e565b6128fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f290614c40565b60405180910390fd5b60006129068361169a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061297557508373ffffffffffffffffffffffffffffffffffffffff1661295d84610e84565b73ffffffffffffffffffffffffffffffffffffffff16145b806129865750612985818561227d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129af8261169a565b73ffffffffffffffffffffffffffffffffffffffff1614612a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fc90614d80565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6c90614ba0565b60405180910390fd5b612a80838383613027565b612a8b6000826127da565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612adb91906150e2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b329190615001565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612cbc84848461298f565b612cc88484848461313b565b612d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfe90614b40565b60405180910390fd5b50505050565b60606000821415612d55576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e69565b600082905060005b60008214612d87578080612d7090615246565b915050600a82612d809190615057565b9150612d5d565b60008167ffffffffffffffff811115612da357612da2615408565b5b6040519080825280601f01601f191660200182016040528015612dd55781602001600182028036833780820191505090505b5090505b60008514612e6257600182612dee91906150e2565b9150600a85612dfd91906152bd565b6030612e099190615001565b60f81b818381518110612e1f57612e1e6153d9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e5b9190615057565b9450612dd9565b8093505050505b919050565b600080336040518060400160405280600781526020017f7072697661746500000000000000000000000000000000000000000000000000815250604051602001612eb9929190614945565b60405160208183030381529060405280519060200120604051602001612edf9190614991565b604051602081830303815290604052805190602001209050612f0a83826132d290919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612fd683836132f9565b612fe3600084848461313b565b613022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301990614b40565b60405180910390fd5b505050565b6130328383836134c7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561307557613070816134cc565b6130b4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130b3576130b28382613515565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130f7576130f281613682565b613136565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613135576131348282613753565b5b5b505050565b600061315c8473ffffffffffffffffffffffffffffffffffffffff166137d2565b156132c5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613185612766565b8786866040518563ffffffff1660e01b81526004016131a794939291906149d2565b602060405180830381600087803b1580156131c157600080fd5b505af19250505080156131f257506040513d601f19601f820116820180604052508101906131ef91906141de565b60015b613275573d8060008114613222576040519150601f19603f3d011682016040523d82523d6000602084013e613227565b606091505b5060008151141561326d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326490614b40565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132ca565b600190505b949350505050565b60008060006132e185856137e5565b915091506132ee81613868565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613369576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336090614d00565b60405180910390fd5b6133728161276e565b156133b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a990614b80565b60405180910390fd5b6133be60008383613027565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461340e9190615001565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161352284611758565b61352c91906150e2565b9050600060076000848152602001908152602001600020549050818114613611576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061369691906150e2565b90506000600960008481526020019081526020016000205490506000600883815481106136c6576136c56153d9565b5b9060005260206000200154905080600883815481106136e8576136e76153d9565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613737576137366153aa565b5b6001900381819060005260206000200160009055905550505050565b600061375e83611758565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6000806041835114156138275760008060006020860151925060408601519150606086015160001a905061381b87828585613a3d565b94509450505050613861565b60408351141561385857600080602085015191506040850151905061384d868383613b4a565b935093505050613861565b60006002915091505b9250929050565b6000600481111561387c5761387b61534c565b5b81600481111561388f5761388e61534c565b5b141561389a57613a3a565b600160048111156138ae576138ad61534c565b5b8160048111156138c1576138c061534c565b5b1415613902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138f990614aa0565b60405180910390fd5b600260048111156139165761391561534c565b5b8160048111156139295761392861534c565b5b141561396a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396190614b00565b60405180910390fd5b6003600481111561397e5761397d61534c565b5b8160048111156139915761399061534c565b5b14156139d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c990614c00565b60405180910390fd5b6004808111156139e5576139e461534c565b5b8160048111156139f8576139f761534c565b5b1415613a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3090614ce0565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613a78576000600391509150613b41565b601b8560ff1614158015613a905750601c8560ff1614155b15613aa2576000600491509150613b41565b600060018787878760405160008152602001604052604051613ac79493929190614a39565b6020604051602081039080840390855afa158015613ae9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b3857600060019250925050613b41565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613b8a87828885613a3d565b935093505050935093915050565b828054613ba4906151e3565b90600052602060002090601f016020900481019282613bc65760008555613c0d565b82601f10613bdf57803560ff1916838001178555613c0d565b82800160010185558215613c0d579182015b82811115613c0c578235825591602001919060010190613bf1565b5b509050613c1a9190613c1e565b5090565b5b80821115613c37576000816000905550600101613c1f565b5090565b6000613c4e613c4984614f20565b614efb565b90508083825260208201905082856020860282011115613c7157613c70615441565b5b60005b85811015613ca15781613c878882613d5d565b845260208401935060208301925050600181019050613c74565b5050509392505050565b6000613cbe613cb984614f4c565b614efb565b90508083825260208201905082856020860282011115613ce157613ce0615441565b5b60005b85811015613d115781613cf78882613ee7565b845260208401935060208301925050600181019050613ce4565b5050509392505050565b6000613d2e613d2984614f78565b614efb565b905082815260208101848484011115613d4a57613d49615446565b5b613d558482856151a1565b509392505050565b600081359050613d6c81615c94565b92915050565b60008083601f840112613d8857613d8761543c565b5b8235905067ffffffffffffffff811115613da557613da4615437565b5b602083019150836020820283011115613dc157613dc0615441565b5b9250929050565b600082601f830112613ddd57613ddc61543c565b5b8135613ded848260208601613c3b565b91505092915050565b600082601f830112613e0b57613e0a61543c565b5b8135613e1b848260208601613cab565b91505092915050565b600081359050613e3381615cab565b92915050565b600081359050613e4881615cc2565b92915050565b600081519050613e5d81615cc2565b92915050565b600082601f830112613e7857613e7761543c565b5b8135613e88848260208601613d1b565b91505092915050565b60008083601f840112613ea757613ea661543c565b5b8235905067ffffffffffffffff811115613ec457613ec3615437565b5b602083019150836001820283011115613ee057613edf615441565b5b9250929050565b600081359050613ef681615cd9565b92915050565b600060208284031215613f1257613f11615450565b5b6000613f2084828501613d5d565b91505092915050565b60008060408385031215613f4057613f3f615450565b5b6000613f4e85828601613d5d565b9250506020613f5f85828601613d5d565b9150509250929050565b600080600060608486031215613f8257613f81615450565b5b6000613f9086828701613d5d565b9350506020613fa186828701613d5d565b9250506040613fb286828701613ee7565b9150509250925092565b60008060008060808587031215613fd657613fd5615450565b5b6000613fe487828801613d5d565b9450506020613ff587828801613d5d565b935050604061400687828801613ee7565b925050606085013567ffffffffffffffff8111156140275761402661544b565b5b61403387828801613e63565b91505092959194509250565b6000806040838503121561405657614055615450565b5b600061406485828601613d5d565b925050602061407585828601613e24565b9150509250929050565b6000806040838503121561409657614095615450565b5b60006140a485828601613d5d565b92505060206140b585828601613ee7565b9150509250929050565b600080602083850312156140d6576140d5615450565b5b600083013567ffffffffffffffff8111156140f4576140f361544b565b5b61410085828601613d72565b92509250509250929050565b6000806040838503121561412357614122615450565b5b600083013567ffffffffffffffff8111156141415761414061544b565b5b61414d85828601613dc8565b925050602083013567ffffffffffffffff81111561416e5761416d61544b565b5b61417a85828601613df6565b9150509250929050565b60006020828403121561419a57614199615450565b5b60006141a884828501613e24565b91505092915050565b6000602082840312156141c7576141c6615450565b5b60006141d584828501613e39565b91505092915050565b6000602082840312156141f4576141f3615450565b5b600061420284828501613e4e565b91505092915050565b6000806040838503121561422257614221615450565b5b600083013567ffffffffffffffff8111156142405761423f61544b565b5b61424c85828601613e63565b925050602061425d85828601613ee7565b9150509250929050565b6000806020838503121561427e5761427d615450565b5b600083013567ffffffffffffffff81111561429c5761429b61544b565b5b6142a885828601613e91565b92509250509250929050565b6000602082840312156142ca576142c9615450565b5b60006142d884828501613ee7565b91505092915050565b6142ea81615116565b82525050565b6143016142fc82615116565b61528f565b82525050565b61431081615128565b82525050565b61431f81615134565b82525050565b61433661433182615134565b6152a1565b82525050565b600061434782614fbe565b6143518185614fd4565b93506143618185602086016151b0565b61436a81615455565b840191505092915050565b600061438082614fc9565b61438a8185614fe5565b935061439a8185602086016151b0565b6143a381615455565b840191505092915050565b60006143b982614fc9565b6143c38185614ff6565b93506143d38185602086016151b0565b80840191505092915050565b600081546143ec816151e3565b6143f68186614ff6565b94506001821660008114614411576001811461442257614455565b60ff19831686528186019350614455565b61442b85614fa9565b60005b8381101561444d5781548189015260018201915060208101905061442e565b838801955050505b50505092915050565b600061446b601883614fe5565b915061447682615473565b602082019050919050565b600061448e600e83614fe5565b91506144998261549c565b602082019050919050565b60006144b1601683614fe5565b91506144bc826154c5565b602082019050919050565b60006144d4601f83614fe5565b91506144df826154ee565b602082019050919050565b60006144f7601c83614ff6565b915061450282615517565b601c82019050919050565b600061451a602b83614fe5565b915061452582615540565b604082019050919050565b600061453d603283614fe5565b91506145488261558f565b604082019050919050565b6000614560602683614fe5565b915061456b826155de565b604082019050919050565b6000614583601c83614fe5565b915061458e8261562d565b602082019050919050565b60006145a6602483614fe5565b91506145b182615656565b604082019050919050565b60006145c9601983614fe5565b91506145d4826156a5565b602082019050919050565b60006145ec602483614fe5565b91506145f7826156ce565b604082019050919050565b600061460f602283614fe5565b915061461a8261571d565b604082019050919050565b6000614632600b83614fe5565b915061463d8261576c565b602082019050919050565b6000614655602c83614fe5565b915061466082615795565b604082019050919050565b6000614678601783614fe5565b9150614683826157e4565b602082019050919050565b600061469b603883614fe5565b91506146a68261580d565b604082019050919050565b60006146be602a83614fe5565b91506146c98261585c565b604082019050919050565b60006146e1602983614fe5565b91506146ec826158ab565b604082019050919050565b6000614704602283614fe5565b915061470f826158fa565b604082019050919050565b6000614727602083614fe5565b915061473282615949565b602082019050919050565b600061474a602c83614fe5565b915061475582615972565b604082019050919050565b600061476d600f83614fe5565b9150614778826159c1565b602082019050919050565b6000614790602083614fe5565b915061479b826159ea565b602082019050919050565b60006147b3602983614fe5565b91506147be82615a13565b604082019050919050565b60006147d6602483614fe5565b91506147e182615a62565b604082019050919050565b60006147f9601f83614fe5565b915061480482615ab1565b602082019050919050565b600061481c602183614fe5565b915061482782615ada565b604082019050919050565b600061483f600a83614fe5565b915061484a82615b29565b602082019050919050565b6000614862603183614fe5565b915061486d82615b52565b604082019050919050565b6000614885602c83614fe5565b915061489082615ba1565b604082019050919050565b60006148a8600e83614fe5565b91506148b382615bf0565b602082019050919050565b60006148cb600e83614fe5565b91506148d682615c19565b602082019050919050565b60006148ee600c83614fe5565b91506148f982615c42565b602082019050919050565b6000614911601083614fe5565b915061491c82615c6b565b602082019050919050565b6149308161518a565b82525050565b61493f81615194565b82525050565b600061495182856142f0565b60148201915061496182846143ae565b91508190509392505050565b600061497982856143df565b915061498582846143ae565b91508190509392505050565b600061499c826144ea565b91506149a88284614325565b60208201915081905092915050565b60006020820190506149cc60008301846142e1565b92915050565b60006080820190506149e760008301876142e1565b6149f460208301866142e1565b614a016040830185614927565b8181036060830152614a13818461433c565b905095945050505050565b6000602082019050614a336000830184614307565b92915050565b6000608082019050614a4e6000830187614316565b614a5b6020830186614936565b614a686040830185614316565b614a756060830184614316565b95945050505050565b60006020820190508181036000830152614a988184614375565b905092915050565b60006020820190508181036000830152614ab98161445e565b9050919050565b60006020820190508181036000830152614ad981614481565b9050919050565b60006020820190508181036000830152614af9816144a4565b9050919050565b60006020820190508181036000830152614b19816144c7565b9050919050565b60006020820190508181036000830152614b398161450d565b9050919050565b60006020820190508181036000830152614b5981614530565b9050919050565b60006020820190508181036000830152614b7981614553565b9050919050565b60006020820190508181036000830152614b9981614576565b9050919050565b60006020820190508181036000830152614bb981614599565b9050919050565b60006020820190508181036000830152614bd9816145bc565b9050919050565b60006020820190508181036000830152614bf9816145df565b9050919050565b60006020820190508181036000830152614c1981614602565b9050919050565b60006020820190508181036000830152614c3981614625565b9050919050565b60006020820190508181036000830152614c5981614648565b9050919050565b60006020820190508181036000830152614c798161466b565b9050919050565b60006020820190508181036000830152614c998161468e565b9050919050565b60006020820190508181036000830152614cb9816146b1565b9050919050565b60006020820190508181036000830152614cd9816146d4565b9050919050565b60006020820190508181036000830152614cf9816146f7565b9050919050565b60006020820190508181036000830152614d198161471a565b9050919050565b60006020820190508181036000830152614d398161473d565b9050919050565b60006020820190508181036000830152614d5981614760565b9050919050565b60006020820190508181036000830152614d7981614783565b9050919050565b60006020820190508181036000830152614d99816147a6565b9050919050565b60006020820190508181036000830152614db9816147c9565b9050919050565b60006020820190508181036000830152614dd9816147ec565b9050919050565b60006020820190508181036000830152614df98161480f565b9050919050565b60006020820190508181036000830152614e1981614832565b9050919050565b60006020820190508181036000830152614e3981614855565b9050919050565b60006020820190508181036000830152614e5981614878565b9050919050565b60006020820190508181036000830152614e798161489b565b9050919050565b60006020820190508181036000830152614e99816148be565b9050919050565b60006020820190508181036000830152614eb9816148e1565b9050919050565b60006020820190508181036000830152614ed981614904565b9050919050565b6000602082019050614ef56000830184614927565b92915050565b6000614f05614f16565b9050614f118282615215565b919050565b6000604051905090565b600067ffffffffffffffff821115614f3b57614f3a615408565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f6757614f66615408565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f9357614f92615408565b5b614f9c82615455565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061500c8261518a565b91506150178361518a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561504c5761504b6152ee565b5b828201905092915050565b60006150628261518a565b915061506d8361518a565b92508261507d5761507c61531d565b5b828204905092915050565b60006150938261518a565b915061509e8361518a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150d7576150d66152ee565b5b828202905092915050565b60006150ed8261518a565b91506150f88361518a565b92508282101561510b5761510a6152ee565b5b828203905092915050565b60006151218261516a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156151ce5780820151818401526020810190506151b3565b838111156151dd576000848401525b50505050565b600060028204905060018216806151fb57607f821691505b6020821081141561520f5761520e61537b565b5b50919050565b61521e82615455565b810181811067ffffffffffffffff8211171561523d5761523c615408565b5b80604052505050565b60006152518261518a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615284576152836152ee565b5b600182019050919050565b600061529a826152ab565b9050919050565b6000819050919050565b60006152b682615466565b9050919050565b60006152c88261518a565b91506152d38361518a565b9250826152e3576152e261531d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f50524553414c455f434c4f534544000000000000000000000000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f544f4b454e20524551554553542045584345454420504552205452414e53414360008201527f54494f4e00000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4672656573616c655f4c696d69745f4578636565646564000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4672656573616c655f436c6f7365640000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60008201527f636b656400000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4558434545445f4d415800000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4558434545445f50524956415445000000000000000000000000000000000000600082015250565b7f4c696d6974204578636565646564000000000000000000000000000000000000600082015250565b7f4558434545445f414c4c4f430000000000000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b615c9d81615116565b8114615ca857600080fd5b50565b615cb481615128565b8114615cbf57600080fd5b50565b615ccb8161513e565b8114615cd657600080fd5b50565b615ce28161518a565b8114615ced57600080fd5b5056fea264697066735822122097866e0ad08de2776fe5445d2f151f5e80d9d4a48c4262b0a62ba30d947a130264736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d4e6f7a364a70536e4d6f7133786a66336456347644396f4d34706a313177774e45365244653461754d67474c2f

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c80636352211e11610190578063b88d4fde116100dc578063d96a094a11610095578063e081b7811161006f578063e081b78114610b63578063e985e9c514610b8e578063f2fde38b14610bcb578063fd917b0714610bf4576102ff565b8063d96a094a14610b05578063de232a4b14610b21578063dece9b2714610b4c576102ff565b8063b88d4fde146109e3578063c534dca314610a0c578063c757428814610a23578063c87b56dd14610a60578063cf30901214610a9d578063d8b02ab714610ac8576102ff565b80637e80fc4e1161014957806395d89b411161012357806395d89b41146109155780639bf8031614610940578063a22cb4651461097d578063b0fd7811146109a6576102ff565b80637e80fc4e1461089657806383a9e049146108bf5780638da5cb5b146108ea576102ff565b80636352211e146107985780636d29e32f146107d5578063702377181461080057806370a082311461082b578063715018a6146108685780637bffb4ce1461087f576102ff565b806323b872dd1161024f5780634f6ccce71161020857806359a12ad5116101e257806359a12ad5146106da5780635ce7af1f146107055780635f54e0a9146107425780635ff146ee1461076d576102ff565b80634f6ccce71461064957806355061a131461068657806355f804b3146106b1576102ff565b806323b872dd1461054f5780632f745c59146105785780633ccfd60b146105b557806342842e0e146105cc57806345e3286b146105f55780634da527541461061e576102ff565b80630f5b5c9c116102bc578063163e1e6111610296578063163e1e61146104a5578063175b385b146104ce57806318160ddd146104f95780631f5c3f8714610524576102ff565b80630f5b5c9c146104125780631162bea41461043d578063153f371b1461047a576102ff565b806301ffc9a714610304578063046dc16614610341578063049c5c491461036a57806306fdde0314610381578063081812fc146103ac578063095ea7b3146103e9575b600080fd5b34801561031057600080fd5b5061032b600480360381019061032691906141b1565b610c10565b6040516103389190614a1e565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190613efc565b610c8a565b005b34801561037657600080fd5b5061037f610d4a565b005b34801561038d57600080fd5b50610396610df2565b6040516103a39190614a7e565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce91906142b4565b610e84565b6040516103e091906149b7565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b919061407f565b610f09565b005b34801561041e57600080fd5b50610427611021565b6040516104349190614ee0565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f9190613efc565b611027565b6040516104719190614ee0565b60405180910390f35b34801561048657600080fd5b5061048f61103f565b60405161049c9190614a1e565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c791906140bf565b611052565b005b3480156104da57600080fd5b506104e3611192565b6040516104f09190614ee0565b60405180910390f35b34801561050557600080fd5b5061050e61119d565b60405161051b9190614ee0565b60405180910390f35b34801561053057600080fd5b506105396111aa565b6040516105469190614ee0565b60405180910390f35b34801561055b57600080fd5b5061057660048036038101906105719190613f69565b6111b5565b005b34801561058457600080fd5b5061059f600480360381019061059a919061407f565b611215565b6040516105ac9190614ee0565b60405180910390f35b3480156105c157600080fd5b506105ca6112ba565b005b3480156105d857600080fd5b506105f360048036038101906105ee9190613f69565b61139c565b005b34801561060157600080fd5b5061061c6004803603810190610617919061410c565b6113bc565b005b34801561062a57600080fd5b506106336114e2565b6040516106409190614ee0565b60405180910390f35b34801561065557600080fd5b50610670600480360381019061066b91906142b4565b6114e8565b60405161067d9190614ee0565b60405180910390f35b34801561069257600080fd5b5061069b611559565b6040516106a89190614ee0565b60405180910390f35b3480156106bd57600080fd5b506106d860048036038101906106d39190614267565b61155e565b005b3480156106e657600080fd5b506106ef611640565b6040516106fc9190614ee0565b60405180910390f35b34801561071157600080fd5b5061072c60048036038101906107279190613efc565b611646565b6040516107399190614ee0565b60405180910390f35b34801561074e57600080fd5b5061075761168f565b6040516107649190614ee0565b60405180910390f35b34801561077957600080fd5b50610782611695565b60405161078f9190614ee0565b60405180910390f35b3480156107a457600080fd5b506107bf60048036038101906107ba91906142b4565b61169a565b6040516107cc91906149b7565b60405180910390f35b3480156107e157600080fd5b506107ea61174c565b6040516107f79190614ee0565b60405180910390f35b34801561080c57600080fd5b50610815611752565b6040516108229190614ee0565b60405180910390f35b34801561083757600080fd5b50610852600480360381019061084d9190613efc565b611758565b60405161085f9190614ee0565b60405180910390f35b34801561087457600080fd5b5061087d611810565b005b34801561088b57600080fd5b50610894611898565b005b3480156108a257600080fd5b506108bd60048036038101906108b89190614184565b611940565b005b3480156108cb57600080fd5b506108d46119d9565b6040516108e19190614a1e565b60405180910390f35b3480156108f657600080fd5b506108ff6119ec565b60405161090c91906149b7565b60405180910390f35b34801561092157600080fd5b5061092a611a16565b6040516109379190614a7e565b60405180910390f35b34801561094c57600080fd5b5061096760048036038101906109629190613efc565b611aa8565b6040516109749190614ee0565b60405180910390f35b34801561098957600080fd5b506109a4600480360381019061099f919061403f565b611ac0565b005b3480156109b257600080fd5b506109cd60048036038101906109c89190613efc565b611c41565b6040516109da9190614ee0565b60405180910390f35b3480156109ef57600080fd5b50610a0a6004803603810190610a059190613fbc565b611c59565b005b348015610a1857600080fd5b50610a21611cbb565b005b348015610a2f57600080fd5b50610a4a6004803603810190610a459190613efc565b611d63565b604051610a579190614ee0565b60405180910390f35b348015610a6c57600080fd5b50610a876004803603810190610a8291906142b4565b611d7b565b604051610a949190614a7e565b60405180910390f35b348015610aa957600080fd5b50610ab2611df7565b604051610abf9190614a1e565b60405180910390f35b348015610ad457600080fd5b50610aef6004803603810190610aea9190613efc565b611e0a565b604051610afc9190614ee0565b60405180910390f35b610b1f6004803603810190610b1a91906142b4565b611e53565b005b348015610b2d57600080fd5b50610b36612034565b604051610b439190614ee0565b60405180910390f35b348015610b5857600080fd5b50610b6161203a565b005b348015610b6f57600080fd5b50610b7861226a565b604051610b859190614a1e565b60405180910390f35b348015610b9a57600080fd5b50610bb56004803603810190610bb09190613f29565b61227d565b604051610bc29190614a1e565b60405180910390f35b348015610bd757600080fd5b50610bf26004803603810190610bed9190613efc565b612311565b005b610c0e6004803603810190610c09919061420b565b612409565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c835750610c8282612684565b5b9050919050565b610c92612766565b73ffffffffffffffffffffffffffffffffffffffff16610cb06119ec565b73ffffffffffffffffffffffffffffffffffffffff1614610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614d60565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610d52612766565b73ffffffffffffffffffffffffffffffffffffffff16610d706119ec565b73ffffffffffffffffffffffffffffffffffffffff1614610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd90614d60565b60405180910390fd5b601560019054906101000a900460ff1615601560016101000a81548160ff021916908315150217905550565b606060008054610e01906151e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2d906151e3565b8015610e7a5780601f10610e4f57610100808354040283529160200191610e7a565b820191906000526020600020905b815481529060010190602001808311610e5d57829003601f168201915b5050505050905090565b6000610e8f8261276e565b610ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec590614d20565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f148261169a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7c90614de0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fa4612766565b73ffffffffffffffffffffffffffffffffffffffff161480610fd35750610fd281610fcd612766565b61227d565b5b611012576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100990614c80565b60405180910390fd5b61101c83836127da565b505050565b600c5481565b60106020528060005260406000206000915090505481565b601560039054906101000a900460ff1681565b61105a612766565b73ffffffffffffffffffffffffffffffffffffffff166110786119ec565b73ffffffffffffffffffffffffffffffffffffffff16146110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590614d60565b60405180910390fd5b611e61828290506110dd61119d565b6110e79190615001565b1115611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f90614e00565b60405180910390fd5b60005b8282905081101561118d5761117a83838381811061114c5761114b6153d9565b5b90506020020160208101906111619190613efc565b600161116b61119d565b6111759190615001565b612893565b808061118590615246565b91505061112b565b505050565b669fdf42f6e4800081565b6000600880549050905090565b669fdf42f6e4800081565b6111c66111c0612766565b826128b1565b611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fc90614e20565b60405180910390fd5b61121083838361298f565b505050565b600061122083611758565b8210611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890614b20565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000479050600081116112cc57600080fd5b600073aa7484f5be0ad8b1f51684e79e432307a54e9a8d905060006064600a846112f69190615088565b6113009190615057565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611348573d6000803e3d6000fd5b506113516119ec565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611396573d6000803e3d6000fd5b50505050565b6113b783838360405180602001604052806000815250611c59565b505050565b6113c4612766565b73ffffffffffffffffffffffffffffffffffffffff166113e26119ec565b73ffffffffffffffffffffffffffffffffffffffff1614611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f90614d60565b60405180910390fd5b805182511461144657600080fd5b60005b82518110156114dd57818181518110611465576114646153d9565b5b602002602001015160116000858481518110611484576114836153d9565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806114d590615246565b915050611449565b505050565b61022681565b60006114f261119d565b8210611533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152a90614e40565b60405180910390fd5b60088281548110611547576115466153d9565b5b90600052602060002001549050919050565b600a81565b611566612766565b73ffffffffffffffffffffffffffffffffffffffff166115846119ec565b73ffffffffffffffffffffffffffffffffffffffff16146115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d190614d60565b60405180910390fd5b601560029054906101000a900460ff161561162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162190614da0565b60405180910390fd5b81816012919061163b929190613b98565b505050565b60145481565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e6181565b601481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90614cc0565b60405180910390fd5b80915050919050565b600b5481565b600d5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c090614ca0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611818612766565b73ffffffffffffffffffffffffffffffffffffffff166118366119ec565b73ffffffffffffffffffffffffffffffffffffffff161461188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188390614d60565b60405180910390fd5b6118966000612beb565b565b6118a0612766565b73ffffffffffffffffffffffffffffffffffffffff166118be6119ec565b73ffffffffffffffffffffffffffffffffffffffff1614611914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190b90614d60565b60405180910390fd5b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b611948612766565b73ffffffffffffffffffffffffffffffffffffffff166119666119ec565b73ffffffffffffffffffffffffffffffffffffffff16146119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b390614d60565b60405180910390fd5b80601560026101000a81548160ff02191690831515021790555050565b601560009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611a25906151e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611a51906151e3565b8015611a9e5780601f10611a7357610100808354040283529160200191611a9e565b820191906000526020600020905b815481529060010190602001808311611a8157829003601f168201915b5050505050905090565b600f6020528060005260406000206000915090505481565b611ac8612766565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2d90614bc0565b60405180910390fd5b8060056000611b43612766565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bf0612766565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c359190614a1e565b60405180910390a35050565b60116020528060005260406000206000915090505481565b611c6a611c64612766565b836128b1565b611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca090614e20565b60405180910390fd5b611cb584848484612cb1565b50505050565b611cc3612766565b73ffffffffffffffffffffffffffffffffffffffff16611ce16119ec565b73ffffffffffffffffffffffffffffffffffffffff1614611d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2e90614d60565b60405180910390fd5b601560039054906101000a900460ff1615601560036101000a81548160ff021916908315150217905550565b600e6020528060005260406000206000915090505481565b6060611d868261276e565b611dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbc90614dc0565b60405180910390fd5b6012611dd083612d0d565b604051602001611de192919061496d565b6040516020818303038152906040529050919050565b601560029054906101000a900460ff1681565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601560019054906101000a900460ff16611ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9990614c20565b60405180910390fd5b6014811115611ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edd90614be0565b60405180910390fd5b610226611e61611ef691906150e2565b81611eff61119d565b611f099190615001565b1115611f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4190614e00565b60405180910390fd5b3481669fdf42f6e48000611f5e9190615088565b1115611f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9690614ec0565b60405180910390fd5b80600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fee9190615001565b9250508190555060005b818110156120305761201d33600161200e61119d565b6120189190615001565b612893565b808061202890615246565b915050611ff8565b5050565b611c3b81565b601560039054906101000a900460ff1680156120635750601560019054906101000a900460ff16155b801561207c5750601560009054906101000a900460ff16155b6120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b290614d40565b60405180910390fd5b610226600c541115612102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f990614c60565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600081116121ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c590614e80565b60405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c60008282546122249190615001565b9250508190555060005b818110156122665761225333600161224461119d565b61224e9190615001565b612893565b808061225e90615246565b91505061222e565b5050565b601560019054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612319612766565b73ffffffffffffffffffffffffffffffffffffffff166123376119ec565b73ffffffffffffffffffffffffffffffffffffffff161461238d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238490614d60565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f490614b60565b60405180910390fd5b61240681612beb565b50565b601560009054906101000a900460ff16612458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244f90614ac0565b60405180910390fd5b61246182612e6e565b6124a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249790614ae0565b60405180910390fd5b611c3b81600d546124b19190615001565b11156124f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e990614e60565b60405180910390fd5b600a81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461253f9190615001565b1115612580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257790614ea0565b60405180910390fd5b3481669fdf42f6e480006125949190615088565b11156125d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cc90614ec0565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126249190615001565b9250508190555080600d600082825461263d9190615001565b9250508190555060005b8181101561267f5761266c33600161265d61119d565b6126679190615001565b612893565b808061267790615246565b915050612647565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061274f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061275f575061275e82612f62565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661284d8361169a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6128ad828260405180602001604052806000815250612fcc565b5050565b60006128bc8261276e565b6128fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f290614c40565b60405180910390fd5b60006129068361169a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061297557508373ffffffffffffffffffffffffffffffffffffffff1661295d84610e84565b73ffffffffffffffffffffffffffffffffffffffff16145b806129865750612985818561227d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129af8261169a565b73ffffffffffffffffffffffffffffffffffffffff1614612a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fc90614d80565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6c90614ba0565b60405180910390fd5b612a80838383613027565b612a8b6000826127da565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612adb91906150e2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b329190615001565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612cbc84848461298f565b612cc88484848461313b565b612d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfe90614b40565b60405180910390fd5b50505050565b60606000821415612d55576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e69565b600082905060005b60008214612d87578080612d7090615246565b915050600a82612d809190615057565b9150612d5d565b60008167ffffffffffffffff811115612da357612da2615408565b5b6040519080825280601f01601f191660200182016040528015612dd55781602001600182028036833780820191505090505b5090505b60008514612e6257600182612dee91906150e2565b9150600a85612dfd91906152bd565b6030612e099190615001565b60f81b818381518110612e1f57612e1e6153d9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e5b9190615057565b9450612dd9565b8093505050505b919050565b600080336040518060400160405280600781526020017f7072697661746500000000000000000000000000000000000000000000000000815250604051602001612eb9929190614945565b60405160208183030381529060405280519060200120604051602001612edf9190614991565b604051602081830303815290604052805190602001209050612f0a83826132d290919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612fd683836132f9565b612fe3600084848461313b565b613022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301990614b40565b60405180910390fd5b505050565b6130328383836134c7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561307557613070816134cc565b6130b4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130b3576130b28382613515565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130f7576130f281613682565b613136565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613135576131348282613753565b5b5b505050565b600061315c8473ffffffffffffffffffffffffffffffffffffffff166137d2565b156132c5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613185612766565b8786866040518563ffffffff1660e01b81526004016131a794939291906149d2565b602060405180830381600087803b1580156131c157600080fd5b505af19250505080156131f257506040513d601f19601f820116820180604052508101906131ef91906141de565b60015b613275573d8060008114613222576040519150601f19603f3d011682016040523d82523d6000602084013e613227565b606091505b5060008151141561326d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326490614b40565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132ca565b600190505b949350505050565b60008060006132e185856137e5565b915091506132ee81613868565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613369576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336090614d00565b60405180910390fd5b6133728161276e565b156133b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a990614b80565b60405180910390fd5b6133be60008383613027565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461340e9190615001565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161352284611758565b61352c91906150e2565b9050600060076000848152602001908152602001600020549050818114613611576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061369691906150e2565b90506000600960008481526020019081526020016000205490506000600883815481106136c6576136c56153d9565b5b9060005260206000200154905080600883815481106136e8576136e76153d9565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613737576137366153aa565b5b6001900381819060005260206000200160009055905550505050565b600061375e83611758565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6000806041835114156138275760008060006020860151925060408601519150606086015160001a905061381b87828585613a3d565b94509450505050613861565b60408351141561385857600080602085015191506040850151905061384d868383613b4a565b935093505050613861565b60006002915091505b9250929050565b6000600481111561387c5761387b61534c565b5b81600481111561388f5761388e61534c565b5b141561389a57613a3a565b600160048111156138ae576138ad61534c565b5b8160048111156138c1576138c061534c565b5b1415613902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138f990614aa0565b60405180910390fd5b600260048111156139165761391561534c565b5b8160048111156139295761392861534c565b5b141561396a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396190614b00565b60405180910390fd5b6003600481111561397e5761397d61534c565b5b8160048111156139915761399061534c565b5b14156139d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c990614c00565b60405180910390fd5b6004808111156139e5576139e461534c565b5b8160048111156139f8576139f761534c565b5b1415613a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3090614ce0565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613a78576000600391509150613b41565b601b8560ff1614158015613a905750601c8560ff1614155b15613aa2576000600491509150613b41565b600060018787878760405160008152602001604052604051613ac79493929190614a39565b6020604051602081039080840390855afa158015613ae9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b3857600060019250925050613b41565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613b8a87828885613a3d565b935093505050935093915050565b828054613ba4906151e3565b90600052602060002090601f016020900481019282613bc65760008555613c0d565b82601f10613bdf57803560ff1916838001178555613c0d565b82800160010185558215613c0d579182015b82811115613c0c578235825591602001919060010190613bf1565b5b509050613c1a9190613c1e565b5090565b5b80821115613c37576000816000905550600101613c1f565b5090565b6000613c4e613c4984614f20565b614efb565b90508083825260208201905082856020860282011115613c7157613c70615441565b5b60005b85811015613ca15781613c878882613d5d565b845260208401935060208301925050600181019050613c74565b5050509392505050565b6000613cbe613cb984614f4c565b614efb565b90508083825260208201905082856020860282011115613ce157613ce0615441565b5b60005b85811015613d115781613cf78882613ee7565b845260208401935060208301925050600181019050613ce4565b5050509392505050565b6000613d2e613d2984614f78565b614efb565b905082815260208101848484011115613d4a57613d49615446565b5b613d558482856151a1565b509392505050565b600081359050613d6c81615c94565b92915050565b60008083601f840112613d8857613d8761543c565b5b8235905067ffffffffffffffff811115613da557613da4615437565b5b602083019150836020820283011115613dc157613dc0615441565b5b9250929050565b600082601f830112613ddd57613ddc61543c565b5b8135613ded848260208601613c3b565b91505092915050565b600082601f830112613e0b57613e0a61543c565b5b8135613e1b848260208601613cab565b91505092915050565b600081359050613e3381615cab565b92915050565b600081359050613e4881615cc2565b92915050565b600081519050613e5d81615cc2565b92915050565b600082601f830112613e7857613e7761543c565b5b8135613e88848260208601613d1b565b91505092915050565b60008083601f840112613ea757613ea661543c565b5b8235905067ffffffffffffffff811115613ec457613ec3615437565b5b602083019150836001820283011115613ee057613edf615441565b5b9250929050565b600081359050613ef681615cd9565b92915050565b600060208284031215613f1257613f11615450565b5b6000613f2084828501613d5d565b91505092915050565b60008060408385031215613f4057613f3f615450565b5b6000613f4e85828601613d5d565b9250506020613f5f85828601613d5d565b9150509250929050565b600080600060608486031215613f8257613f81615450565b5b6000613f9086828701613d5d565b9350506020613fa186828701613d5d565b9250506040613fb286828701613ee7565b9150509250925092565b60008060008060808587031215613fd657613fd5615450565b5b6000613fe487828801613d5d565b9450506020613ff587828801613d5d565b935050604061400687828801613ee7565b925050606085013567ffffffffffffffff8111156140275761402661544b565b5b61403387828801613e63565b91505092959194509250565b6000806040838503121561405657614055615450565b5b600061406485828601613d5d565b925050602061407585828601613e24565b9150509250929050565b6000806040838503121561409657614095615450565b5b60006140a485828601613d5d565b92505060206140b585828601613ee7565b9150509250929050565b600080602083850312156140d6576140d5615450565b5b600083013567ffffffffffffffff8111156140f4576140f361544b565b5b61410085828601613d72565b92509250509250929050565b6000806040838503121561412357614122615450565b5b600083013567ffffffffffffffff8111156141415761414061544b565b5b61414d85828601613dc8565b925050602083013567ffffffffffffffff81111561416e5761416d61544b565b5b61417a85828601613df6565b9150509250929050565b60006020828403121561419a57614199615450565b5b60006141a884828501613e24565b91505092915050565b6000602082840312156141c7576141c6615450565b5b60006141d584828501613e39565b91505092915050565b6000602082840312156141f4576141f3615450565b5b600061420284828501613e4e565b91505092915050565b6000806040838503121561422257614221615450565b5b600083013567ffffffffffffffff8111156142405761423f61544b565b5b61424c85828601613e63565b925050602061425d85828601613ee7565b9150509250929050565b6000806020838503121561427e5761427d615450565b5b600083013567ffffffffffffffff81111561429c5761429b61544b565b5b6142a885828601613e91565b92509250509250929050565b6000602082840312156142ca576142c9615450565b5b60006142d884828501613ee7565b91505092915050565b6142ea81615116565b82525050565b6143016142fc82615116565b61528f565b82525050565b61431081615128565b82525050565b61431f81615134565b82525050565b61433661433182615134565b6152a1565b82525050565b600061434782614fbe565b6143518185614fd4565b93506143618185602086016151b0565b61436a81615455565b840191505092915050565b600061438082614fc9565b61438a8185614fe5565b935061439a8185602086016151b0565b6143a381615455565b840191505092915050565b60006143b982614fc9565b6143c38185614ff6565b93506143d38185602086016151b0565b80840191505092915050565b600081546143ec816151e3565b6143f68186614ff6565b94506001821660008114614411576001811461442257614455565b60ff19831686528186019350614455565b61442b85614fa9565b60005b8381101561444d5781548189015260018201915060208101905061442e565b838801955050505b50505092915050565b600061446b601883614fe5565b915061447682615473565b602082019050919050565b600061448e600e83614fe5565b91506144998261549c565b602082019050919050565b60006144b1601683614fe5565b91506144bc826154c5565b602082019050919050565b60006144d4601f83614fe5565b91506144df826154ee565b602082019050919050565b60006144f7601c83614ff6565b915061450282615517565b601c82019050919050565b600061451a602b83614fe5565b915061452582615540565b604082019050919050565b600061453d603283614fe5565b91506145488261558f565b604082019050919050565b6000614560602683614fe5565b915061456b826155de565b604082019050919050565b6000614583601c83614fe5565b915061458e8261562d565b602082019050919050565b60006145a6602483614fe5565b91506145b182615656565b604082019050919050565b60006145c9601983614fe5565b91506145d4826156a5565b602082019050919050565b60006145ec602483614fe5565b91506145f7826156ce565b604082019050919050565b600061460f602283614fe5565b915061461a8261571d565b604082019050919050565b6000614632600b83614fe5565b915061463d8261576c565b602082019050919050565b6000614655602c83614fe5565b915061466082615795565b604082019050919050565b6000614678601783614fe5565b9150614683826157e4565b602082019050919050565b600061469b603883614fe5565b91506146a68261580d565b604082019050919050565b60006146be602a83614fe5565b91506146c98261585c565b604082019050919050565b60006146e1602983614fe5565b91506146ec826158ab565b604082019050919050565b6000614704602283614fe5565b915061470f826158fa565b604082019050919050565b6000614727602083614fe5565b915061473282615949565b602082019050919050565b600061474a602c83614fe5565b915061475582615972565b604082019050919050565b600061476d600f83614fe5565b9150614778826159c1565b602082019050919050565b6000614790602083614fe5565b915061479b826159ea565b602082019050919050565b60006147b3602983614fe5565b91506147be82615a13565b604082019050919050565b60006147d6602483614fe5565b91506147e182615a62565b604082019050919050565b60006147f9601f83614fe5565b915061480482615ab1565b602082019050919050565b600061481c602183614fe5565b915061482782615ada565b604082019050919050565b600061483f600a83614fe5565b915061484a82615b29565b602082019050919050565b6000614862603183614fe5565b915061486d82615b52565b604082019050919050565b6000614885602c83614fe5565b915061489082615ba1565b604082019050919050565b60006148a8600e83614fe5565b91506148b382615bf0565b602082019050919050565b60006148cb600e83614fe5565b91506148d682615c19565b602082019050919050565b60006148ee600c83614fe5565b91506148f982615c42565b602082019050919050565b6000614911601083614fe5565b915061491c82615c6b565b602082019050919050565b6149308161518a565b82525050565b61493f81615194565b82525050565b600061495182856142f0565b60148201915061496182846143ae565b91508190509392505050565b600061497982856143df565b915061498582846143ae565b91508190509392505050565b600061499c826144ea565b91506149a88284614325565b60208201915081905092915050565b60006020820190506149cc60008301846142e1565b92915050565b60006080820190506149e760008301876142e1565b6149f460208301866142e1565b614a016040830185614927565b8181036060830152614a13818461433c565b905095945050505050565b6000602082019050614a336000830184614307565b92915050565b6000608082019050614a4e6000830187614316565b614a5b6020830186614936565b614a686040830185614316565b614a756060830184614316565b95945050505050565b60006020820190508181036000830152614a988184614375565b905092915050565b60006020820190508181036000830152614ab98161445e565b9050919050565b60006020820190508181036000830152614ad981614481565b9050919050565b60006020820190508181036000830152614af9816144a4565b9050919050565b60006020820190508181036000830152614b19816144c7565b9050919050565b60006020820190508181036000830152614b398161450d565b9050919050565b60006020820190508181036000830152614b5981614530565b9050919050565b60006020820190508181036000830152614b7981614553565b9050919050565b60006020820190508181036000830152614b9981614576565b9050919050565b60006020820190508181036000830152614bb981614599565b9050919050565b60006020820190508181036000830152614bd9816145bc565b9050919050565b60006020820190508181036000830152614bf9816145df565b9050919050565b60006020820190508181036000830152614c1981614602565b9050919050565b60006020820190508181036000830152614c3981614625565b9050919050565b60006020820190508181036000830152614c5981614648565b9050919050565b60006020820190508181036000830152614c798161466b565b9050919050565b60006020820190508181036000830152614c998161468e565b9050919050565b60006020820190508181036000830152614cb9816146b1565b9050919050565b60006020820190508181036000830152614cd9816146d4565b9050919050565b60006020820190508181036000830152614cf9816146f7565b9050919050565b60006020820190508181036000830152614d198161471a565b9050919050565b60006020820190508181036000830152614d398161473d565b9050919050565b60006020820190508181036000830152614d5981614760565b9050919050565b60006020820190508181036000830152614d7981614783565b9050919050565b60006020820190508181036000830152614d99816147a6565b9050919050565b60006020820190508181036000830152614db9816147c9565b9050919050565b60006020820190508181036000830152614dd9816147ec565b9050919050565b60006020820190508181036000830152614df98161480f565b9050919050565b60006020820190508181036000830152614e1981614832565b9050919050565b60006020820190508181036000830152614e3981614855565b9050919050565b60006020820190508181036000830152614e5981614878565b9050919050565b60006020820190508181036000830152614e798161489b565b9050919050565b60006020820190508181036000830152614e99816148be565b9050919050565b60006020820190508181036000830152614eb9816148e1565b9050919050565b60006020820190508181036000830152614ed981614904565b9050919050565b6000602082019050614ef56000830184614927565b92915050565b6000614f05614f16565b9050614f118282615215565b919050565b6000604051905090565b600067ffffffffffffffff821115614f3b57614f3a615408565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f6757614f66615408565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f9357614f92615408565b5b614f9c82615455565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061500c8261518a565b91506150178361518a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561504c5761504b6152ee565b5b828201905092915050565b60006150628261518a565b915061506d8361518a565b92508261507d5761507c61531d565b5b828204905092915050565b60006150938261518a565b915061509e8361518a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150d7576150d66152ee565b5b828202905092915050565b60006150ed8261518a565b91506150f88361518a565b92508282101561510b5761510a6152ee565b5b828203905092915050565b60006151218261516a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156151ce5780820151818401526020810190506151b3565b838111156151dd576000848401525b50505050565b600060028204905060018216806151fb57607f821691505b6020821081141561520f5761520e61537b565b5b50919050565b61521e82615455565b810181811067ffffffffffffffff8211171561523d5761523c615408565b5b80604052505050565b60006152518261518a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615284576152836152ee565b5b600182019050919050565b600061529a826152ab565b9050919050565b6000819050919050565b60006152b682615466565b9050919050565b60006152c88261518a565b91506152d38361518a565b9250826152e3576152e261531d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f50524553414c455f434c4f534544000000000000000000000000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f544f4b454e20524551554553542045584345454420504552205452414e53414360008201527f54494f4e00000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4672656573616c655f4c696d69745f4578636565646564000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4672656573616c655f436c6f7365640000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60008201527f636b656400000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4558434545445f4d415800000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4558434545445f50524956415445000000000000000000000000000000000000600082015250565b7f4c696d6974204578636565646564000000000000000000000000000000000000600082015250565b7f4558434545445f414c4c4f430000000000000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b615c9d81615116565b8114615ca857600080fd5b50565b615cb481615128565b8114615cbf57600080fd5b50565b615ccb8161513e565b8114615cd657600080fd5b50565b615ce28161518a565b8114615ced57600080fd5b5056fea264697066735822122097866e0ad08de2776fe5445d2f151f5e80d9d4a48c4262b0a62ba30d947a130264736f6c63430008070033

Deployed Bytecode Sourcemap

51816:6325:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38488:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57672:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57576:86;;;;;;;;;;;;;:::i;:::-;;25947:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27594:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27120:408;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52335:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52789:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53380:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54281:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52516:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39237:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52595:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28598:373;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38844:317;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56679:441;;;;;;;;;;;;;:::i;:::-;;29042:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53572:296;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52225:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39424:294;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51984:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57779:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53260:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57128:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52163:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52073:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25577:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52292:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52369:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25243:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9405:94;;;;;;;;;;;;;:::i;:::-;;57473:95;;;;;;;;;;;;;:::i;:::-;;57263:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53298:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8754:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26116:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52728:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27951:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52850:63;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29295:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57367:98;;;;;;;;;;;;;:::i;:::-;;52672:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57895:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53355:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55772:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54567:576;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51927:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55151:613;;;;;;;;;;;;;:::i;:::-;;53328:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28337:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9654:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55915:756;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38488:272;38615:4;38668:35;38653:50;;;:11;:50;;;;:99;;;;38716:36;38740:11;38716:23;:36::i;:::-;38653:99;38637:115;;38488:272;;;:::o;57672:99::-;8985:12;:10;:12::i;:::-;8974:23;;:7;:5;:7::i;:::-;:23;;;8966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57759:4:::1;57742:14;;:21;;;;;;;;;;;;;;;;;;57672:99:::0;:::o;57576:86::-;8985:12;:10;:12::i;:::-;8974:23;;:7;:5;:7::i;:::-;:23;;;8966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57646:8:::1;;;;;;;;;;;57645:9;57634:8;;:20;;;;;;;;;;;;;;;;;;57576:86::o:0;25947:100::-;26001:13;26034:5;26027:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25947:100;:::o;27594:285::-;27692:7;27739:16;27747:7;27739;:16::i;:::-;27717:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27847:15;:24;27863:7;27847:24;;;;;;;;;;;;;;;;;;;;;27840:31;;27594:285;;;:::o;27120:408::-;27198:13;27214:23;27229:7;27214:14;:23::i;:::-;27198:39;;27262:5;27256:11;;:2;:11;;;;27248:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27356:5;27340:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27365:37;27382:5;27389:12;:10;:12::i;:::-;27365:16;:37::i;:::-;27340:62;27318:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27499:21;27508:2;27512:7;27499:8;:21::i;:::-;27187:341;27120:408;;:::o;52335:27::-;;;;:::o;52789:54::-;;;;;;;;;;;;;;;;;:::o;53380:24::-;;;;;;;;;;;;;:::o;54281:278::-;8985:12;:10;:12::i;:::-;8974:23;;:7;:5;:7::i;:::-;:23;;;8966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52202:4:::1;54379:9;;:16;;54363:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:50;;54355:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54444:6;54439:113;54460:9;;:16;;54456:1;:20;54439:113;;;54498:42;54508:9;;54518:1;54508:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;54538:1;54522:13;:11;:13::i;:::-;:17;;;;:::i;:::-;54498:9;:42::i;:::-;54478:3;;;;;:::i;:::-;;;;54439:113;;;;54281:278:::0;;:::o;52516:54::-;52559:11;52516:54;:::o;39237:110::-;39298:4;39322:10;:17;;;;39315:24;;39237:110;:::o;52595:53::-;52637:11;52595:53;:::o;28598:373::-;28804:41;28823:12;:10;:12::i;:::-;28837:7;28804:18;:41::i;:::-;28782:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;28935:28;28945:4;28951:2;28955:7;28935:9;:28::i;:::-;28598:373;;;:::o;38844:317::-;38963:4;39015:23;39032:5;39015:16;:23::i;:::-;39007:5;:31;38985:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;39127:12;:19;39140:5;39127:19;;;;;;;;;;;;;;;:26;39147:5;39127:26;;;;;;;;;;;;39120:33;;38844:317;;;;:::o;56679:441::-;56719:12;56734:21;56719:36;;56784:1;56774:7;:11;56766:20;;;;;;56797:29;56838:42;56797:84;;56892:18;56930:3;56924:2;56915:7;:12;;;;:::i;:::-;56914:20;;;;:::i;:::-;56892:42;;56945:13;:22;;:37;56968:13;56945:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57072:7;:5;:7::i;:::-;57064:25;;:48;57090:21;57064:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56708:412;;;56679:441::o;29042:182::-;29177:39;29194:4;29200:2;29204:7;29177:39;;;;;;;;;;;;:16;:39::i;:::-;29042:182;;;:::o;53572:296::-;8985:12;:10;:12::i;:::-;8974:23;;:7;:5;:7::i;:::-;:23;;;8966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53715:7:::1;:14;53696:8;:15;:33;53687:43;;;::::0;::::1;;53746:6;53741:120;53758:8;:15;53755:1;:18;53741:120;;;53839:7;53847:1;53839:10;;;;;;;;:::i;:::-;;;;;;;;53794:30;:43;53825:8;53834:1;53825:11;;;;;;;;:::i;:::-;;;;;;;;53794:43;;;;;;;;;;;;;;;:55;;;;53774:3;;;;;:::i;:::-;;;;53741:120;;;;53572:296:::0;;:::o;52225:48::-;52270:3;52225:48;:::o;39424:294::-;39521:4;39573:30;:28;:30::i;:::-;39565:5;:38;39543:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;39693:10;39704:5;39693:17;;;;;;;;:::i;:::-;;;;;;;;;;39686:24;;39424:294;;;:::o;51984:51::-;52033:2;51984:51;:::o;57779:108::-;8985:12;:10;:12::i;:::-;8974:23;;:7;:5;:7::i;:::-;:23;;;8966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53450:6:::1;;;;;;;;;;;53449:7;53441:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;57876:3:::2;;57860:13;:19;;;;;;;:::i;:::-;;57779:108:::0;;:::o;53260:31::-;;;;:::o;57128:127::-;57196:4;57220:21;:27;57242:4;57220:27;;;;;;;;;;;;;;;;57213:34;;57128:127;;;:::o;52163:43::-;52202:4;52163:43;:::o;52073:52::-;52123:2;52073:52;:::o;25577:303::-;25671:7;25696:13;25712:7;:16;25720:7;25712:16;;;;;;;;;;;;;;;;;;;;;25696:32;;25778:1;25761:19;;:5;:19;;;;25739:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25867:5;25860:12;;;25577:303;;;:::o;52292:36::-;;;;:::o;52369:31::-;;;;:::o;25243:272::-;25340:4;25401:1;25384:19;;:5;:19;;;;25362:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25491:9;:16;25501:5;25491:16;;;;;;;;;;;;;;;;25484:23;;25243:272;;;:::o;9405:94::-;8985:12;:10;:12::i;:::-;8974:23;;:7;:5;:7::i;:::-;:23;;;8966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9470:21:::1;9488:1;9470:9;:21::i;:::-;9405:94::o:0;57473:95::-;8985:12;:10;:12::i;:::-;8974:23;;:7;:5;:7::i;:::-;:23;;;8966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57549:11:::1;;;;;;;;;;;57548:12;57534:11;;:26;;;;;;;;;;;;;;;;;;57473:95::o:0;57263:96::-;8985:12;:10;:12::i;:::-;8974:23;;:7;:5;:7::i;:::-;:23;;;8966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57341:10:::1;57332:6;;:19;;;;;;;;;;;;;;;;;;57263:96:::0;:::o;53298:23::-;;;;;;;;;;;;;:::o;8754:87::-;8800:7;8827:6;;;;;;;;;;;8820:13;;8754:87;:::o;26116:104::-;26172:13;26205:7;26198:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26116:104;:::o;52728:54::-;;;;;;;;;;;;;;;;;:::o;27951:315::-;28086:12;:10;:12::i;:::-;28074:24;;:8;:24;;;;28066:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28186:8;28141:18;:32;28160:12;:10;:12::i;:::-;28141:32;;;;;;;;;;;;;;;:42;28174:8;28141:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28239:8;28210:48;;28225:12;:10;:12::i;:::-;28210:48;;;28249:8;28210:48;;;;;;:::i;:::-;;;;;;;;27951:315;;:::o;52850:63::-;;;;;;;;;;;;;;;;;:::o;29295:362::-;29481:41;29500:12;:10;:12::i;:::-;29514:7;29481:18;:41::i;:::-;29459:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;29610:39;29624:4;29630:2;29634:7;29643:5;29610:13;:39::i;:::-;29295:362;;;;:::o;57367:98::-;8985:12;:10;:12::i;:::-;8974:23;;:7;:5;:7::i;:::-;:23;;;8966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57445:12:::1;;;;;;;;;;;57444:13;57429:12;;:28;;;;;;;;;;;;;;;;;;57367:98::o:0;52672:49::-;;;;;;;;;;;;;;;;;:::o;57895:243::-;57965:13;57999:16;58007:7;57999;:16::i;:::-;57991:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;58095:13;58110:18;:7;:16;:18::i;:::-;58078:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58064:66;;57895:243;;;:::o;53355:18::-;;;;;;;;;;;;;:::o;55772:135::-;55844:4;55868:21;:31;55890:8;55868:31;;;;;;;;;;;;;;;;55861:38;;55772:135;;;:::o;54567:576::-;54637:8;;;;;;;;;;;54628:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;52123:2;54681:13;:43;;54672:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;52270:3;52202:4;54819:37;;;;:::i;:::-;54801:13;54785;:11;:13::i;:::-;:29;;;;:::i;:::-;:72;;54776:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;54931:9;54914:13;52559:11;54892:35;;;;:::i;:::-;:48;;54883:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;55004:13;54972:16;:28;54989:10;54972:28;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;55033:6;55028:108;55049:13;55045:1;:17;55028:108;;;55084:40;55094:10;55122:1;55106:13;:11;:13::i;:::-;:17;;;;:::i;:::-;55084:9;:40::i;:::-;55064:3;;;;;:::i;:::-;;;;55028:108;;;;54567:576;:::o;51927:40::-;51963:4;51927:40;:::o;55151:613::-;55203:12;;;;;;;;;;;:25;;;;;55220:8;;;;;;;;;;;55219:9;55203:25;:41;;;;;55233:11;;;;;;;;;;;55232:12;55203:41;55194:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;52270:3;55284:15;;:39;;55275:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55362:19;55384:30;:42;55415:10;55384:42;;;;;;;;;;;;;;;;55362:64;;55482:1;55437:30;:42;55468:10;55437:42;;;;;;;;;;;;;;;:46;;;;55520:1;55503:14;:18;55494:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;55585:14;55551:21;:33;55573:10;55551:33;;;;;;;;;;;;;;;:48;;;;55629:14;55610:15;;:33;;;;;;;:::i;:::-;;;;;;;;55659:6;55654:103;55670:14;55668:1;:16;55654:103;;;55705:40;55716:10;55742:1;55728:13;:11;:13::i;:::-;:15;;;;:::i;:::-;55705:9;:40::i;:::-;55685:3;;;;;:::i;:::-;;;;55654:103;;;;55183:581;55151:613::o;53328:20::-;;;;;;;;;;;;;:::o;28337:194::-;28459:4;28488:18;:25;28507:5;28488:25;;;;;;;;;;;;;;;:35;28514:8;28488:35;;;;;;;;;;;;;;;;;;;;;;;;;28481:42;;28337:194;;;;:::o;9654:229::-;8985:12;:10;:12::i;:::-;8974:23;;:7;:5;:7::i;:::-;:23;;;8966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9777:1:::1;9757:22;;:8;:22;;;;9735:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;9856:19;9866:8;9856:9;:19::i;:::-;9654:229:::0;:::o;55915:756::-;56016:11;;;;;;;;;;;56008:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;56092:28;56110:9;56092:17;:28::i;:::-;56084:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;51963:4;56188:13;56166:19;;:35;;;;:::i;:::-;:51;;56158:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;52033:2;56291:13;56255:21;:33;56277:10;56255:33;;;;;;;;;;;;;;;;:49;;;;:::i;:::-;:78;;56247:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56408:9;56391:13;52559:11;56369:35;;;;:::i;:::-;:48;;56361:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;56486:13;56449:21;:33;56471:10;56449:33;;;;;;;;;;;;;;;;:50;;;;;;;:::i;:::-;;;;;;;;56533:13;56510:19;;:36;;;;;;;:::i;:::-;;;;;;;;56561:6;56557:107;56577:13;56573:1;:17;56557:107;;;56612:40;56622:10;56650:1;56634:13;:11;:13::i;:::-;:17;;;;:::i;:::-;56612:9;:40::i;:::-;56592:3;;;;;:::i;:::-;;;;56557:107;;;;55915:756;;:::o;24856:323::-;24983:4;25036:25;25021:40;;;:11;:40;;;;:101;;;;25089:33;25074:48;;;:11;:48;;;;25021:101;:150;;;;25135:36;25159:11;25135:23;:36::i;:::-;25021:150;25005:166;;24856:323;;;:::o;1956:98::-;2009:7;2036:10;2029:17;;1956:98;:::o;31201:124::-;31263:4;31315:1;31287:30;;:7;:16;31295:7;31287:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31280:37;;31201:124;;;:::o;35276:171::-;35375:2;35348:15;:24;35364:7;35348:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35431:7;35427:2;35393:46;;35402:23;35417:7;35402:14;:23::i;:::-;35393:46;;;;;;;;;;;;35276:171;;:::o;32259:107::-;32332:26;32342:2;32346:7;32332:26;;;;;;;;;;;;:9;:26::i;:::-;32259:107;;:::o;31492:425::-;31602:4;31646:16;31654:7;31646;:16::i;:::-;31624:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31745:13;31761:23;31776:7;31761:14;:23::i;:::-;31745:39;;31814:5;31803:16;;:7;:16;;;:60;;;;31856:7;31832:31;;:20;31844:7;31832:11;:20::i;:::-;:31;;;31803:60;:105;;;;31876:32;31893:5;31900:7;31876:16;:32::i;:::-;31803:105;31795:114;;;31492:425;;;;:::o;34546:612::-;34716:4;34689:31;;:23;34704:7;34689:14;:23::i;:::-;:31;;;34667:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;34822:1;34808:16;;:2;:16;;;;34800:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34878:39;34899:4;34905:2;34909:7;34878:20;:39::i;:::-;34982:29;34999:1;35003:7;34982:8;:29::i;:::-;35043:1;35024:9;:15;35034:4;35024:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35072:1;35055:9;:13;35065:2;35055:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35103:2;35084:7;:16;35092:7;35084:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35142:7;35138:2;35123:27;;35132:4;35123:27;;;;;;;;;;;;34546:612;;;:::o;9891:173::-;9947:16;9966:6;;;;;;;;;;;9947:25;;9992:8;9983:6;;:17;;;;;;;;;;;;;;;;;;10047:8;10016:40;;10037:8;10016:40;;;;;;;;;;;;9936:128;9891:173;:::o;30539:349::-;30693:28;30703:4;30709:2;30713:7;30693:9;:28::i;:::-;30754:48;30777:4;30783:2;30787:7;30796:5;30754:22;:48::i;:::-;30732:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;30539:349;;;;:::o;12149:711::-;12202:13;12432:1;12423:5;:10;12419:53;;;12450:10;;;;;;;;;;;;;;;;;;;;;12419:53;12482:9;12494:5;12482:17;;12510:11;12532:78;12547:1;12539:4;:9;12532:78;;12565:8;;;;;:::i;:::-;;;;12596:2;12588:10;;;;;:::i;:::-;;;12532:78;;;12620:19;12652:6;12642:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12620:39;;12670:151;12686:1;12677:5;:10;12670:151;;12714:1;12704:11;;;;;:::i;:::-;;;12778:2;12770:5;:10;;;;:::i;:::-;12760:2;:21;;;;:::i;:::-;12747:36;;12730:6;12737;12730:14;;;;;;;;:::i;:::-;;;;;:53;;;;;;;;;;;12807:2;12798:11;;;;;:::i;:::-;;;12670:151;;;12845:6;12831:21;;;;;12149:711;;;;:::o;53876:330::-;53948:4;53965:12;54105:10;54117:8;;;;;;;;;;;;;;;;;54088:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54078:49;;;;;;53990:138;;;;;;;;:::i;:::-;;;;;;;;;;;;;53980:159;;;;;;53965:174;;54175:23;54188:9;54175:4;:12;;:23;;;;:::i;:::-;54157:41;;:14;;;;;;;;;;;:41;;;54150:48;;;53876:330;;;:::o;11703:187::-;11813:4;11857:25;11842:40;;;:11;:40;;;;11835:47;;11703:187;;;:::o;32590:318::-;32717:18;32723:2;32727:7;32717:5;:18::i;:::-;32768:54;32799:1;32803:2;32807:7;32816:5;32768:22;:54::i;:::-;32746:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32590:318;;;:::o;40331:586::-;40472:45;40499:4;40505:2;40509:7;40472:26;:45::i;:::-;40550:1;40534:18;;:4;:18;;;40530:187;;;40569:40;40601:7;40569:31;:40::i;:::-;40530:187;;;40639:2;40631:10;;:4;:10;;;40627:90;;40658:47;40691:4;40697:7;40658:32;:47::i;:::-;40627:90;40530:187;40745:1;40731:16;;:2;:16;;;40727:183;;;40764:45;40801:7;40764:36;:45::i;:::-;40727:183;;;40837:4;40831:10;;:2;:10;;;40827:83;;40858:40;40886:2;40890:7;40858:27;:40::i;:::-;40827:83;40727:183;40331:586;;;:::o;36009:953::-;36161:4;36182:15;:2;:13;;;:15::i;:::-;36178:777;;;36247:2;36231:36;;;36286:12;:10;:12::i;:::-;36317:4;36340:7;36366:5;36231:155;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36214:686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36590:1;36573:6;:13;:18;36569:316;;;36616:104;;;;;;;;;;:::i;:::-;;;;;;;;36569:316;36835:6;36829:13;36820:6;36816:2;36812:15;36805:38;36214:686;36460:45;;;36450:55;;;:6;:55;;;;36443:62;;;;;36178:777;36939:4;36932:11;;36009:953;;;;;;;:::o;49031:231::-;49109:7;49130:17;49149:18;49171:27;49182:4;49188:9;49171:10;:27::i;:::-;49129:69;;;;49209:18;49221:5;49209:11;:18::i;:::-;49245:9;49238:16;;;;49031:231;;;;:::o;33244:379::-;33335:1;33321:16;;:2;:16;;;;33313:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33394:16;33402:7;33394;:16::i;:::-;33393:17;33385:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33456:45;33485:1;33489:2;33493:7;33456:20;:45::i;:::-;33531:1;33514:9;:13;33524:2;33514:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33562:2;33543:7;:16;33551:7;33543:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33607:7;33603:2;33582:33;;33599:1;33582:33;;;;;;;;;;;;33244:379;;:::o;37534:123::-;;;;:::o;41628:161::-;41729:10;:17;;;;41702:15;:24;41718:7;41702:24;;;;;;;;;;;:44;;;;41757:10;41773:7;41757:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41628:161;:::o;42413:986::-;42686:19;42733:1;42708:22;42725:4;42708:16;:22::i;:::-;:26;;;;:::i;:::-;42686:48;;42745:15;42763:17;:26;42781:7;42763:26;;;;;;;;;;;;42745:44;;42910:14;42896:10;:28;42892:325;;42941:16;42960:12;:18;42973:4;42960:18;;;;;;;;;;;;;;;:34;42979:14;42960:34;;;;;;;;;;;;42941:53;;43044:11;43011:12;:18;43024:4;43011:18;;;;;;;;;;;;;;;:30;43030:10;43011:30;;;;;;;;;;;:44;;;;43161:10;43128:17;:30;43146:11;43128:30;;;;;;;;;;;:43;;;;42926:291;42892:325;43313:17;:26;43331:7;43313:26;;;;;;;;;;;43306:33;;;43357:12;:18;43370:4;43357:18;;;;;;;;;;;;;;;:34;43376:14;43357:34;;;;;;;;;;;43350:41;;;42501:898;;42413:986;;:::o;43691:1067::-;43941:19;43983:1;43963:10;:17;;;;:21;;;;:::i;:::-;43941:43;;43995:15;44013;:24;44029:7;44013:24;;;;;;;;;;;;43995:42;;44364:16;44383:10;44394:14;44383:26;;;;;;;;:::i;:::-;;;;;;;;;;44364:45;;44447:11;44422:10;44433;44422:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;44558:10;44527:15;:28;44543:11;44527:28;;;;;;;;;;;:41;;;;44699:15;:24;44715:7;44699:24;;;;;;;;;;;44692:31;;;44734:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43759:999;;;43691:1067;:::o;41215:215::-;41297:11;41311:20;41328:2;41311:16;:20::i;:::-;41297:34;;41369:7;41342:12;:16;41355:2;41342:16;;;;;;;;;;;;;;;:24;41359:6;41342:24;;;;;;;;;;;:34;;;;41416:6;41387:17;:26;41405:7;41387:26;;;;;;;;;;;:35;;;;41286:144;41215:215;;:::o;14602:384::-;14662:4;14870:9;14934:7;14922:20;14914:28;;14977:1;14970:4;:8;14963:15;;;14602:384;;;:::o;46921:1308::-;47002:7;47011:12;47256:2;47236:9;:16;:22;47232:990;;;47275:9;47299;47323:7;47532:4;47521:9;47517:20;47511:27;47506:32;;47582:4;47571:9;47567:20;47561:27;47556:32;;47640:4;47629:9;47625:20;47619:27;47616:1;47611:36;47606:41;;47683:25;47694:4;47700:1;47703;47706;47683:10;:25::i;:::-;47676:32;;;;;;;;;47232:990;47750:2;47730:9;:16;:22;47726:496;;;47769:9;47793:10;48005:4;47994:9;47990:20;47984:27;47979:32;;48056:4;48045:9;48041:20;48035:27;48029:33;;48098:23;48109:4;48115:1;48118:2;48098:10;:23::i;:::-;48091:30;;;;;;;;47726:496;48170:1;48174:35;48154:56;;;;46921:1308;;;;;;:::o;45192:643::-;45270:20;45261:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;45257:571;;;45307:7;;45257:571;45368:29;45359:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;45355:473;;;45414:34;;;;;;;;;;:::i;:::-;;;;;;;;45355:473;45479:35;45470:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;45466:362;;;45531:41;;;;;;;;;;:::i;:::-;;;;;;;;45466:362;45603:30;45594:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;45590:238;;;45650:44;;;;;;;;;;:::i;:::-;;;;;;;;45590:238;45725:30;45716:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;45712:116;;;45772:44;;;;;;;;;;:::i;:::-;;;;;;;;45712:116;45192:643;;:::o;50358:748::-;50489:7;50498:12;50539:66;50534:1;50529:7;;:76;50525:160;;;50638:1;50642:30;50622:51;;;;;;50525:160;50704:2;50699:1;:7;;;;:18;;;;;50715:2;50710:1;:7;;;;50699:18;50695:102;;;50750:1;50754:30;50734:51;;;;;;50695:102;50894:14;50911:24;50921:4;50927:1;50930;50933;50911:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50894:41;;50968:1;50950:20;;:6;:20;;;50946:103;;;51003:1;51007:29;50987:50;;;;;;;50946:103;51069:6;51077:20;51061:37;;;;;50358:748;;;;;;;;:::o;49525:391::-;49639:7;49648:12;49673:9;49693:7;49748:66;49744:2;49740:75;49735:80;;49852:2;49847;49842:3;49838:12;49834:21;49829:26;;49883:25;49894:4;49900:1;49903;49906;49883:10;:25::i;:::-;49876:32;;;;;;49525:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:139::-;1959:5;1997:6;1984:20;1975:29;;2013:33;2040:5;2013:33;:::i;:::-;1913:139;;;;:::o;2075:568::-;2148:8;2158:6;2208:3;2201:4;2193:6;2189:17;2185:27;2175:122;;2216:79;;:::i;:::-;2175:122;2329:6;2316:20;2306:30;;2359:18;2351:6;2348:30;2345:117;;;2381:79;;:::i;:::-;2345:117;2495:4;2487:6;2483:17;2471:29;;2549:3;2541:4;2533:6;2529:17;2519:8;2515:32;2512:41;2509:128;;;2556:79;;:::i;:::-;2509:128;2075:568;;;;;:::o;2666:370::-;2737:5;2786:3;2779:4;2771:6;2767:17;2763:27;2753:122;;2794:79;;:::i;:::-;2753:122;2911:6;2898:20;2936:94;3026:3;3018:6;3011:4;3003:6;2999:17;2936:94;:::i;:::-;2927:103;;2743:293;2666:370;;;;:::o;3059:::-;3130:5;3179:3;3172:4;3164:6;3160:17;3156:27;3146:122;;3187:79;;:::i;:::-;3146:122;3304:6;3291:20;3329:94;3419:3;3411:6;3404:4;3396:6;3392:17;3329:94;:::i;:::-;3320:103;;3136:293;3059:370;;;;:::o;3435:133::-;3478:5;3516:6;3503:20;3494:29;;3532:30;3556:5;3532:30;:::i;:::-;3435:133;;;;:::o;3574:137::-;3619:5;3657:6;3644:20;3635:29;;3673:32;3699:5;3673:32;:::i;:::-;3574:137;;;;:::o;3717:141::-;3773:5;3804:6;3798:13;3789:22;;3820:32;3846:5;3820:32;:::i;:::-;3717:141;;;;:::o;3877:338::-;3932:5;3981:3;3974:4;3966:6;3962:17;3958:27;3948:122;;3989:79;;:::i;:::-;3948:122;4106:6;4093:20;4131:78;4205:3;4197:6;4190:4;4182:6;4178:17;4131:78;:::i;:::-;4122:87;;3938:277;3877:338;;;;:::o;4235:553::-;4293:8;4303:6;4353:3;4346:4;4338:6;4334:17;4330:27;4320:122;;4361:79;;:::i;:::-;4320:122;4474:6;4461:20;4451:30;;4504:18;4496:6;4493:30;4490:117;;;4526:79;;:::i;:::-;4490:117;4640:4;4632:6;4628:17;4616:29;;4694:3;4686:4;4678:6;4674:17;4664:8;4660:32;4657:41;4654:128;;;4701:79;;:::i;:::-;4654:128;4235:553;;;;;:::o;4794:139::-;4840:5;4878:6;4865:20;4856:29;;4894:33;4921:5;4894:33;:::i;:::-;4794:139;;;;:::o;4939:329::-;4998:6;5047:2;5035:9;5026:7;5022:23;5018:32;5015:119;;;5053:79;;:::i;:::-;5015:119;5173:1;5198:53;5243:7;5234:6;5223:9;5219:22;5198:53;:::i;:::-;5188:63;;5144:117;4939:329;;;;:::o;5274:474::-;5342:6;5350;5399:2;5387:9;5378:7;5374:23;5370:32;5367:119;;;5405:79;;:::i;:::-;5367:119;5525:1;5550:53;5595:7;5586:6;5575:9;5571:22;5550:53;:::i;:::-;5540:63;;5496:117;5652:2;5678:53;5723:7;5714:6;5703:9;5699:22;5678:53;:::i;:::-;5668:63;;5623:118;5274:474;;;;;:::o;5754:619::-;5831:6;5839;5847;5896:2;5884:9;5875:7;5871:23;5867:32;5864:119;;;5902:79;;:::i;:::-;5864:119;6022:1;6047:53;6092:7;6083:6;6072:9;6068:22;6047:53;:::i;:::-;6037:63;;5993:117;6149:2;6175:53;6220:7;6211:6;6200:9;6196:22;6175:53;:::i;:::-;6165:63;;6120:118;6277:2;6303:53;6348:7;6339:6;6328:9;6324:22;6303:53;:::i;:::-;6293:63;;6248:118;5754:619;;;;;:::o;6379:943::-;6474:6;6482;6490;6498;6547:3;6535:9;6526:7;6522:23;6518:33;6515:120;;;6554:79;;:::i;:::-;6515:120;6674:1;6699:53;6744:7;6735:6;6724:9;6720:22;6699:53;:::i;:::-;6689:63;;6645:117;6801:2;6827:53;6872:7;6863:6;6852:9;6848:22;6827:53;:::i;:::-;6817:63;;6772:118;6929:2;6955:53;7000:7;6991:6;6980:9;6976:22;6955:53;:::i;:::-;6945:63;;6900:118;7085:2;7074:9;7070:18;7057:32;7116:18;7108:6;7105:30;7102:117;;;7138:79;;:::i;:::-;7102:117;7243:62;7297:7;7288:6;7277:9;7273:22;7243:62;:::i;:::-;7233:72;;7028:287;6379:943;;;;;;;:::o;7328:468::-;7393:6;7401;7450:2;7438:9;7429:7;7425:23;7421:32;7418:119;;;7456:79;;:::i;:::-;7418:119;7576:1;7601:53;7646:7;7637:6;7626:9;7622:22;7601:53;:::i;:::-;7591:63;;7547:117;7703:2;7729:50;7771:7;7762:6;7751:9;7747:22;7729:50;:::i;:::-;7719:60;;7674:115;7328:468;;;;;:::o;7802:474::-;7870:6;7878;7927:2;7915:9;7906:7;7902:23;7898:32;7895:119;;;7933:79;;:::i;:::-;7895:119;8053:1;8078:53;8123:7;8114:6;8103:9;8099:22;8078:53;:::i;:::-;8068:63;;8024:117;8180:2;8206:53;8251:7;8242:6;8231:9;8227:22;8206:53;:::i;:::-;8196:63;;8151:118;7802:474;;;;;:::o;8282:559::-;8368:6;8376;8425:2;8413:9;8404:7;8400:23;8396:32;8393:119;;;8431:79;;:::i;:::-;8393:119;8579:1;8568:9;8564:17;8551:31;8609:18;8601:6;8598:30;8595:117;;;8631:79;;:::i;:::-;8595:117;8744:80;8816:7;8807:6;8796:9;8792:22;8744:80;:::i;:::-;8726:98;;;;8522:312;8282:559;;;;;:::o;8847:894::-;8965:6;8973;9022:2;9010:9;9001:7;8997:23;8993:32;8990:119;;;9028:79;;:::i;:::-;8990:119;9176:1;9165:9;9161:17;9148:31;9206:18;9198:6;9195:30;9192:117;;;9228:79;;:::i;:::-;9192:117;9333:78;9403:7;9394:6;9383:9;9379:22;9333:78;:::i;:::-;9323:88;;9119:302;9488:2;9477:9;9473:18;9460:32;9519:18;9511:6;9508:30;9505:117;;;9541:79;;:::i;:::-;9505:117;9646:78;9716:7;9707:6;9696:9;9692:22;9646:78;:::i;:::-;9636:88;;9431:303;8847:894;;;;;:::o;9747:323::-;9803:6;9852:2;9840:9;9831:7;9827:23;9823:32;9820:119;;;9858:79;;:::i;:::-;9820:119;9978:1;10003:50;10045:7;10036:6;10025:9;10021:22;10003:50;:::i;:::-;9993:60;;9949:114;9747:323;;;;:::o;10076:327::-;10134:6;10183:2;10171:9;10162:7;10158:23;10154:32;10151:119;;;10189:79;;:::i;:::-;10151:119;10309:1;10334:52;10378:7;10369:6;10358:9;10354:22;10334:52;:::i;:::-;10324:62;;10280:116;10076:327;;;;:::o;10409:349::-;10478:6;10527:2;10515:9;10506:7;10502:23;10498:32;10495:119;;;10533:79;;:::i;:::-;10495:119;10653:1;10678:63;10733:7;10724:6;10713:9;10709:22;10678:63;:::i;:::-;10668:73;;10624:127;10409:349;;;;:::o;10764:652::-;10841:6;10849;10898:2;10886:9;10877:7;10873:23;10869:32;10866:119;;;10904:79;;:::i;:::-;10866:119;11052:1;11041:9;11037:17;11024:31;11082:18;11074:6;11071:30;11068:117;;;11104:79;;:::i;:::-;11068:117;11209:62;11263:7;11254:6;11243:9;11239:22;11209:62;:::i;:::-;11199:72;;10995:286;11320:2;11346:53;11391:7;11382:6;11371:9;11367:22;11346:53;:::i;:::-;11336:63;;11291:118;10764:652;;;;;:::o;11422:529::-;11493:6;11501;11550:2;11538:9;11529:7;11525:23;11521:32;11518:119;;;11556:79;;:::i;:::-;11518:119;11704:1;11693:9;11689:17;11676:31;11734:18;11726:6;11723:30;11720:117;;;11756:79;;:::i;:::-;11720:117;11869:65;11926:7;11917:6;11906:9;11902:22;11869:65;:::i;:::-;11851:83;;;;11647:297;11422:529;;;;;:::o;11957:329::-;12016:6;12065:2;12053:9;12044:7;12040:23;12036:32;12033:119;;;12071:79;;:::i;:::-;12033:119;12191:1;12216:53;12261:7;12252:6;12241:9;12237:22;12216:53;:::i;:::-;12206:63;;12162:117;11957:329;;;;:::o;12292:118::-;12379:24;12397:5;12379:24;:::i;:::-;12374:3;12367:37;12292:118;;:::o;12416:157::-;12521:45;12541:24;12559:5;12541:24;:::i;:::-;12521:45;:::i;:::-;12516:3;12509:58;12416:157;;:::o;12579:109::-;12660:21;12675:5;12660:21;:::i;:::-;12655:3;12648:34;12579:109;;:::o;12694:118::-;12781:24;12799:5;12781:24;:::i;:::-;12776:3;12769:37;12694:118;;:::o;12818:157::-;12923:45;12943:24;12961:5;12943:24;:::i;:::-;12923:45;:::i;:::-;12918:3;12911:58;12818:157;;:::o;12981:360::-;13067:3;13095:38;13127:5;13095:38;:::i;:::-;13149:70;13212:6;13207:3;13149:70;:::i;:::-;13142:77;;13228:52;13273:6;13268:3;13261:4;13254:5;13250:16;13228:52;:::i;:::-;13305:29;13327:6;13305:29;:::i;:::-;13300:3;13296:39;13289:46;;13071:270;12981:360;;;;:::o;13347:364::-;13435:3;13463:39;13496:5;13463:39;:::i;:::-;13518:71;13582:6;13577:3;13518:71;:::i;:::-;13511:78;;13598:52;13643:6;13638:3;13631:4;13624:5;13620:16;13598:52;:::i;:::-;13675:29;13697:6;13675:29;:::i;:::-;13670:3;13666:39;13659:46;;13439:272;13347:364;;;;:::o;13717:377::-;13823:3;13851:39;13884:5;13851:39;:::i;:::-;13906:89;13988:6;13983:3;13906:89;:::i;:::-;13899:96;;14004:52;14049:6;14044:3;14037:4;14030:5;14026:16;14004:52;:::i;:::-;14081:6;14076:3;14072:16;14065:23;;13827:267;13717:377;;;;:::o;14124:845::-;14227:3;14264:5;14258:12;14293:36;14319:9;14293:36;:::i;:::-;14345:89;14427:6;14422:3;14345:89;:::i;:::-;14338:96;;14465:1;14454:9;14450:17;14481:1;14476:137;;;;14627:1;14622:341;;;;14443:520;;14476:137;14560:4;14556:9;14545;14541:25;14536:3;14529:38;14596:6;14591:3;14587:16;14580:23;;14476:137;;14622:341;14689:38;14721:5;14689:38;:::i;:::-;14749:1;14763:154;14777:6;14774:1;14771:13;14763:154;;;14851:7;14845:14;14841:1;14836:3;14832:11;14825:35;14901:1;14892:7;14888:15;14877:26;;14799:4;14796:1;14792:12;14787:17;;14763:154;;;14946:6;14941:3;14937:16;14930:23;;14629:334;;14443:520;;14231:738;;14124:845;;;;:::o;14975:366::-;15117:3;15138:67;15202:2;15197:3;15138:67;:::i;:::-;15131:74;;15214:93;15303:3;15214:93;:::i;:::-;15332:2;15327:3;15323:12;15316:19;;14975:366;;;:::o;15347:::-;15489:3;15510:67;15574:2;15569:3;15510:67;:::i;:::-;15503:74;;15586:93;15675:3;15586:93;:::i;:::-;15704:2;15699:3;15695:12;15688:19;;15347:366;;;:::o;15719:::-;15861:3;15882:67;15946:2;15941:3;15882:67;:::i;:::-;15875:74;;15958:93;16047:3;15958:93;:::i;:::-;16076:2;16071:3;16067:12;16060:19;;15719:366;;;:::o;16091:::-;16233:3;16254:67;16318:2;16313:3;16254:67;:::i;:::-;16247:74;;16330:93;16419:3;16330:93;:::i;:::-;16448:2;16443:3;16439:12;16432:19;;16091:366;;;:::o;16463:402::-;16623:3;16644:85;16726:2;16721:3;16644:85;:::i;:::-;16637:92;;16738:93;16827:3;16738:93;:::i;:::-;16856:2;16851:3;16847:12;16840:19;;16463:402;;;:::o;16871:366::-;17013:3;17034:67;17098:2;17093:3;17034:67;:::i;:::-;17027:74;;17110:93;17199:3;17110:93;:::i;:::-;17228:2;17223:3;17219:12;17212:19;;16871:366;;;:::o;17243:::-;17385:3;17406:67;17470:2;17465:3;17406:67;:::i;:::-;17399:74;;17482:93;17571:3;17482:93;:::i;:::-;17600:2;17595:3;17591:12;17584:19;;17243:366;;;:::o;17615:::-;17757:3;17778:67;17842:2;17837:3;17778:67;:::i;:::-;17771:74;;17854:93;17943:3;17854:93;:::i;:::-;17972:2;17967:3;17963:12;17956:19;;17615:366;;;:::o;17987:::-;18129:3;18150:67;18214:2;18209:3;18150:67;:::i;:::-;18143:74;;18226:93;18315:3;18226:93;:::i;:::-;18344:2;18339:3;18335:12;18328:19;;17987:366;;;:::o;18359:::-;18501:3;18522:67;18586:2;18581:3;18522:67;:::i;:::-;18515:74;;18598:93;18687:3;18598:93;:::i;:::-;18716:2;18711:3;18707:12;18700:19;;18359:366;;;:::o;18731:::-;18873:3;18894:67;18958:2;18953:3;18894:67;:::i;:::-;18887:74;;18970:93;19059:3;18970:93;:::i;:::-;19088:2;19083:3;19079:12;19072:19;;18731:366;;;:::o;19103:::-;19245:3;19266:67;19330:2;19325:3;19266:67;:::i;:::-;19259:74;;19342:93;19431:3;19342:93;:::i;:::-;19460:2;19455:3;19451:12;19444:19;;19103:366;;;:::o;19475:::-;19617:3;19638:67;19702:2;19697:3;19638:67;:::i;:::-;19631:74;;19714:93;19803:3;19714:93;:::i;:::-;19832:2;19827:3;19823:12;19816:19;;19475:366;;;:::o;19847:::-;19989:3;20010:67;20074:2;20069:3;20010:67;:::i;:::-;20003:74;;20086:93;20175:3;20086:93;:::i;:::-;20204:2;20199:3;20195:12;20188:19;;19847:366;;;:::o;20219:::-;20361:3;20382:67;20446:2;20441:3;20382:67;:::i;:::-;20375:74;;20458:93;20547:3;20458:93;:::i;:::-;20576:2;20571:3;20567:12;20560:19;;20219:366;;;:::o;20591:::-;20733:3;20754:67;20818:2;20813:3;20754:67;:::i;:::-;20747:74;;20830:93;20919:3;20830:93;:::i;:::-;20948:2;20943:3;20939:12;20932:19;;20591:366;;;:::o;20963:::-;21105:3;21126:67;21190:2;21185:3;21126:67;:::i;:::-;21119:74;;21202:93;21291:3;21202:93;:::i;:::-;21320:2;21315:3;21311:12;21304:19;;20963:366;;;:::o;21335:::-;21477:3;21498:67;21562:2;21557:3;21498:67;:::i;:::-;21491:74;;21574:93;21663:3;21574:93;:::i;:::-;21692:2;21687:3;21683:12;21676:19;;21335:366;;;:::o;21707:::-;21849:3;21870:67;21934:2;21929:3;21870:67;:::i;:::-;21863:74;;21946:93;22035:3;21946:93;:::i;:::-;22064:2;22059:3;22055:12;22048:19;;21707:366;;;:::o;22079:::-;22221:3;22242:67;22306:2;22301:3;22242:67;:::i;:::-;22235:74;;22318:93;22407:3;22318:93;:::i;:::-;22436:2;22431:3;22427:12;22420:19;;22079:366;;;:::o;22451:::-;22593:3;22614:67;22678:2;22673:3;22614:67;:::i;:::-;22607:74;;22690:93;22779:3;22690:93;:::i;:::-;22808:2;22803:3;22799:12;22792:19;;22451:366;;;:::o;22823:::-;22965:3;22986:67;23050:2;23045:3;22986:67;:::i;:::-;22979:74;;23062:93;23151:3;23062:93;:::i;:::-;23180:2;23175:3;23171:12;23164:19;;22823:366;;;:::o;23195:::-;23337:3;23358:67;23422:2;23417:3;23358:67;:::i;:::-;23351:74;;23434:93;23523:3;23434:93;:::i;:::-;23552:2;23547:3;23543:12;23536:19;;23195:366;;;:::o;23567:::-;23709:3;23730:67;23794:2;23789:3;23730:67;:::i;:::-;23723:74;;23806:93;23895:3;23806:93;:::i;:::-;23924:2;23919:3;23915:12;23908:19;;23567:366;;;:::o;23939:::-;24081:3;24102:67;24166:2;24161:3;24102:67;:::i;:::-;24095:74;;24178:93;24267:3;24178:93;:::i;:::-;24296:2;24291:3;24287:12;24280:19;;23939:366;;;:::o;24311:::-;24453:3;24474:67;24538:2;24533:3;24474:67;:::i;:::-;24467:74;;24550:93;24639:3;24550:93;:::i;:::-;24668:2;24663:3;24659:12;24652:19;;24311:366;;;:::o;24683:::-;24825:3;24846:67;24910:2;24905:3;24846:67;:::i;:::-;24839:74;;24922:93;25011:3;24922:93;:::i;:::-;25040:2;25035:3;25031:12;25024:19;;24683:366;;;:::o;25055:::-;25197:3;25218:67;25282:2;25277:3;25218:67;:::i;:::-;25211:74;;25294:93;25383:3;25294:93;:::i;:::-;25412:2;25407:3;25403:12;25396:19;;25055:366;;;:::o;25427:::-;25569:3;25590:67;25654:2;25649:3;25590:67;:::i;:::-;25583:74;;25666:93;25755:3;25666:93;:::i;:::-;25784:2;25779:3;25775:12;25768:19;;25427:366;;;:::o;25799:::-;25941:3;25962:67;26026:2;26021:3;25962:67;:::i;:::-;25955:74;;26038:93;26127:3;26038:93;:::i;:::-;26156:2;26151:3;26147:12;26140:19;;25799:366;;;:::o;26171:::-;26313:3;26334:67;26398:2;26393:3;26334:67;:::i;:::-;26327:74;;26410:93;26499:3;26410:93;:::i;:::-;26528:2;26523:3;26519:12;26512:19;;26171:366;;;:::o;26543:::-;26685:3;26706:67;26770:2;26765:3;26706:67;:::i;:::-;26699:74;;26782:93;26871:3;26782:93;:::i;:::-;26900:2;26895:3;26891:12;26884:19;;26543:366;;;:::o;26915:::-;27057:3;27078:67;27142:2;27137:3;27078:67;:::i;:::-;27071:74;;27154:93;27243:3;27154:93;:::i;:::-;27272:2;27267:3;27263:12;27256:19;;26915:366;;;:::o;27287:::-;27429:3;27450:67;27514:2;27509:3;27450:67;:::i;:::-;27443:74;;27526:93;27615:3;27526:93;:::i;:::-;27644:2;27639:3;27635:12;27628:19;;27287:366;;;:::o;27659:::-;27801:3;27822:67;27886:2;27881:3;27822:67;:::i;:::-;27815:74;;27898:93;27987:3;27898:93;:::i;:::-;28016:2;28011:3;28007:12;28000:19;;27659:366;;;:::o;28031:118::-;28118:24;28136:5;28118:24;:::i;:::-;28113:3;28106:37;28031:118;;:::o;28155:112::-;28238:22;28254:5;28238:22;:::i;:::-;28233:3;28226:35;28155:112;;:::o;28273:416::-;28433:3;28448:75;28519:3;28510:6;28448:75;:::i;:::-;28548:2;28543:3;28539:12;28532:19;;28568:95;28659:3;28650:6;28568:95;:::i;:::-;28561:102;;28680:3;28673:10;;28273:416;;;;;:::o;28695:429::-;28872:3;28894:92;28982:3;28973:6;28894:92;:::i;:::-;28887:99;;29003:95;29094:3;29085:6;29003:95;:::i;:::-;28996:102;;29115:3;29108:10;;28695:429;;;;;:::o;29130:522::-;29343:3;29365:148;29509:3;29365:148;:::i;:::-;29358:155;;29523:75;29594:3;29585:6;29523:75;:::i;:::-;29623:2;29618:3;29614:12;29607:19;;29643:3;29636:10;;29130:522;;;;:::o;29658:222::-;29751:4;29789:2;29778:9;29774:18;29766:26;;29802:71;29870:1;29859:9;29855:17;29846:6;29802:71;:::i;:::-;29658:222;;;;:::o;29886:640::-;30081:4;30119:3;30108:9;30104:19;30096:27;;30133:71;30201:1;30190:9;30186:17;30177:6;30133:71;:::i;:::-;30214:72;30282:2;30271:9;30267:18;30258:6;30214:72;:::i;:::-;30296;30364:2;30353:9;30349:18;30340:6;30296:72;:::i;:::-;30415:9;30409:4;30405:20;30400:2;30389:9;30385:18;30378:48;30443:76;30514:4;30505:6;30443:76;:::i;:::-;30435:84;;29886:640;;;;;;;:::o;30532:210::-;30619:4;30657:2;30646:9;30642:18;30634:26;;30670:65;30732:1;30721:9;30717:17;30708:6;30670:65;:::i;:::-;30532:210;;;;:::o;30748:545::-;30921:4;30959:3;30948:9;30944:19;30936:27;;30973:71;31041:1;31030:9;31026:17;31017:6;30973:71;:::i;:::-;31054:68;31118:2;31107:9;31103:18;31094:6;31054:68;:::i;:::-;31132:72;31200:2;31189:9;31185:18;31176:6;31132:72;:::i;:::-;31214;31282:2;31271:9;31267:18;31258:6;31214:72;:::i;:::-;30748:545;;;;;;;:::o;31299:313::-;31412:4;31450:2;31439:9;31435:18;31427:26;;31499:9;31493:4;31489:20;31485:1;31474:9;31470:17;31463:47;31527:78;31600:4;31591:6;31527:78;:::i;:::-;31519:86;;31299:313;;;;:::o;31618:419::-;31784:4;31822:2;31811:9;31807:18;31799:26;;31871:9;31865:4;31861:20;31857:1;31846:9;31842:17;31835:47;31899:131;32025:4;31899:131;:::i;:::-;31891:139;;31618:419;;;:::o;32043:::-;32209:4;32247:2;32236:9;32232:18;32224:26;;32296:9;32290:4;32286:20;32282:1;32271:9;32267:17;32260:47;32324:131;32450:4;32324:131;:::i;:::-;32316:139;;32043:419;;;:::o;32468:::-;32634:4;32672:2;32661:9;32657:18;32649:26;;32721:9;32715:4;32711:20;32707:1;32696:9;32692:17;32685:47;32749:131;32875:4;32749:131;:::i;:::-;32741:139;;32468:419;;;:::o;32893:::-;33059:4;33097:2;33086:9;33082:18;33074:26;;33146:9;33140:4;33136:20;33132:1;33121:9;33117:17;33110:47;33174:131;33300:4;33174:131;:::i;:::-;33166:139;;32893:419;;;:::o;33318:::-;33484:4;33522:2;33511:9;33507:18;33499:26;;33571:9;33565:4;33561:20;33557:1;33546:9;33542:17;33535:47;33599:131;33725:4;33599:131;:::i;:::-;33591:139;;33318:419;;;:::o;33743:::-;33909:4;33947:2;33936:9;33932:18;33924:26;;33996:9;33990:4;33986:20;33982:1;33971:9;33967:17;33960:47;34024:131;34150:4;34024:131;:::i;:::-;34016:139;;33743:419;;;:::o;34168:::-;34334:4;34372:2;34361:9;34357:18;34349:26;;34421:9;34415:4;34411:20;34407:1;34396:9;34392:17;34385:47;34449:131;34575:4;34449:131;:::i;:::-;34441:139;;34168:419;;;:::o;34593:::-;34759:4;34797:2;34786:9;34782:18;34774:26;;34846:9;34840:4;34836:20;34832:1;34821:9;34817:17;34810:47;34874:131;35000:4;34874:131;:::i;:::-;34866:139;;34593:419;;;:::o;35018:::-;35184:4;35222:2;35211:9;35207:18;35199:26;;35271:9;35265:4;35261:20;35257:1;35246:9;35242:17;35235:47;35299:131;35425:4;35299:131;:::i;:::-;35291:139;;35018:419;;;:::o;35443:::-;35609:4;35647:2;35636:9;35632:18;35624:26;;35696:9;35690:4;35686:20;35682:1;35671:9;35667:17;35660:47;35724:131;35850:4;35724:131;:::i;:::-;35716:139;;35443:419;;;:::o;35868:::-;36034:4;36072:2;36061:9;36057:18;36049:26;;36121:9;36115:4;36111:20;36107:1;36096:9;36092:17;36085:47;36149:131;36275:4;36149:131;:::i;:::-;36141:139;;35868:419;;;:::o;36293:::-;36459:4;36497:2;36486:9;36482:18;36474:26;;36546:9;36540:4;36536:20;36532:1;36521:9;36517:17;36510:47;36574:131;36700:4;36574:131;:::i;:::-;36566:139;;36293:419;;;:::o;36718:::-;36884:4;36922:2;36911:9;36907:18;36899:26;;36971:9;36965:4;36961:20;36957:1;36946:9;36942:17;36935:47;36999:131;37125:4;36999:131;:::i;:::-;36991:139;;36718:419;;;:::o;37143:::-;37309:4;37347:2;37336:9;37332:18;37324:26;;37396:9;37390:4;37386:20;37382:1;37371:9;37367:17;37360:47;37424:131;37550:4;37424:131;:::i;:::-;37416:139;;37143:419;;;:::o;37568:::-;37734:4;37772:2;37761:9;37757:18;37749:26;;37821:9;37815:4;37811:20;37807:1;37796:9;37792:17;37785:47;37849:131;37975:4;37849:131;:::i;:::-;37841:139;;37568:419;;;:::o;37993:::-;38159:4;38197:2;38186:9;38182:18;38174:26;;38246:9;38240:4;38236:20;38232:1;38221:9;38217:17;38210:47;38274:131;38400:4;38274:131;:::i;:::-;38266:139;;37993:419;;;:::o;38418:::-;38584:4;38622:2;38611:9;38607:18;38599:26;;38671:9;38665:4;38661:20;38657:1;38646:9;38642:17;38635:47;38699:131;38825:4;38699:131;:::i;:::-;38691:139;;38418:419;;;:::o;38843:::-;39009:4;39047:2;39036:9;39032:18;39024:26;;39096:9;39090:4;39086:20;39082:1;39071:9;39067:17;39060:47;39124:131;39250:4;39124:131;:::i;:::-;39116:139;;38843:419;;;:::o;39268:::-;39434:4;39472:2;39461:9;39457:18;39449:26;;39521:9;39515:4;39511:20;39507:1;39496:9;39492:17;39485:47;39549:131;39675:4;39549:131;:::i;:::-;39541:139;;39268:419;;;:::o;39693:::-;39859:4;39897:2;39886:9;39882:18;39874:26;;39946:9;39940:4;39936:20;39932:1;39921:9;39917:17;39910:47;39974:131;40100:4;39974:131;:::i;:::-;39966:139;;39693:419;;;:::o;40118:::-;40284:4;40322:2;40311:9;40307:18;40299:26;;40371:9;40365:4;40361:20;40357:1;40346:9;40342:17;40335:47;40399:131;40525:4;40399:131;:::i;:::-;40391:139;;40118:419;;;:::o;40543:::-;40709:4;40747:2;40736:9;40732:18;40724:26;;40796:9;40790:4;40786:20;40782:1;40771:9;40767:17;40760:47;40824:131;40950:4;40824:131;:::i;:::-;40816:139;;40543:419;;;:::o;40968:::-;41134:4;41172:2;41161:9;41157:18;41149:26;;41221:9;41215:4;41211:20;41207:1;41196:9;41192:17;41185:47;41249:131;41375:4;41249:131;:::i;:::-;41241:139;;40968:419;;;:::o;41393:::-;41559:4;41597:2;41586:9;41582:18;41574:26;;41646:9;41640:4;41636:20;41632:1;41621:9;41617:17;41610:47;41674:131;41800:4;41674:131;:::i;:::-;41666:139;;41393:419;;;:::o;41818:::-;41984:4;42022:2;42011:9;42007:18;41999:26;;42071:9;42065:4;42061:20;42057:1;42046:9;42042:17;42035:47;42099:131;42225:4;42099:131;:::i;:::-;42091:139;;41818:419;;;:::o;42243:::-;42409:4;42447:2;42436:9;42432:18;42424:26;;42496:9;42490:4;42486:20;42482:1;42471:9;42467:17;42460:47;42524:131;42650:4;42524:131;:::i;:::-;42516:139;;42243:419;;;:::o;42668:::-;42834:4;42872:2;42861:9;42857:18;42849:26;;42921:9;42915:4;42911:20;42907:1;42896:9;42892:17;42885:47;42949:131;43075:4;42949:131;:::i;:::-;42941:139;;42668:419;;;:::o;43093:::-;43259:4;43297:2;43286:9;43282:18;43274:26;;43346:9;43340:4;43336:20;43332:1;43321:9;43317:17;43310:47;43374:131;43500:4;43374:131;:::i;:::-;43366:139;;43093:419;;;:::o;43518:::-;43684:4;43722:2;43711:9;43707:18;43699:26;;43771:9;43765:4;43761:20;43757:1;43746:9;43742:17;43735:47;43799:131;43925:4;43799:131;:::i;:::-;43791:139;;43518:419;;;:::o;43943:::-;44109:4;44147:2;44136:9;44132:18;44124:26;;44196:9;44190:4;44186:20;44182:1;44171:9;44167:17;44160:47;44224:131;44350:4;44224:131;:::i;:::-;44216:139;;43943:419;;;:::o;44368:::-;44534:4;44572:2;44561:9;44557:18;44549:26;;44621:9;44615:4;44611:20;44607:1;44596:9;44592:17;44585:47;44649:131;44775:4;44649:131;:::i;:::-;44641:139;;44368:419;;;:::o;44793:::-;44959:4;44997:2;44986:9;44982:18;44974:26;;45046:9;45040:4;45036:20;45032:1;45021:9;45017:17;45010:47;45074:131;45200:4;45074:131;:::i;:::-;45066:139;;44793:419;;;:::o;45218:::-;45384:4;45422:2;45411:9;45407:18;45399:26;;45471:9;45465:4;45461:20;45457:1;45446:9;45442:17;45435:47;45499:131;45625:4;45499:131;:::i;:::-;45491:139;;45218:419;;;:::o;45643:::-;45809:4;45847:2;45836:9;45832:18;45824:26;;45896:9;45890:4;45886:20;45882:1;45871:9;45867:17;45860:47;45924:131;46050:4;45924:131;:::i;:::-;45916:139;;45643:419;;;:::o;46068:222::-;46161:4;46199:2;46188:9;46184:18;46176:26;;46212:71;46280:1;46269:9;46265:17;46256:6;46212:71;:::i;:::-;46068:222;;;;:::o;46296:129::-;46330:6;46357:20;;:::i;:::-;46347:30;;46386:33;46414:4;46406:6;46386:33;:::i;:::-;46296:129;;;:::o;46431:75::-;46464:6;46497:2;46491:9;46481:19;;46431:75;:::o;46512:311::-;46589:4;46679:18;46671:6;46668:30;46665:56;;;46701:18;;:::i;:::-;46665:56;46751:4;46743:6;46739:17;46731:25;;46811:4;46805;46801:15;46793:23;;46512:311;;;:::o;46829:::-;46906:4;46996:18;46988:6;46985:30;46982:56;;;47018:18;;:::i;:::-;46982:56;47068:4;47060:6;47056:17;47048:25;;47128:4;47122;47118:15;47110:23;;46829:311;;;:::o;47146:307::-;47207:4;47297:18;47289:6;47286:30;47283:56;;;47319:18;;:::i;:::-;47283:56;47357:29;47379:6;47357:29;:::i;:::-;47349:37;;47441:4;47435;47431:15;47423:23;;47146:307;;;:::o;47459:141::-;47508:4;47531:3;47523:11;;47554:3;47551:1;47544:14;47588:4;47585:1;47575:18;47567:26;;47459:141;;;:::o;47606:98::-;47657:6;47691:5;47685:12;47675:22;;47606:98;;;:::o;47710:99::-;47762:6;47796:5;47790:12;47780:22;;47710:99;;;:::o;47815:168::-;47898:11;47932:6;47927:3;47920:19;47972:4;47967:3;47963:14;47948:29;;47815:168;;;;:::o;47989:169::-;48073:11;48107:6;48102:3;48095:19;48147:4;48142:3;48138:14;48123:29;;47989:169;;;;:::o;48164:148::-;48266:11;48303:3;48288:18;;48164:148;;;;:::o;48318:305::-;48358:3;48377:20;48395:1;48377:20;:::i;:::-;48372:25;;48411:20;48429:1;48411:20;:::i;:::-;48406:25;;48565:1;48497:66;48493:74;48490:1;48487:81;48484:107;;;48571:18;;:::i;:::-;48484:107;48615:1;48612;48608:9;48601:16;;48318:305;;;;:::o;48629:185::-;48669:1;48686:20;48704:1;48686:20;:::i;:::-;48681:25;;48720:20;48738:1;48720:20;:::i;:::-;48715:25;;48759:1;48749:35;;48764:18;;:::i;:::-;48749:35;48806:1;48803;48799:9;48794:14;;48629:185;;;;:::o;48820:348::-;48860:7;48883:20;48901:1;48883:20;:::i;:::-;48878:25;;48917:20;48935:1;48917:20;:::i;:::-;48912:25;;49105:1;49037:66;49033:74;49030:1;49027:81;49022:1;49015:9;49008:17;49004:105;49001:131;;;49112:18;;:::i;:::-;49001:131;49160:1;49157;49153:9;49142:20;;48820:348;;;;:::o;49174:191::-;49214:4;49234:20;49252:1;49234:20;:::i;:::-;49229:25;;49268:20;49286:1;49268:20;:::i;:::-;49263:25;;49307:1;49304;49301:8;49298:34;;;49312:18;;:::i;:::-;49298:34;49357:1;49354;49350:9;49342:17;;49174:191;;;;:::o;49371:96::-;49408:7;49437:24;49455:5;49437:24;:::i;:::-;49426:35;;49371:96;;;:::o;49473:90::-;49507:7;49550:5;49543:13;49536:21;49525:32;;49473:90;;;:::o;49569:77::-;49606:7;49635:5;49624:16;;49569:77;;;:::o;49652:149::-;49688:7;49728:66;49721:5;49717:78;49706:89;;49652:149;;;:::o;49807:126::-;49844:7;49884:42;49877:5;49873:54;49862:65;;49807:126;;;:::o;49939:77::-;49976:7;50005:5;49994:16;;49939:77;;;:::o;50022:86::-;50057:7;50097:4;50090:5;50086:16;50075:27;;50022:86;;;:::o;50114:154::-;50198:6;50193:3;50188;50175:30;50260:1;50251:6;50246:3;50242:16;50235:27;50114:154;;;:::o;50274:307::-;50342:1;50352:113;50366:6;50363:1;50360:13;50352:113;;;50451:1;50446:3;50442:11;50436:18;50432:1;50427:3;50423:11;50416:39;50388:2;50385:1;50381:10;50376:15;;50352:113;;;50483:6;50480:1;50477:13;50474:101;;;50563:1;50554:6;50549:3;50545:16;50538:27;50474:101;50323:258;50274:307;;;:::o;50587:320::-;50631:6;50668:1;50662:4;50658:12;50648:22;;50715:1;50709:4;50705:12;50736:18;50726:81;;50792:4;50784:6;50780:17;50770:27;;50726:81;50854:2;50846:6;50843:14;50823:18;50820:38;50817:84;;;50873:18;;:::i;:::-;50817:84;50638:269;50587:320;;;:::o;50913:281::-;50996:27;51018:4;50996:27;:::i;:::-;50988:6;50984:40;51126:6;51114:10;51111:22;51090:18;51078:10;51075:34;51072:62;51069:88;;;51137:18;;:::i;:::-;51069:88;51177:10;51173:2;51166:22;50956:238;50913:281;;:::o;51200:233::-;51239:3;51262:24;51280:5;51262:24;:::i;:::-;51253:33;;51308:66;51301:5;51298:77;51295:103;;;51378:18;;:::i;:::-;51295:103;51425:1;51418:5;51414:13;51407:20;;51200:233;;;:::o;51439:100::-;51478:7;51507:26;51527:5;51507:26;:::i;:::-;51496:37;;51439:100;;;:::o;51545:79::-;51584:7;51613:5;51602:16;;51545:79;;;:::o;51630:94::-;51669:7;51698:20;51712:5;51698:20;:::i;:::-;51687:31;;51630:94;;;:::o;51730:176::-;51762:1;51779:20;51797:1;51779:20;:::i;:::-;51774:25;;51813:20;51831:1;51813:20;:::i;:::-;51808:25;;51852:1;51842:35;;51857:18;;:::i;:::-;51842:35;51898:1;51895;51891:9;51886:14;;51730:176;;;;:::o;51912:180::-;51960:77;51957:1;51950:88;52057:4;52054:1;52047:15;52081:4;52078:1;52071:15;52098:180;52146:77;52143:1;52136:88;52243:4;52240:1;52233:15;52267:4;52264:1;52257:15;52284:180;52332:77;52329:1;52322:88;52429:4;52426:1;52419:15;52453:4;52450:1;52443:15;52470:180;52518:77;52515:1;52508:88;52615:4;52612:1;52605:15;52639:4;52636:1;52629:15;52656:180;52704:77;52701:1;52694:88;52801:4;52798:1;52791:15;52825:4;52822:1;52815:15;52842:180;52890:77;52887:1;52880:88;52987:4;52984:1;52977:15;53011:4;53008:1;53001:15;53028:180;53076:77;53073:1;53066:88;53173:4;53170:1;53163:15;53197:4;53194:1;53187:15;53214:117;53323:1;53320;53313:12;53337:117;53446:1;53443;53436:12;53460:117;53569:1;53566;53559:12;53583:117;53692:1;53689;53682:12;53706:117;53815:1;53812;53805:12;53829:117;53938:1;53935;53928:12;53952:102;53993:6;54044:2;54040:7;54035:2;54028:5;54024:14;54020:28;54010:38;;53952:102;;;:::o;54060:94::-;54093:8;54141:5;54137:2;54133:14;54112:35;;54060:94;;;:::o;54160:174::-;54300:26;54296:1;54288:6;54284:14;54277:50;54160:174;:::o;54340:164::-;54480:16;54476:1;54468:6;54464:14;54457:40;54340:164;:::o;54510:172::-;54650:24;54646:1;54638:6;54634:14;54627:48;54510:172;:::o;54688:181::-;54828:33;54824:1;54816:6;54812:14;54805:57;54688:181;:::o;54875:214::-;55015:66;55011:1;55003:6;54999:14;54992:90;54875:214;:::o;55095:230::-;55235:34;55231:1;55223:6;55219:14;55212:58;55304:13;55299:2;55291:6;55287:15;55280:38;55095:230;:::o;55331:237::-;55471:34;55467:1;55459:6;55455:14;55448:58;55540:20;55535:2;55527:6;55523:15;55516:45;55331:237;:::o;55574:225::-;55714:34;55710:1;55702:6;55698:14;55691:58;55783:8;55778:2;55770:6;55766:15;55759:33;55574:225;:::o;55805:178::-;55945:30;55941:1;55933:6;55929:14;55922:54;55805:178;:::o;55989:223::-;56129:34;56125:1;56117:6;56113:14;56106:58;56198:6;56193:2;56185:6;56181:15;56174:31;55989:223;:::o;56218:175::-;56358:27;56354:1;56346:6;56342:14;56335:51;56218:175;:::o;56399:223::-;56539:34;56535:1;56527:6;56523:14;56516:58;56608:6;56603:2;56595:6;56591:15;56584:31;56399:223;:::o;56628:221::-;56768:34;56764:1;56756:6;56752:14;56745:58;56837:4;56832:2;56824:6;56820:15;56813:29;56628:221;:::o;56855:161::-;56995:13;56991:1;56983:6;56979:14;56972:37;56855:161;:::o;57022:231::-;57162:34;57158:1;57150:6;57146:14;57139:58;57231:14;57226:2;57218:6;57214:15;57207:39;57022:231;:::o;57259:173::-;57399:25;57395:1;57387:6;57383:14;57376:49;57259:173;:::o;57438:243::-;57578:34;57574:1;57566:6;57562:14;57555:58;57647:26;57642:2;57634:6;57630:15;57623:51;57438:243;:::o;57687:229::-;57827:34;57823:1;57815:6;57811:14;57804:58;57896:12;57891:2;57883:6;57879:15;57872:37;57687:229;:::o;57922:228::-;58062:34;58058:1;58050:6;58046:14;58039:58;58131:11;58126:2;58118:6;58114:15;58107:36;57922:228;:::o;58156:221::-;58296:34;58292:1;58284:6;58280:14;58273:58;58365:4;58360:2;58352:6;58348:15;58341:29;58156:221;:::o;58383:182::-;58523:34;58519:1;58511:6;58507:14;58500:58;58383:182;:::o;58571:231::-;58711:34;58707:1;58699:6;58695:14;58688:58;58780:14;58775:2;58767:6;58763:15;58756:39;58571:231;:::o;58808:165::-;58948:17;58944:1;58936:6;58932:14;58925:41;58808:165;:::o;58979:182::-;59119:34;59115:1;59107:6;59103:14;59096:58;58979:182;:::o;59167:228::-;59307:34;59303:1;59295:6;59291:14;59284:58;59376:11;59371:2;59363:6;59359:15;59352:36;59167:228;:::o;59401:223::-;59541:34;59537:1;59529:6;59525:14;59518:58;59610:6;59605:2;59597:6;59593:15;59586:31;59401:223;:::o;59630:181::-;59770:33;59766:1;59758:6;59754:14;59747:57;59630:181;:::o;59817:220::-;59957:34;59953:1;59945:6;59941:14;59934:58;60026:3;60021:2;60013:6;60009:15;60002:28;59817:220;:::o;60043:160::-;60183:12;60179:1;60171:6;60167:14;60160:36;60043:160;:::o;60209:236::-;60349:34;60345:1;60337:6;60333:14;60326:58;60418:19;60413:2;60405:6;60401:15;60394:44;60209:236;:::o;60451:231::-;60591:34;60587:1;60579:6;60575:14;60568:58;60660:14;60655:2;60647:6;60643:15;60636:39;60451:231;:::o;60688:164::-;60828:16;60824:1;60816:6;60812:14;60805:40;60688:164;:::o;60858:::-;60998:16;60994:1;60986:6;60982:14;60975:40;60858:164;:::o;61028:162::-;61168:14;61164:1;61156:6;61152:14;61145:38;61028:162;:::o;61196:166::-;61336:18;61332:1;61324:6;61320:14;61313:42;61196:166;:::o;61368:122::-;61441:24;61459:5;61441:24;:::i;:::-;61434:5;61431:35;61421:63;;61480:1;61477;61470:12;61421:63;61368:122;:::o;61496:116::-;61566:21;61581:5;61566:21;:::i;:::-;61559:5;61556:32;61546:60;;61602:1;61599;61592:12;61546:60;61496:116;:::o;61618:120::-;61690:23;61707:5;61690:23;:::i;:::-;61683:5;61680:34;61670:62;;61728:1;61725;61718:12;61670:62;61618:120;:::o;61744:122::-;61817:24;61835:5;61817:24;:::i;:::-;61810:5;61807:35;61797:63;;61856:1;61853;61846:12;61797:63;61744:122;:::o

Swarm Source

ipfs://97866e0ad08de2776fe5445d2f151f5e80d9d4a48c4262b0a62ba30d947a1302
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.