ETH Price: $3,377.37 (-1.94%)
Gas: 2 Gwei

Token

Crypto Hippos NFT (HIPPO)
 

Overview

Max Total Supply

10,000 HIPPO

Holders

2,411

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 HIPPO
0x820dfdc28a5d4dd681752190a6450c3f795a8116
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

CryptoHippos live in the Watering Hole, a decentralized business venture wrapped into an NFT collection. Each CryptoHippo has governance in this ecosystem.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoHippos

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-22
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.3;

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

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

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

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

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

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

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

    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

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

    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

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

    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    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
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

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

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 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,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

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,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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

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

contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 0;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) private _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    /**
     * @dev
     * `maxBatchSize` refers to how much a minter can mint at a time.
     * `collectionSize_` refers to how many tokens are in the collection.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) {
        require(
            collectionSize_ > 0,
            "ERC721A: collection must have a nonzero supply"
        );
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return currentIndex;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < totalSupply(), "ERC721A: global index out of bounds");
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("ERC721A: unable to get token of owner by index");
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

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

    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        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, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, "ERC721A: approval to current owner");

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        require(operator != _msgSender(), "ERC721A: 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,
        uint256 tokenId
    ) public override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - there must be `quantity` tokens remaining unminted in the total collection.
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "ERC721A: mint to the zero address");
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), "ERC721A: token already minted");
        require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                "ERC721A: transfer to non ERC721Receiver implementer"
            );
            updatedIndex++;
        }

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

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

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );

        require(
            prevOwnership.addr == from,
            "ERC721A: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                    prevOwnership.addr,
                    prevOwnership.startTimestamp
                );
            }
        }

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

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > collectionSize - 1) {
            endIndex = collectionSize - 1;
        }
        // We know if the last one in the group exists, all in the group exist, due to serial ordering.
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(
                    ownership.addr,
                    ownership.startTimestamp
                );
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

    /**
     * @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 uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 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(
                        "ERC721A: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

contract CryptoHippos is ERC721A, Ownable {
    using Strings for uint256;
    using MerkleProof for bytes32;

    string public baseURI;
    uint256 public cost = 0.08 ether;
    uint256 public maxSupply = 10000;
    uint256 public maxMintAmount = 5;
    uint256 public nftPerAddressLimit = 5;
    uint256 public nftReserve = 175;
    uint256 public reservedCount = 0;
    bool public paused = false;
    bool public onlyWhitelisted = true;
    mapping(address => uint256) public addressMintedBalance;
    bytes32 public rootHash =
        0xd227ba3c0d84000375a7b712e9dedf829760728f7ac90f8056723cd6bb757257;
    address private Address1 = 0x64f38f0827866a9532032CF590D10931f1357e57;
    address private Address2 = 0x2Be08be360bd2ef8A7231F44997432D15F80c9b1;
    address private Address3 = 0xee8917D6Af70d4C5287162ec5014c79a68E554c3;
    address private Address4 = 0xC85bA6c679dA5d0f89E793Aa10938F6dE98e6Ef2;
    address private Address5 = 0xBbB589796d01EF05f24C49f57d53125d4382ab62;

    constructor() ERC721A("Crypto Hippos NFT", "HIPPO", maxMintAmount, maxSupply) {
        setBaseURI(
            "https://gateway.pinata.cloud/ipfs/QmbM5YQu4YGLsdXbV4eptzePaRxdTnCJPNjQUYQNEmQy2V/"
        );
    }

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

    // public
    function mint(uint256 _mintAmount) public payable {
        require(!paused, "the contract is paused");
        require(_mintAmount > 0, "need to mint at least 1 NFT");
        require(
            _mintAmount <= maxMintAmount,
            "You can only mint 5 per transaction"
        );
        require(totalSupply() + _mintAmount <= maxSupply, "All CryptoHippos have been minted");

        require(!onlyWhitelisted, "Not public sale");

        require(msg.value >= cost * _mintAmount, "insufficient funds");

        _safeMint(msg.sender, _mintAmount);
        addressMintedBalance[msg.sender] =
            addressMintedBalance[msg.sender] +
            _mintAmount;
    }

    function whiteListedMint(
        bytes32[] calldata _merkleProof,
        uint256 _mintAmount
    ) public payable {
        require(!paused);
        require(totalSupply() + _mintAmount <= maxSupply, "All CryptoHippos have been minted");
        require(
            MerkleProof.verify(_merkleProof, rootHash, keccak256(abi.encodePacked(msg.sender))),
            "You are not whitelisted."
        );
        require(_mintAmount > 0, "need to mint at least 1 NFT");
        require(onlyWhitelisted);
        require(
            addressMintedBalance[msg.sender] + _mintAmount <= nftPerAddressLimit,
            "You can only mint up to 5 CryptoHippos during whitelist sale, wait for public sale to do more than 5."
        );
        require(msg.value >= cost * _mintAmount);
        _safeMint(msg.sender, _mintAmount);
        addressMintedBalance[msg.sender] =
            addressMintedBalance[msg.sender] +
            _mintAmount;
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

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

    //only owner

    function mintForAddress(uint256 _mintAmount, address _receiver)
        external
        onlyOwner
    {
        require(_mintAmount > 0, "Must mint more than 0");
        require(_mintAmount <= maxMintAmount, "Max 5 NFTs per tx");
        require(reservedCount + _mintAmount < nftReserve, "Marketing reserve exhausted.");
        require(totalSupply() + _mintAmount <= maxSupply);
        _safeMint(_receiver, _mintAmount);
        reservedCount += _mintAmount;
    }

    function setRootHash(bytes32 _rootHash) public onlyOwner {
        rootHash = _rootHash;
    }

    function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
        nftPerAddressLimit = _limit;
    }

    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

    function setOnlyWhitelisted(bool _state) public onlyOwner {
        onlyWhitelisted = _state;
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        uint256 balance4 = (balance * 3800) / 10000;
        uint256 balance3 = (balance * 500) / 10000;
        uint256 balance2 = (balance * 450) / 10000;
        uint256 balance1 = (balance * 300) / 10000;

        payable(Address1).transfer(balance1);

        payable(Address2).transfer(balance2);

        payable(Address3).transfer(balance3);

        payable(Address4).transfer(balance4);
        uint256 balance5 = balance - (balance1 + balance2 + balance3 + balance4);
        payable(Address5).transfer(balance5);
    }
}

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":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_rootHash","type":"bytes32"}],"name":"setRootHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"whiteListedMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405260008055600060075567011c37937e080000600a55612710600b556005600c556005600d5560af600e556000600f556000601060006101000a81548160ff0219169083151502179055506001601060016101000a81548160ff0219169083151502179055507fd227ba3c0d84000375a7b712e9dedf829760728f7ac90f8056723cd6bb75725760001b6012557364f38f0827866a9532032cf590d10931f1357e57601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550732be08be360bd2ef8a7231f44997432d15f80c9b1601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ee8917d6af70d4c5287162ec5014c79a68e554c3601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c85ba6c679da5d0f89e793aa10938f6de98e6ef2601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073bbb589796d01ef05f24c49f57d53125d4382ab62601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200024657600080fd5b506040518060400160405280601181526020017f43727970746f20486970706f73204e46540000000000000000000000000000008152506040518060400160405280600581526020017f484950504f000000000000000000000000000000000000000000000000000000815250600c54600b5460008111620002ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f690620006e7565b60405180910390fd5b6000821162000345576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200033c90620006a3565b60405180910390fd5b83600190805190602001906200035d9291906200057e565b508260029080519060200190620003769291906200057e565b508160a08181525050806080818152505050505050620003ab6200039f620003db60201b60201c565b620003e360201b60201c565b620003d5604051806080016040528060518152602001620060b060519139620004a960201b60201c565b62000846565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004b9620003db60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004df6200055460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000538576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200052f90620006c5565b60405180910390fd5b8060099080519060200190620005509291906200057e565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200058c906200071a565b90600052602060002090601f016020900481019282620005b05760008555620005fc565b82601f10620005cb57805160ff1916838001178555620005fc565b82800160010185558215620005fc579182015b82811115620005fb578251825591602001919060010190620005de565b5b5090506200060b91906200060f565b5090565b5b808211156200062a57600081600090555060010162000610565b5090565b60006200063d60278362000709565b91506200064a826200077f565b604082019050919050565b60006200066460208362000709565b91506200067182620007ce565b602082019050919050565b60006200068b602e8362000709565b91506200069882620007f7565b604082019050919050565b60006020820190508181036000830152620006be816200062e565b9050919050565b60006020820190508181036000830152620006e08162000655565b9050919050565b6000602082019050818103600083015262000702816200067c565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200073357607f821691505b602082108114156200074a576200074962000750565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a0516158396200087760003960008181612cad01528181612cd601526133fa0152600050506158396000f3fe6080604052600436106102515760003560e01c80636352211e11610139578063a56dba81116100b6578063d0eb26b01161007a578063d0eb26b0146108aa578063d5abeb01146108d3578063d7224ba0146108fe578063e985e9c514610929578063efbd73f414610966578063f2fde38b1461098f57610251565b8063a56dba81146107d2578063b88d4fde146107ee578063ba7d2c7614610817578063c38f761714610842578063c87b56dd1461086d57610251565b80638da5cb5b116100fd5780638da5cb5b1461070c57806395d89b41146107375780639c70b51214610762578063a0712d681461078d578063a22cb465146107a957610251565b80636352211e146106275780636c0360eb1461066457806370a082311461068f578063715018a6146106cc5780637f00c7a6146106e357610251565b806323b872dd116101d257806342842e0e1161019657806342842e0e14610505578063438b63001461052e578063475489d31461056b5780634f6ccce71461059657806355f804b3146105d35780635c975abb146105fc57610251565b806323b872dd146104365780632d7eae661461045f5780632f745c59146104885780633c952764146104c55780633ccfd60b146104ee57610251565b806313faede61161021957806313faede61461034d57806318160ddd1461037857806318cae269146103a35780631d80009a146103e0578063239c70ae1461040b57610251565b806301ffc9a71461025657806302329a291461029357806306fdde03146102bc578063081812fc146102e7578063095ea7b314610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613dca565b6109b8565b60405161028a9190614585565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190613d78565b610b02565b005b3480156102c857600080fd5b506102d1610b9b565b6040516102de91906145bb565b60405180910390f35b3480156102f357600080fd5b5061030e60048036038101906103099190613e5d565b610c2d565b60405161031b91906144fc565b60405180910390f35b34801561033057600080fd5b5061034b60048036038101906103469190613ce4565b610cb2565b005b34801561035957600080fd5b50610362610dcb565b60405161036f91906149bd565b60405180910390f35b34801561038457600080fd5b5061038d610dd1565b60405161039a91906149bd565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190613b79565b610dda565b6040516103d791906149bd565b60405180910390f35b3480156103ec57600080fd5b506103f5610df2565b60405161040291906145a0565b60405180910390f35b34801561041757600080fd5b50610420610df8565b60405161042d91906149bd565b60405180910390f35b34801561044257600080fd5b5061045d60048036038101906104589190613bde565b610dfe565b005b34801561046b57600080fd5b5061048660048036038101906104819190613da1565b610e0e565b005b34801561049457600080fd5b506104af60048036038101906104aa9190613ce4565b610e94565b6040516104bc91906149bd565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190613d78565b611092565b005b3480156104fa57600080fd5b5061050361112b565b005b34801561051157600080fd5b5061052c60048036038101906105279190613bde565b61146e565b005b34801561053a57600080fd5b5061055560048036038101906105509190613b79565b61148e565b6040516105629190614563565b60405180910390f35b34801561057757600080fd5b50610580611588565b60405161058d91906149bd565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b89190613e5d565b61158e565b6040516105ca91906149bd565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190613e1c565b6115e1565b005b34801561060857600080fd5b50610611611677565b60405161061e9190614585565b60405180910390f35b34801561063357600080fd5b5061064e60048036038101906106499190613e5d565b61168a565b60405161065b91906144fc565b60405180910390f35b34801561067057600080fd5b506106796116a0565b60405161068691906145bb565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b19190613b79565b61172e565b6040516106c391906149bd565b60405180910390f35b3480156106d857600080fd5b506106e1611817565b005b3480156106ef57600080fd5b5061070a60048036038101906107059190613e5d565b61189f565b005b34801561071857600080fd5b50610721611925565b60405161072e91906144fc565b60405180910390f35b34801561074357600080fd5b5061074c61194f565b60405161075991906145bb565b60405180910390f35b34801561076e57600080fd5b506107776119e1565b6040516107849190614585565b60405180910390f35b6107a760048036038101906107a29190613e5d565b6119f4565b005b3480156107b557600080fd5b506107d060048036038101906107cb9190613ca8565b611c5e565b005b6107ec60048036038101906107e79190613d20565b611ddf565b005b3480156107fa57600080fd5b5061081560048036038101906108109190613c2d565b6120a5565b005b34801561082357600080fd5b5061082c612101565b60405161083991906149bd565b60405180910390f35b34801561084e57600080fd5b50610857612107565b60405161086491906149bd565b60405180910390f35b34801561087957600080fd5b50610894600480360381019061088f9190613e5d565b61210d565b6040516108a191906145bb565b60405180910390f35b3480156108b657600080fd5b506108d160048036038101906108cc9190613e5d565b6121b4565b005b3480156108df57600080fd5b506108e861223a565b6040516108f591906149bd565b60405180910390f35b34801561090a57600080fd5b50610913612240565b60405161092091906149bd565b60405180910390f35b34801561093557600080fd5b50610950600480360381019061094b9190613ba2565b612246565b60405161095d9190614585565b60405180910390f35b34801561097257600080fd5b5061098d60048036038101906109889190613e86565b6122da565b005b34801561099b57600080fd5b506109b660048036038101906109b19190613b79565b612477565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aeb57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610afb5750610afa8261256f565b5b9050919050565b610b0a6125d9565b73ffffffffffffffffffffffffffffffffffffffff16610b28611925565b73ffffffffffffffffffffffffffffffffffffffff1614610b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b75906146dd565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b606060018054610baa90614d70565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd690614d70565b8015610c235780601f10610bf857610100808354040283529160200191610c23565b820191906000526020600020905b815481529060010190602001808311610c0657829003601f168201915b5050505050905090565b6000610c38826125e1565b610c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e9061493d565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cbd8261168a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d259061481d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d4d6125d9565b73ffffffffffffffffffffffffffffffffffffffff161480610d7c5750610d7b81610d766125d9565b612246565b5b610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db29061467d565b60405180910390fd5b610dc68383836125ee565b505050565b600a5481565b60008054905090565b60116020528060005260406000206000915090505481565b60125481565b600c5481565b610e098383836126a0565b505050565b610e166125d9565b73ffffffffffffffffffffffffffffffffffffffff16610e34611925565b73ffffffffffffffffffffffffffffffffffffffff1614610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e81906146dd565b60405180910390fd5b8060128190555050565b6000610e9f8361172e565b8210610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed7906145dd565b60405180910390fd5b6000610eea610dd1565b905060008060005b83811015611050576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610fe457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561103c578684141561102d57819550505050505061108c565b838061103890614dd3565b9450505b50808061104890614dd3565b915050610ef2565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611083906148dd565b60405180910390fd5b92915050565b61109a6125d9565b73ffffffffffffffffffffffffffffffffffffffff166110b8611925565b73ffffffffffffffffffffffffffffffffffffffff161461110e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611105906146dd565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b6111336125d9565b73ffffffffffffffffffffffffffffffffffffffff16611151611925565b73ffffffffffffffffffffffffffffffffffffffff16146111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e906146dd565b60405180910390fd5b60004790506000612710610ed8836111bf9190614ba8565b6111c99190614b77565b905060006127106101f4846111de9190614ba8565b6111e89190614b77565b905060006127106101c2856111fd9190614ba8565b6112079190614b77565b9050600061271061012c8661121c9190614ba8565b6112269190614b77565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611290573d6000803e3d6000fd5b50601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156112f9573d6000803e3d6000fd5b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611362573d6000803e3d6000fd5b50601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f193505050501580156113cb573d6000803e3d6000fd5b506000848484846113dc9190614b21565b6113e69190614b21565b6113f09190614b21565b866113fb9190614c36565b9050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611465573d6000803e3d6000fd5b50505050505050565b611489838383604051806020016040528060008152506120a5565b505050565b6060600061149b8361172e565b905060008167ffffffffffffffff8111156114df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561150d5781602001602082028036833780820191505090505b50905060005b8281101561157d576115258582610e94565b82828151811061155e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061157590614dd3565b915050611513565b508092505050919050565b600e5481565b6000611598610dd1565b82106115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d09061463d565b60405180910390fd5b819050919050565b6115e96125d9565b73ffffffffffffffffffffffffffffffffffffffff16611607611925565b73ffffffffffffffffffffffffffffffffffffffff161461165d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611654906146dd565b60405180910390fd5b8060099080519060200190611673929190613904565b5050565b601060009054906101000a900460ff1681565b600061169582612c59565b600001519050919050565b600980546116ad90614d70565b80601f01602080910402602001604051908101604052809291908181526020018280546116d990614d70565b80156117265780601f106116fb57610100808354040283529160200191611726565b820191906000526020600020905b81548152906001019060200180831161170957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561179f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117969061469d565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61181f6125d9565b73ffffffffffffffffffffffffffffffffffffffff1661183d611925565b73ffffffffffffffffffffffffffffffffffffffff1614611893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188a906146dd565b60405180910390fd5b61189d6000612e5c565b565b6118a76125d9565b73ffffffffffffffffffffffffffffffffffffffff166118c5611925565b73ffffffffffffffffffffffffffffffffffffffff161461191b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611912906146dd565b60405180910390fd5b80600c8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461195e90614d70565b80601f016020809104026020016040519081016040528092919081815260200182805461198a90614d70565b80156119d75780601f106119ac576101008083540402835291602001916119d7565b820191906000526020600020905b8154815290600101906020018083116119ba57829003601f168201915b5050505050905090565b601060019054906101000a900460ff1681565b601060009054906101000a900460ff1615611a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3b906146fd565b60405180910390fd5b60008111611a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7e9061495d565b60405180910390fd5b600c54811115611acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac39061491d565b60405180910390fd5b600b5481611ad8610dd1565b611ae29190614b21565b1115611b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1a9061477d565b60405180910390fd5b601060019054906101000a900460ff1615611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a9061483d565b60405180910390fd5b80600a54611b819190614ba8565b341015611bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bba9061485d565b60405180910390fd5b611bcd3382612f22565b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c189190614b21565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b611c666125d9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb9061473d565b60405180910390fd5b8060066000611ce16125d9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d8e6125d9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dd39190614585565b60405180910390a35050565b601060009054906101000a900460ff1615611df957600080fd5b600b5481611e05610dd1565b611e0f9190614b21565b1115611e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e479061477d565b60405180910390fd5b611ec4838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060125433604051602001611ea99190614491565b60405160208183030381529060405280519060200120612f40565b611f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efa906147fd565b60405180910390fd5b60008111611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d9061495d565b60405180910390fd5b601060019054906101000a900460ff16611f5f57600080fd5b600d5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fad9190614b21565b1115611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe5906147bd565b60405180910390fd5b80600a54611ffc9190614ba8565b34101561200857600080fd5b6120123382612f22565b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461205d9190614b21565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b6120b08484846126a0565b6120bc84848484612f57565b6120fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f29061487d565b60405180910390fd5b50505050565b600d5481565b600f5481565b6060612118826125e1565b612157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214e9061471d565b60405180910390fd5b60006121616130ee565b9050600081511161218157604051806020016040528060008152506121ac565b8061218b84613180565b60405160200161219c9291906144d8565b6040516020818303038152906040525b915050919050565b6121bc6125d9565b73ffffffffffffffffffffffffffffffffffffffff166121da611925565b73ffffffffffffffffffffffffffffffffffffffff1614612230576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612227906146dd565b60405180910390fd5b80600d8190555050565b600b5481565b60075481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122e26125d9565b73ffffffffffffffffffffffffffffffffffffffff16612300611925565b73ffffffffffffffffffffffffffffffffffffffff1614612356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234d906146dd565b60405180910390fd5b60008211612399576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123909061499d565b60405180910390fd5b600c548211156123de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d59061479d565b60405180910390fd5b600e5482600f546123ef9190614b21565b1061242f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612426906147dd565b60405180910390fd5b600b548261243b610dd1565b6124459190614b21565b111561245057600080fd5b61245a8183612f22565b81600f600082825461246c9190614b21565b925050819055505050565b61247f6125d9565b73ffffffffffffffffffffffffffffffffffffffff1661249d611925565b73ffffffffffffffffffffffffffffffffffffffff16146124f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ea906146dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255a906145fd565b60405180910390fd5b61256c81612e5c565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006126ab82612c59565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166126d26125d9565b73ffffffffffffffffffffffffffffffffffffffff16148061272e57506126f76125d9565b73ffffffffffffffffffffffffffffffffffffffff1661271684610c2d565b73ffffffffffffffffffffffffffffffffffffffff16145b8061274a575061274982600001516127446125d9565b612246565b5b90508061278c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127839061475d565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f5906146bd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561286e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128659061465d565b60405180910390fd5b61287b858585600161332d565b61288b60008484600001516125ee565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166128f99190614c02565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661299d9190614adb565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612aa39190614b21565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612be957612b19816125e1565b15612be8576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c518686866001613333565b505050505050565b612c6161398a565b612c6a826125e1565b612ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca09061461d565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612d0d5760017f000000000000000000000000000000000000000000000000000000000000000084612d009190614c36565b612d0a9190614b21565b90505b60008390505b818110612e1b576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e0757809350505050612e57565b508080612e1390614d46565b915050612d13565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4e906148fd565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612f3c828260405180602001604052806000815250613339565b5050565b600082612f4d8584613818565b1490509392505050565b6000612f788473ffffffffffffffffffffffffffffffffffffffff166138f1565b156130e1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fa16125d9565b8786866040518563ffffffff1660e01b8152600401612fc39493929190614517565b602060405180830381600087803b158015612fdd57600080fd5b505af192505050801561300e57506040513d601f19601f8201168201806040525081019061300b9190613df3565b60015b613091573d806000811461303e576040519150601f19603f3d011682016040523d82523d6000602084013e613043565b606091505b50600081511415613089576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130809061487d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130e6565b600190505b949350505050565b6060600980546130fd90614d70565b80601f016020809104026020016040519081016040528092919081815260200182805461312990614d70565b80156131765780601f1061314b57610100808354040283529160200191613176565b820191906000526020600020905b81548152906001019060200180831161315957829003601f168201915b5050505050905090565b606060008214156131c8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613328565b600082905060005b600082146131fa5780806131e390614dd3565b915050600a826131f39190614b77565b91506131d0565b60008167ffffffffffffffff81111561323c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561326e5781602001600182028036833780820191505090505b5090505b60008514613321576001826132879190614c36565b9150600a856132969190614e4a565b60306132a29190614b21565b60f81b8183815181106132de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561331a9190614b77565b9450613272565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a6906148bd565b60405180910390fd5b6133b8816125e1565b156133f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ef9061489d565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000083111561345b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134529061497d565b60405180910390fd5b613468600085838661332d565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516135659190614adb565b6fffffffffffffffffffffffffffffffff16815260200185836020015161358c9190614adb565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156137fb57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461379b6000888488612f57565b6137da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137d19061487d565b60405180910390fd5b81806137e590614dd3565b92505080806137f390614dd3565b91505061372a565b50806000819055506138106000878588613333565b505050505050565b60008082905060005b84518110156138e6576000858281518110613865577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116138a65782816040516020016138899291906144ac565b6040516020818303038152906040528051906020012092506138d2565b80836040516020016138b99291906144ac565b6040516020818303038152906040528051906020012092505b5080806138de90614dd3565b915050613821565b508091505092915050565b600080823b905060008111915050919050565b82805461391090614d70565b90600052602060002090601f0160209004810192826139325760008555613979565b82601f1061394b57805160ff1916838001178555613979565b82800160010185558215613979579182015b8281111561397857825182559160200191906001019061395d565b5b50905061398691906139c4565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156139dd5760008160009055506001016139c5565b5090565b60006139f46139ef846149fd565b6149d8565b905082815260208101848484011115613a0c57600080fd5b613a17848285614d04565b509392505050565b6000613a32613a2d84614a2e565b6149d8565b905082815260208101848484011115613a4a57600080fd5b613a55848285614d04565b509392505050565b600081359050613a6c81615790565b92915050565b60008083601f840112613a8457600080fd5b8235905067ffffffffffffffff811115613a9d57600080fd5b602083019150836020820283011115613ab557600080fd5b9250929050565b600081359050613acb816157a7565b92915050565b600081359050613ae0816157be565b92915050565b600081359050613af5816157d5565b92915050565b600081519050613b0a816157d5565b92915050565b600082601f830112613b2157600080fd5b8135613b318482602086016139e1565b91505092915050565b600082601f830112613b4b57600080fd5b8135613b5b848260208601613a1f565b91505092915050565b600081359050613b73816157ec565b92915050565b600060208284031215613b8b57600080fd5b6000613b9984828501613a5d565b91505092915050565b60008060408385031215613bb557600080fd5b6000613bc385828601613a5d565b9250506020613bd485828601613a5d565b9150509250929050565b600080600060608486031215613bf357600080fd5b6000613c0186828701613a5d565b9350506020613c1286828701613a5d565b9250506040613c2386828701613b64565b9150509250925092565b60008060008060808587031215613c4357600080fd5b6000613c5187828801613a5d565b9450506020613c6287828801613a5d565b9350506040613c7387828801613b64565b925050606085013567ffffffffffffffff811115613c9057600080fd5b613c9c87828801613b10565b91505092959194509250565b60008060408385031215613cbb57600080fd5b6000613cc985828601613a5d565b9250506020613cda85828601613abc565b9150509250929050565b60008060408385031215613cf757600080fd5b6000613d0585828601613a5d565b9250506020613d1685828601613b64565b9150509250929050565b600080600060408486031215613d3557600080fd5b600084013567ffffffffffffffff811115613d4f57600080fd5b613d5b86828701613a72565b93509350506020613d6e86828701613b64565b9150509250925092565b600060208284031215613d8a57600080fd5b6000613d9884828501613abc565b91505092915050565b600060208284031215613db357600080fd5b6000613dc184828501613ad1565b91505092915050565b600060208284031215613ddc57600080fd5b6000613dea84828501613ae6565b91505092915050565b600060208284031215613e0557600080fd5b6000613e1384828501613afb565b91505092915050565b600060208284031215613e2e57600080fd5b600082013567ffffffffffffffff811115613e4857600080fd5b613e5484828501613b3a565b91505092915050565b600060208284031215613e6f57600080fd5b6000613e7d84828501613b64565b91505092915050565b60008060408385031215613e9957600080fd5b6000613ea785828601613b64565b9250506020613eb885828601613a5d565b9150509250929050565b6000613ece8383614473565b60208301905092915050565b613ee381614c6a565b82525050565b613efa613ef582614c6a565b614e1c565b82525050565b6000613f0b82614a6f565b613f158185614a9d565b9350613f2083614a5f565b8060005b83811015613f51578151613f388882613ec2565b9750613f4383614a90565b925050600181019050613f24565b5085935050505092915050565b613f6781614c7c565b82525050565b613f7681614c88565b82525050565b613f8d613f8882614c88565b614e2e565b82525050565b6000613f9e82614a7a565b613fa88185614aae565b9350613fb8818560208601614d13565b613fc181614f37565b840191505092915050565b6000613fd782614a85565b613fe18185614abf565b9350613ff1818560208601614d13565b613ffa81614f37565b840191505092915050565b600061401082614a85565b61401a8185614ad0565b935061402a818560208601614d13565b80840191505092915050565b6000614043602283614abf565b915061404e82614f55565b604082019050919050565b6000614066602683614abf565b915061407182614fa4565b604082019050919050565b6000614089602a83614abf565b915061409482614ff3565b604082019050919050565b60006140ac602383614abf565b91506140b782615042565b604082019050919050565b60006140cf602583614abf565b91506140da82615091565b604082019050919050565b60006140f2603983614abf565b91506140fd826150e0565b604082019050919050565b6000614115602b83614abf565b91506141208261512f565b604082019050919050565b6000614138602683614abf565b91506141438261517e565b604082019050919050565b600061415b602083614abf565b9150614166826151cd565b602082019050919050565b600061417e601683614abf565b9150614189826151f6565b602082019050919050565b60006141a1602f83614abf565b91506141ac8261521f565b604082019050919050565b60006141c4601a83614abf565b91506141cf8261526e565b602082019050919050565b60006141e7603283614abf565b91506141f282615297565b604082019050919050565b600061420a602183614abf565b9150614215826152e6565b604082019050919050565b600061422d601183614abf565b915061423882615335565b602082019050919050565b6000614250606583614abf565b915061425b8261535e565b608082019050919050565b6000614273601c83614abf565b915061427e826153f9565b602082019050919050565b6000614296601883614abf565b91506142a182615422565b602082019050919050565b60006142b9602283614abf565b91506142c48261544b565b604082019050919050565b60006142dc600f83614abf565b91506142e78261549a565b602082019050919050565b60006142ff601283614abf565b915061430a826154c3565b602082019050919050565b6000614322603383614abf565b915061432d826154ec565b604082019050919050565b6000614345601d83614abf565b91506143508261553b565b602082019050919050565b6000614368602183614abf565b915061437382615564565b604082019050919050565b600061438b602e83614abf565b9150614396826155b3565b604082019050919050565b60006143ae602f83614abf565b91506143b982615602565b604082019050919050565b60006143d1602383614abf565b91506143dc82615651565b604082019050919050565b60006143f4602d83614abf565b91506143ff826156a0565b604082019050919050565b6000614417601b83614abf565b9150614422826156ef565b602082019050919050565b600061443a602283614abf565b915061444582615718565b604082019050919050565b600061445d601583614abf565b915061446882615767565b602082019050919050565b61447c81614cfa565b82525050565b61448b81614cfa565b82525050565b600061449d8284613ee9565b60148201915081905092915050565b60006144b88285613f7c565b6020820191506144c88284613f7c565b6020820191508190509392505050565b60006144e48285614005565b91506144f08284614005565b91508190509392505050565b60006020820190506145116000830184613eda565b92915050565b600060808201905061452c6000830187613eda565b6145396020830186613eda565b6145466040830185614482565b81810360608301526145588184613f93565b905095945050505050565b6000602082019050818103600083015261457d8184613f00565b905092915050565b600060208201905061459a6000830184613f5e565b92915050565b60006020820190506145b56000830184613f6d565b92915050565b600060208201905081810360008301526145d58184613fcc565b905092915050565b600060208201905081810360008301526145f681614036565b9050919050565b6000602082019050818103600083015261461681614059565b9050919050565b600060208201905081810360008301526146368161407c565b9050919050565b600060208201905081810360008301526146568161409f565b9050919050565b60006020820190508181036000830152614676816140c2565b9050919050565b60006020820190508181036000830152614696816140e5565b9050919050565b600060208201905081810360008301526146b681614108565b9050919050565b600060208201905081810360008301526146d68161412b565b9050919050565b600060208201905081810360008301526146f68161414e565b9050919050565b6000602082019050818103600083015261471681614171565b9050919050565b6000602082019050818103600083015261473681614194565b9050919050565b60006020820190508181036000830152614756816141b7565b9050919050565b60006020820190508181036000830152614776816141da565b9050919050565b60006020820190508181036000830152614796816141fd565b9050919050565b600060208201905081810360008301526147b681614220565b9050919050565b600060208201905081810360008301526147d681614243565b9050919050565b600060208201905081810360008301526147f681614266565b9050919050565b6000602082019050818103600083015261481681614289565b9050919050565b60006020820190508181036000830152614836816142ac565b9050919050565b60006020820190508181036000830152614856816142cf565b9050919050565b60006020820190508181036000830152614876816142f2565b9050919050565b6000602082019050818103600083015261489681614315565b9050919050565b600060208201905081810360008301526148b681614338565b9050919050565b600060208201905081810360008301526148d68161435b565b9050919050565b600060208201905081810360008301526148f68161437e565b9050919050565b60006020820190508181036000830152614916816143a1565b9050919050565b60006020820190508181036000830152614936816143c4565b9050919050565b60006020820190508181036000830152614956816143e7565b9050919050565b600060208201905081810360008301526149768161440a565b9050919050565b600060208201905081810360008301526149968161442d565b9050919050565b600060208201905081810360008301526149b681614450565b9050919050565b60006020820190506149d26000830184614482565b92915050565b60006149e26149f3565b90506149ee8282614da2565b919050565b6000604051905090565b600067ffffffffffffffff821115614a1857614a17614f08565b5b614a2182614f37565b9050602081019050919050565b600067ffffffffffffffff821115614a4957614a48614f08565b5b614a5282614f37565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ae682614cbe565b9150614af183614cbe565b9250826fffffffffffffffffffffffffffffffff03821115614b1657614b15614e7b565b5b828201905092915050565b6000614b2c82614cfa565b9150614b3783614cfa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b6c57614b6b614e7b565b5b828201905092915050565b6000614b8282614cfa565b9150614b8d83614cfa565b925082614b9d57614b9c614eaa565b5b828204905092915050565b6000614bb382614cfa565b9150614bbe83614cfa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bf757614bf6614e7b565b5b828202905092915050565b6000614c0d82614cbe565b9150614c1883614cbe565b925082821015614c2b57614c2a614e7b565b5b828203905092915050565b6000614c4182614cfa565b9150614c4c83614cfa565b925082821015614c5f57614c5e614e7b565b5b828203905092915050565b6000614c7582614cda565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d31578082015181840152602081019050614d16565b83811115614d40576000848401525b50505050565b6000614d5182614cfa565b91506000821415614d6557614d64614e7b565b5b600182039050919050565b60006002820490506001821680614d8857607f821691505b60208210811415614d9c57614d9b614ed9565b5b50919050565b614dab82614f37565b810181811067ffffffffffffffff82111715614dca57614dc9614f08565b5b80604052505050565b6000614dde82614cfa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e1157614e10614e7b565b5b600182019050919050565b6000614e2782614e38565b9050919050565b6000819050919050565b6000614e4382614f48565b9050919050565b6000614e5582614cfa565b9150614e6083614cfa565b925082614e7057614e6f614eaa565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f416c6c2043727970746f486970706f732068617665206265656e206d696e746560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d61782035204e46547320706572207478000000000000000000000000000000600082015250565b7f596f752063616e206f6e6c79206d696e7420757020746f20352043727970746f60008201527f486970706f7320647572696e672077686974656c6973742073616c652c20776160208201527f697420666f72207075626c69632073616c6520746f20646f206d6f726520746860408201527f616e20352e000000000000000000000000000000000000000000000000000000606082015250565b7f4d61726b6574696e672072657365727665206578686175737465642e00000000600082015250565b7f596f7520617265206e6f742077686974656c69737465642e0000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f74207075626c69632073616c650000000000000000000000000000000000600082015250565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f596f752063616e206f6e6c79206d696e74203520706572207472616e7361637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d757374206d696e74206d6f7265207468616e20300000000000000000000000600082015250565b61579981614c6a565b81146157a457600080fd5b50565b6157b081614c7c565b81146157bb57600080fd5b50565b6157c781614c88565b81146157d257600080fd5b50565b6157de81614c92565b81146157e957600080fd5b50565b6157f581614cfa565b811461580057600080fd5b5056fea26469706673582212201837a449f21846f588f8abc7f9be81f8532e3dc56ab34ce56b8fa2226f5f287f64736f6c6343000803003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d624d355951753459474c7364586256346570747a655061527864546e434a504e6a515559514e456d517932562f

Deployed Bytecode

0x6080604052600436106102515760003560e01c80636352211e11610139578063a56dba81116100b6578063d0eb26b01161007a578063d0eb26b0146108aa578063d5abeb01146108d3578063d7224ba0146108fe578063e985e9c514610929578063efbd73f414610966578063f2fde38b1461098f57610251565b8063a56dba81146107d2578063b88d4fde146107ee578063ba7d2c7614610817578063c38f761714610842578063c87b56dd1461086d57610251565b80638da5cb5b116100fd5780638da5cb5b1461070c57806395d89b41146107375780639c70b51214610762578063a0712d681461078d578063a22cb465146107a957610251565b80636352211e146106275780636c0360eb1461066457806370a082311461068f578063715018a6146106cc5780637f00c7a6146106e357610251565b806323b872dd116101d257806342842e0e1161019657806342842e0e14610505578063438b63001461052e578063475489d31461056b5780634f6ccce71461059657806355f804b3146105d35780635c975abb146105fc57610251565b806323b872dd146104365780632d7eae661461045f5780632f745c59146104885780633c952764146104c55780633ccfd60b146104ee57610251565b806313faede61161021957806313faede61461034d57806318160ddd1461037857806318cae269146103a35780631d80009a146103e0578063239c70ae1461040b57610251565b806301ffc9a71461025657806302329a291461029357806306fdde03146102bc578063081812fc146102e7578063095ea7b314610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613dca565b6109b8565b60405161028a9190614585565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190613d78565b610b02565b005b3480156102c857600080fd5b506102d1610b9b565b6040516102de91906145bb565b60405180910390f35b3480156102f357600080fd5b5061030e60048036038101906103099190613e5d565b610c2d565b60405161031b91906144fc565b60405180910390f35b34801561033057600080fd5b5061034b60048036038101906103469190613ce4565b610cb2565b005b34801561035957600080fd5b50610362610dcb565b60405161036f91906149bd565b60405180910390f35b34801561038457600080fd5b5061038d610dd1565b60405161039a91906149bd565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190613b79565b610dda565b6040516103d791906149bd565b60405180910390f35b3480156103ec57600080fd5b506103f5610df2565b60405161040291906145a0565b60405180910390f35b34801561041757600080fd5b50610420610df8565b60405161042d91906149bd565b60405180910390f35b34801561044257600080fd5b5061045d60048036038101906104589190613bde565b610dfe565b005b34801561046b57600080fd5b5061048660048036038101906104819190613da1565b610e0e565b005b34801561049457600080fd5b506104af60048036038101906104aa9190613ce4565b610e94565b6040516104bc91906149bd565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190613d78565b611092565b005b3480156104fa57600080fd5b5061050361112b565b005b34801561051157600080fd5b5061052c60048036038101906105279190613bde565b61146e565b005b34801561053a57600080fd5b5061055560048036038101906105509190613b79565b61148e565b6040516105629190614563565b60405180910390f35b34801561057757600080fd5b50610580611588565b60405161058d91906149bd565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b89190613e5d565b61158e565b6040516105ca91906149bd565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190613e1c565b6115e1565b005b34801561060857600080fd5b50610611611677565b60405161061e9190614585565b60405180910390f35b34801561063357600080fd5b5061064e60048036038101906106499190613e5d565b61168a565b60405161065b91906144fc565b60405180910390f35b34801561067057600080fd5b506106796116a0565b60405161068691906145bb565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b19190613b79565b61172e565b6040516106c391906149bd565b60405180910390f35b3480156106d857600080fd5b506106e1611817565b005b3480156106ef57600080fd5b5061070a60048036038101906107059190613e5d565b61189f565b005b34801561071857600080fd5b50610721611925565b60405161072e91906144fc565b60405180910390f35b34801561074357600080fd5b5061074c61194f565b60405161075991906145bb565b60405180910390f35b34801561076e57600080fd5b506107776119e1565b6040516107849190614585565b60405180910390f35b6107a760048036038101906107a29190613e5d565b6119f4565b005b3480156107b557600080fd5b506107d060048036038101906107cb9190613ca8565b611c5e565b005b6107ec60048036038101906107e79190613d20565b611ddf565b005b3480156107fa57600080fd5b5061081560048036038101906108109190613c2d565b6120a5565b005b34801561082357600080fd5b5061082c612101565b60405161083991906149bd565b60405180910390f35b34801561084e57600080fd5b50610857612107565b60405161086491906149bd565b60405180910390f35b34801561087957600080fd5b50610894600480360381019061088f9190613e5d565b61210d565b6040516108a191906145bb565b60405180910390f35b3480156108b657600080fd5b506108d160048036038101906108cc9190613e5d565b6121b4565b005b3480156108df57600080fd5b506108e861223a565b6040516108f591906149bd565b60405180910390f35b34801561090a57600080fd5b50610913612240565b60405161092091906149bd565b60405180910390f35b34801561093557600080fd5b50610950600480360381019061094b9190613ba2565b612246565b60405161095d9190614585565b60405180910390f35b34801561097257600080fd5b5061098d60048036038101906109889190613e86565b6122da565b005b34801561099b57600080fd5b506109b660048036038101906109b19190613b79565b612477565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aeb57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610afb5750610afa8261256f565b5b9050919050565b610b0a6125d9565b73ffffffffffffffffffffffffffffffffffffffff16610b28611925565b73ffffffffffffffffffffffffffffffffffffffff1614610b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b75906146dd565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b606060018054610baa90614d70565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd690614d70565b8015610c235780601f10610bf857610100808354040283529160200191610c23565b820191906000526020600020905b815481529060010190602001808311610c0657829003601f168201915b5050505050905090565b6000610c38826125e1565b610c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e9061493d565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cbd8261168a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d259061481d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d4d6125d9565b73ffffffffffffffffffffffffffffffffffffffff161480610d7c5750610d7b81610d766125d9565b612246565b5b610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db29061467d565b60405180910390fd5b610dc68383836125ee565b505050565b600a5481565b60008054905090565b60116020528060005260406000206000915090505481565b60125481565b600c5481565b610e098383836126a0565b505050565b610e166125d9565b73ffffffffffffffffffffffffffffffffffffffff16610e34611925565b73ffffffffffffffffffffffffffffffffffffffff1614610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e81906146dd565b60405180910390fd5b8060128190555050565b6000610e9f8361172e565b8210610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed7906145dd565b60405180910390fd5b6000610eea610dd1565b905060008060005b83811015611050576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610fe457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561103c578684141561102d57819550505050505061108c565b838061103890614dd3565b9450505b50808061104890614dd3565b915050610ef2565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611083906148dd565b60405180910390fd5b92915050565b61109a6125d9565b73ffffffffffffffffffffffffffffffffffffffff166110b8611925565b73ffffffffffffffffffffffffffffffffffffffff161461110e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611105906146dd565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b6111336125d9565b73ffffffffffffffffffffffffffffffffffffffff16611151611925565b73ffffffffffffffffffffffffffffffffffffffff16146111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e906146dd565b60405180910390fd5b60004790506000612710610ed8836111bf9190614ba8565b6111c99190614b77565b905060006127106101f4846111de9190614ba8565b6111e89190614b77565b905060006127106101c2856111fd9190614ba8565b6112079190614b77565b9050600061271061012c8661121c9190614ba8565b6112269190614b77565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611290573d6000803e3d6000fd5b50601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156112f9573d6000803e3d6000fd5b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611362573d6000803e3d6000fd5b50601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f193505050501580156113cb573d6000803e3d6000fd5b506000848484846113dc9190614b21565b6113e69190614b21565b6113f09190614b21565b866113fb9190614c36565b9050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611465573d6000803e3d6000fd5b50505050505050565b611489838383604051806020016040528060008152506120a5565b505050565b6060600061149b8361172e565b905060008167ffffffffffffffff8111156114df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561150d5781602001602082028036833780820191505090505b50905060005b8281101561157d576115258582610e94565b82828151811061155e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061157590614dd3565b915050611513565b508092505050919050565b600e5481565b6000611598610dd1565b82106115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d09061463d565b60405180910390fd5b819050919050565b6115e96125d9565b73ffffffffffffffffffffffffffffffffffffffff16611607611925565b73ffffffffffffffffffffffffffffffffffffffff161461165d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611654906146dd565b60405180910390fd5b8060099080519060200190611673929190613904565b5050565b601060009054906101000a900460ff1681565b600061169582612c59565b600001519050919050565b600980546116ad90614d70565b80601f01602080910402602001604051908101604052809291908181526020018280546116d990614d70565b80156117265780601f106116fb57610100808354040283529160200191611726565b820191906000526020600020905b81548152906001019060200180831161170957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561179f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117969061469d565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61181f6125d9565b73ffffffffffffffffffffffffffffffffffffffff1661183d611925565b73ffffffffffffffffffffffffffffffffffffffff1614611893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188a906146dd565b60405180910390fd5b61189d6000612e5c565b565b6118a76125d9565b73ffffffffffffffffffffffffffffffffffffffff166118c5611925565b73ffffffffffffffffffffffffffffffffffffffff161461191b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611912906146dd565b60405180910390fd5b80600c8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461195e90614d70565b80601f016020809104026020016040519081016040528092919081815260200182805461198a90614d70565b80156119d75780601f106119ac576101008083540402835291602001916119d7565b820191906000526020600020905b8154815290600101906020018083116119ba57829003601f168201915b5050505050905090565b601060019054906101000a900460ff1681565b601060009054906101000a900460ff1615611a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3b906146fd565b60405180910390fd5b60008111611a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7e9061495d565b60405180910390fd5b600c54811115611acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac39061491d565b60405180910390fd5b600b5481611ad8610dd1565b611ae29190614b21565b1115611b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1a9061477d565b60405180910390fd5b601060019054906101000a900460ff1615611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a9061483d565b60405180910390fd5b80600a54611b819190614ba8565b341015611bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bba9061485d565b60405180910390fd5b611bcd3382612f22565b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c189190614b21565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b611c666125d9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb9061473d565b60405180910390fd5b8060066000611ce16125d9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d8e6125d9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dd39190614585565b60405180910390a35050565b601060009054906101000a900460ff1615611df957600080fd5b600b5481611e05610dd1565b611e0f9190614b21565b1115611e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e479061477d565b60405180910390fd5b611ec4838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060125433604051602001611ea99190614491565b60405160208183030381529060405280519060200120612f40565b611f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efa906147fd565b60405180910390fd5b60008111611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d9061495d565b60405180910390fd5b601060019054906101000a900460ff16611f5f57600080fd5b600d5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fad9190614b21565b1115611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe5906147bd565b60405180910390fd5b80600a54611ffc9190614ba8565b34101561200857600080fd5b6120123382612f22565b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461205d9190614b21565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b6120b08484846126a0565b6120bc84848484612f57565b6120fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f29061487d565b60405180910390fd5b50505050565b600d5481565b600f5481565b6060612118826125e1565b612157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214e9061471d565b60405180910390fd5b60006121616130ee565b9050600081511161218157604051806020016040528060008152506121ac565b8061218b84613180565b60405160200161219c9291906144d8565b6040516020818303038152906040525b915050919050565b6121bc6125d9565b73ffffffffffffffffffffffffffffffffffffffff166121da611925565b73ffffffffffffffffffffffffffffffffffffffff1614612230576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612227906146dd565b60405180910390fd5b80600d8190555050565b600b5481565b60075481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122e26125d9565b73ffffffffffffffffffffffffffffffffffffffff16612300611925565b73ffffffffffffffffffffffffffffffffffffffff1614612356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234d906146dd565b60405180910390fd5b60008211612399576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123909061499d565b60405180910390fd5b600c548211156123de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d59061479d565b60405180910390fd5b600e5482600f546123ef9190614b21565b1061242f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612426906147dd565b60405180910390fd5b600b548261243b610dd1565b6124459190614b21565b111561245057600080fd5b61245a8183612f22565b81600f600082825461246c9190614b21565b925050819055505050565b61247f6125d9565b73ffffffffffffffffffffffffffffffffffffffff1661249d611925565b73ffffffffffffffffffffffffffffffffffffffff16146124f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ea906146dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255a906145fd565b60405180910390fd5b61256c81612e5c565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006126ab82612c59565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166126d26125d9565b73ffffffffffffffffffffffffffffffffffffffff16148061272e57506126f76125d9565b73ffffffffffffffffffffffffffffffffffffffff1661271684610c2d565b73ffffffffffffffffffffffffffffffffffffffff16145b8061274a575061274982600001516127446125d9565b612246565b5b90508061278c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127839061475d565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f5906146bd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561286e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128659061465d565b60405180910390fd5b61287b858585600161332d565b61288b60008484600001516125ee565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166128f99190614c02565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661299d9190614adb565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612aa39190614b21565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612be957612b19816125e1565b15612be8576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c518686866001613333565b505050505050565b612c6161398a565b612c6a826125e1565b612ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca09061461d565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000058310612d0d5760017f000000000000000000000000000000000000000000000000000000000000000584612d009190614c36565b612d0a9190614b21565b90505b60008390505b818110612e1b576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e0757809350505050612e57565b508080612e1390614d46565b915050612d13565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4e906148fd565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612f3c828260405180602001604052806000815250613339565b5050565b600082612f4d8584613818565b1490509392505050565b6000612f788473ffffffffffffffffffffffffffffffffffffffff166138f1565b156130e1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fa16125d9565b8786866040518563ffffffff1660e01b8152600401612fc39493929190614517565b602060405180830381600087803b158015612fdd57600080fd5b505af192505050801561300e57506040513d601f19601f8201168201806040525081019061300b9190613df3565b60015b613091573d806000811461303e576040519150601f19603f3d011682016040523d82523d6000602084013e613043565b606091505b50600081511415613089576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130809061487d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130e6565b600190505b949350505050565b6060600980546130fd90614d70565b80601f016020809104026020016040519081016040528092919081815260200182805461312990614d70565b80156131765780601f1061314b57610100808354040283529160200191613176565b820191906000526020600020905b81548152906001019060200180831161315957829003601f168201915b5050505050905090565b606060008214156131c8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613328565b600082905060005b600082146131fa5780806131e390614dd3565b915050600a826131f39190614b77565b91506131d0565b60008167ffffffffffffffff81111561323c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561326e5781602001600182028036833780820191505090505b5090505b60008514613321576001826132879190614c36565b9150600a856132969190614e4a565b60306132a29190614b21565b60f81b8183815181106132de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561331a9190614b77565b9450613272565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a6906148bd565b60405180910390fd5b6133b8816125e1565b156133f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ef9061489d565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000583111561345b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134529061497d565b60405180910390fd5b613468600085838661332d565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516135659190614adb565b6fffffffffffffffffffffffffffffffff16815260200185836020015161358c9190614adb565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156137fb57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461379b6000888488612f57565b6137da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137d19061487d565b60405180910390fd5b81806137e590614dd3565b92505080806137f390614dd3565b91505061372a565b50806000819055506138106000878588613333565b505050505050565b60008082905060005b84518110156138e6576000858281518110613865577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116138a65782816040516020016138899291906144ac565b6040516020818303038152906040528051906020012092506138d2565b80836040516020016138b99291906144ac565b6040516020818303038152906040528051906020012092505b5080806138de90614dd3565b915050613821565b508091505092915050565b600080823b905060008111915050919050565b82805461391090614d70565b90600052602060002090601f0160209004810192826139325760008555613979565b82601f1061394b57805160ff1916838001178555613979565b82800160010185558215613979579182015b8281111561397857825182559160200191906001019061395d565b5b50905061398691906139c4565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156139dd5760008160009055506001016139c5565b5090565b60006139f46139ef846149fd565b6149d8565b905082815260208101848484011115613a0c57600080fd5b613a17848285614d04565b509392505050565b6000613a32613a2d84614a2e565b6149d8565b905082815260208101848484011115613a4a57600080fd5b613a55848285614d04565b509392505050565b600081359050613a6c81615790565b92915050565b60008083601f840112613a8457600080fd5b8235905067ffffffffffffffff811115613a9d57600080fd5b602083019150836020820283011115613ab557600080fd5b9250929050565b600081359050613acb816157a7565b92915050565b600081359050613ae0816157be565b92915050565b600081359050613af5816157d5565b92915050565b600081519050613b0a816157d5565b92915050565b600082601f830112613b2157600080fd5b8135613b318482602086016139e1565b91505092915050565b600082601f830112613b4b57600080fd5b8135613b5b848260208601613a1f565b91505092915050565b600081359050613b73816157ec565b92915050565b600060208284031215613b8b57600080fd5b6000613b9984828501613a5d565b91505092915050565b60008060408385031215613bb557600080fd5b6000613bc385828601613a5d565b9250506020613bd485828601613a5d565b9150509250929050565b600080600060608486031215613bf357600080fd5b6000613c0186828701613a5d565b9350506020613c1286828701613a5d565b9250506040613c2386828701613b64565b9150509250925092565b60008060008060808587031215613c4357600080fd5b6000613c5187828801613a5d565b9450506020613c6287828801613a5d565b9350506040613c7387828801613b64565b925050606085013567ffffffffffffffff811115613c9057600080fd5b613c9c87828801613b10565b91505092959194509250565b60008060408385031215613cbb57600080fd5b6000613cc985828601613a5d565b9250506020613cda85828601613abc565b9150509250929050565b60008060408385031215613cf757600080fd5b6000613d0585828601613a5d565b9250506020613d1685828601613b64565b9150509250929050565b600080600060408486031215613d3557600080fd5b600084013567ffffffffffffffff811115613d4f57600080fd5b613d5b86828701613a72565b93509350506020613d6e86828701613b64565b9150509250925092565b600060208284031215613d8a57600080fd5b6000613d9884828501613abc565b91505092915050565b600060208284031215613db357600080fd5b6000613dc184828501613ad1565b91505092915050565b600060208284031215613ddc57600080fd5b6000613dea84828501613ae6565b91505092915050565b600060208284031215613e0557600080fd5b6000613e1384828501613afb565b91505092915050565b600060208284031215613e2e57600080fd5b600082013567ffffffffffffffff811115613e4857600080fd5b613e5484828501613b3a565b91505092915050565b600060208284031215613e6f57600080fd5b6000613e7d84828501613b64565b91505092915050565b60008060408385031215613e9957600080fd5b6000613ea785828601613b64565b9250506020613eb885828601613a5d565b9150509250929050565b6000613ece8383614473565b60208301905092915050565b613ee381614c6a565b82525050565b613efa613ef582614c6a565b614e1c565b82525050565b6000613f0b82614a6f565b613f158185614a9d565b9350613f2083614a5f565b8060005b83811015613f51578151613f388882613ec2565b9750613f4383614a90565b925050600181019050613f24565b5085935050505092915050565b613f6781614c7c565b82525050565b613f7681614c88565b82525050565b613f8d613f8882614c88565b614e2e565b82525050565b6000613f9e82614a7a565b613fa88185614aae565b9350613fb8818560208601614d13565b613fc181614f37565b840191505092915050565b6000613fd782614a85565b613fe18185614abf565b9350613ff1818560208601614d13565b613ffa81614f37565b840191505092915050565b600061401082614a85565b61401a8185614ad0565b935061402a818560208601614d13565b80840191505092915050565b6000614043602283614abf565b915061404e82614f55565b604082019050919050565b6000614066602683614abf565b915061407182614fa4565b604082019050919050565b6000614089602a83614abf565b915061409482614ff3565b604082019050919050565b60006140ac602383614abf565b91506140b782615042565b604082019050919050565b60006140cf602583614abf565b91506140da82615091565b604082019050919050565b60006140f2603983614abf565b91506140fd826150e0565b604082019050919050565b6000614115602b83614abf565b91506141208261512f565b604082019050919050565b6000614138602683614abf565b91506141438261517e565b604082019050919050565b600061415b602083614abf565b9150614166826151cd565b602082019050919050565b600061417e601683614abf565b9150614189826151f6565b602082019050919050565b60006141a1602f83614abf565b91506141ac8261521f565b604082019050919050565b60006141c4601a83614abf565b91506141cf8261526e565b602082019050919050565b60006141e7603283614abf565b91506141f282615297565b604082019050919050565b600061420a602183614abf565b9150614215826152e6565b604082019050919050565b600061422d601183614abf565b915061423882615335565b602082019050919050565b6000614250606583614abf565b915061425b8261535e565b608082019050919050565b6000614273601c83614abf565b915061427e826153f9565b602082019050919050565b6000614296601883614abf565b91506142a182615422565b602082019050919050565b60006142b9602283614abf565b91506142c48261544b565b604082019050919050565b60006142dc600f83614abf565b91506142e78261549a565b602082019050919050565b60006142ff601283614abf565b915061430a826154c3565b602082019050919050565b6000614322603383614abf565b915061432d826154ec565b604082019050919050565b6000614345601d83614abf565b91506143508261553b565b602082019050919050565b6000614368602183614abf565b915061437382615564565b604082019050919050565b600061438b602e83614abf565b9150614396826155b3565b604082019050919050565b60006143ae602f83614abf565b91506143b982615602565b604082019050919050565b60006143d1602383614abf565b91506143dc82615651565b604082019050919050565b60006143f4602d83614abf565b91506143ff826156a0565b604082019050919050565b6000614417601b83614abf565b9150614422826156ef565b602082019050919050565b600061443a602283614abf565b915061444582615718565b604082019050919050565b600061445d601583614abf565b915061446882615767565b602082019050919050565b61447c81614cfa565b82525050565b61448b81614cfa565b82525050565b600061449d8284613ee9565b60148201915081905092915050565b60006144b88285613f7c565b6020820191506144c88284613f7c565b6020820191508190509392505050565b60006144e48285614005565b91506144f08284614005565b91508190509392505050565b60006020820190506145116000830184613eda565b92915050565b600060808201905061452c6000830187613eda565b6145396020830186613eda565b6145466040830185614482565b81810360608301526145588184613f93565b905095945050505050565b6000602082019050818103600083015261457d8184613f00565b905092915050565b600060208201905061459a6000830184613f5e565b92915050565b60006020820190506145b56000830184613f6d565b92915050565b600060208201905081810360008301526145d58184613fcc565b905092915050565b600060208201905081810360008301526145f681614036565b9050919050565b6000602082019050818103600083015261461681614059565b9050919050565b600060208201905081810360008301526146368161407c565b9050919050565b600060208201905081810360008301526146568161409f565b9050919050565b60006020820190508181036000830152614676816140c2565b9050919050565b60006020820190508181036000830152614696816140e5565b9050919050565b600060208201905081810360008301526146b681614108565b9050919050565b600060208201905081810360008301526146d68161412b565b9050919050565b600060208201905081810360008301526146f68161414e565b9050919050565b6000602082019050818103600083015261471681614171565b9050919050565b6000602082019050818103600083015261473681614194565b9050919050565b60006020820190508181036000830152614756816141b7565b9050919050565b60006020820190508181036000830152614776816141da565b9050919050565b60006020820190508181036000830152614796816141fd565b9050919050565b600060208201905081810360008301526147b681614220565b9050919050565b600060208201905081810360008301526147d681614243565b9050919050565b600060208201905081810360008301526147f681614266565b9050919050565b6000602082019050818103600083015261481681614289565b9050919050565b60006020820190508181036000830152614836816142ac565b9050919050565b60006020820190508181036000830152614856816142cf565b9050919050565b60006020820190508181036000830152614876816142f2565b9050919050565b6000602082019050818103600083015261489681614315565b9050919050565b600060208201905081810360008301526148b681614338565b9050919050565b600060208201905081810360008301526148d68161435b565b9050919050565b600060208201905081810360008301526148f68161437e565b9050919050565b60006020820190508181036000830152614916816143a1565b9050919050565b60006020820190508181036000830152614936816143c4565b9050919050565b60006020820190508181036000830152614956816143e7565b9050919050565b600060208201905081810360008301526149768161440a565b9050919050565b600060208201905081810360008301526149968161442d565b9050919050565b600060208201905081810360008301526149b681614450565b9050919050565b60006020820190506149d26000830184614482565b92915050565b60006149e26149f3565b90506149ee8282614da2565b919050565b6000604051905090565b600067ffffffffffffffff821115614a1857614a17614f08565b5b614a2182614f37565b9050602081019050919050565b600067ffffffffffffffff821115614a4957614a48614f08565b5b614a5282614f37565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ae682614cbe565b9150614af183614cbe565b9250826fffffffffffffffffffffffffffffffff03821115614b1657614b15614e7b565b5b828201905092915050565b6000614b2c82614cfa565b9150614b3783614cfa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b6c57614b6b614e7b565b5b828201905092915050565b6000614b8282614cfa565b9150614b8d83614cfa565b925082614b9d57614b9c614eaa565b5b828204905092915050565b6000614bb382614cfa565b9150614bbe83614cfa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bf757614bf6614e7b565b5b828202905092915050565b6000614c0d82614cbe565b9150614c1883614cbe565b925082821015614c2b57614c2a614e7b565b5b828203905092915050565b6000614c4182614cfa565b9150614c4c83614cfa565b925082821015614c5f57614c5e614e7b565b5b828203905092915050565b6000614c7582614cda565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d31578082015181840152602081019050614d16565b83811115614d40576000848401525b50505050565b6000614d5182614cfa565b91506000821415614d6557614d64614e7b565b5b600182039050919050565b60006002820490506001821680614d8857607f821691505b60208210811415614d9c57614d9b614ed9565b5b50919050565b614dab82614f37565b810181811067ffffffffffffffff82111715614dca57614dc9614f08565b5b80604052505050565b6000614dde82614cfa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e1157614e10614e7b565b5b600182019050919050565b6000614e2782614e38565b9050919050565b6000819050919050565b6000614e4382614f48565b9050919050565b6000614e5582614cfa565b9150614e6083614cfa565b925082614e7057614e6f614eaa565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f416c6c2043727970746f486970706f732068617665206265656e206d696e746560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d61782035204e46547320706572207478000000000000000000000000000000600082015250565b7f596f752063616e206f6e6c79206d696e7420757020746f20352043727970746f60008201527f486970706f7320647572696e672077686974656c6973742073616c652c20776160208201527f697420666f72207075626c69632073616c6520746f20646f206d6f726520746860408201527f616e20352e000000000000000000000000000000000000000000000000000000606082015250565b7f4d61726b6574696e672072657365727665206578686175737465642e00000000600082015250565b7f596f7520617265206e6f742077686974656c69737465642e0000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f74207075626c69632073616c650000000000000000000000000000000000600082015250565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f596f752063616e206f6e6c79206d696e74203520706572207472616e7361637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d757374206d696e74206d6f7265207468616e20300000000000000000000000600082015250565b61579981614c6a565b81146157a457600080fd5b50565b6157b081614c7c565b81146157bb57600080fd5b50565b6157c781614c88565b81146157d257600080fd5b50565b6157de81614c92565b81146157e957600080fd5b50565b6157f581614cfa565b811461580057600080fd5b5056fea26469706673582212201837a449f21846f588f8abc7f9be81f8532e3dc56ab34ce56b8fa2226f5f287f64736f6c63430008030033

Deployed Bytecode Sourcemap

34849:5869:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20924:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39885:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22885:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24580:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24101:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34996:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19280:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35308:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35370:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35074:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25607:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39421:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19988:864;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39972:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40081:634;;;;;;;;;;;;;:::i;:::-;;25840:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37907:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35157:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19457:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39773:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35234:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22694:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34968:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21410:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7517:103;;;;;;;;;;;;;:::i;:::-;;39643:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6866:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23054:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35267:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36232:695;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24944:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36935:964;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26088:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35113:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35195:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38305:602;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39525:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35035:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30969:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25326:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38935:478;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7775:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20924:422;21071:4;21128:25;21113:40;;;:11;:40;;;;:105;;;;21185:33;21170:48;;;:11;:48;;;;21113:105;:172;;;;21250:35;21235:50;;;:11;:50;;;;21113:172;:225;;;;21302:36;21326:11;21302:23;:36::i;:::-;21113:225;21093:245;;20924:422;;;:::o;39885:79::-;7097:12;:10;:12::i;:::-;7086:23;;:7;:5;:7::i;:::-;:23;;;7078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39950:6:::1;39941;;:15;;;;;;;;;;;;;;;;;;39885:79:::0;:::o;22885:100::-;22939:13;22972:5;22965:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22885:100;:::o;24580:292::-;24684:7;24731:16;24739:7;24731;:16::i;:::-;24709:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24840:15;:24;24856:7;24840:24;;;;;;;;;;;;;;;;;;;;;24833:31;;24580:292;;;:::o;24101:413::-;24174:13;24190:24;24206:7;24190:15;:24::i;:::-;24174:40;;24239:5;24233:11;;:2;:11;;;;24225:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;24334:5;24318:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24343:37;24360:5;24367:12;:10;:12::i;:::-;24343:16;:37::i;:::-;24318:62;24296:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;24478:28;24487:2;24491:7;24500:5;24478:8;:28::i;:::-;24101:413;;;:::o;34996:32::-;;;;:::o;19280:100::-;19333:7;19360:12;;19353:19;;19280:100;:::o;35308:55::-;;;;;;;;;;;;;;;;;:::o;35370:101::-;;;;:::o;35074:32::-;;;;:::o;25607:162::-;25733:28;25743:4;25749:2;25753:7;25733:9;:28::i;:::-;25607:162;;;:::o;39421:96::-;7097:12;:10;:12::i;:::-;7086:23;;:7;:5;:7::i;:::-;:23;;;7078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39500:9:::1;39489:8;:20;;;;39421:96:::0;:::o;19988:864::-;20113:7;20154:16;20164:5;20154:9;:16::i;:::-;20146:5;:24;20138:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;20220:22;20245:13;:11;:13::i;:::-;20220:38;;20269:19;20303:25;20357:9;20352:426;20376:14;20372:1;:18;20352:426;;;20412:31;20446:11;:14;20458:1;20446:14;;;;;;;;;;;20412:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20505:1;20479:28;;:9;:14;;;:28;;;20475:103;;20548:9;:14;;;20528:34;;20475:103;20617:5;20596:26;;:17;:26;;;20592:175;;;20662:5;20647:11;:20;20643:77;;;20699:1;20692:8;;;;;;;;;20643:77;20738:13;;;;;:::i;:::-;;;;20592:175;20352:426;20392:3;;;;;:::i;:::-;;;;20352:426;;;;20788:56;;;;;;;;;;:::i;:::-;;;;;;;;19988:864;;;;;:::o;39972:101::-;7097:12;:10;:12::i;:::-;7086:23;;:7;:5;:7::i;:::-;:23;;;7078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40059:6:::1;40041:15;;:24;;;;;;;;;;;;;;;;;;39972:101:::0;:::o;40081:634::-;7097:12;:10;:12::i;:::-;7086:23;;:7;:5;:7::i;:::-;:23;;;7078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40129:15:::1;40147:21;40129:39;;40179:16;40217:5;40209:4;40199:7;:14;;;;:::i;:::-;40198:24;;;;:::i;:::-;40179:43;;40233:16;40270:5;40263:3;40253:7;:13;;;;:::i;:::-;40252:23;;;;:::i;:::-;40233:42;;40286:16;40323:5;40316:3;40306:7;:13;;;;:::i;:::-;40305:23;;;;:::i;:::-;40286:42;;40339:16;40376:5;40369:3;40359:7;:13;;;;:::i;:::-;40358:23;;;;:::i;:::-;40339:42;;40402:8;;;;;;;;;;;40394:26;;:36;40421:8;40394:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;40451:8;;;;;;;;;;;40443:26;;:36;40470:8;40443:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;40500:8;;;;;;;;;;;40492:26;;:36;40519:8;40492:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;40549:8;;;;;;;;;;;40541:26;;:36;40568:8;40541:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;40588:16;40651:8;40640;40629;40618;:19;;;;:::i;:::-;:30;;;;:::i;:::-;:41;;;;:::i;:::-;40607:7;:53;;;;:::i;:::-;40588:72;;40679:8;;;;;;;;;;;40671:26;;:36;40698:8;40671:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7157:1;;;;;;40081:634::o:0;25840:177::-;25970:39;25987:4;25993:2;25997:7;25970:39;;;;;;;;;;;;:16;:39::i;:::-;25840:177;;;:::o;37907:390::-;37994:16;38028:23;38054:17;38064:6;38054:9;:17::i;:::-;38028:43;;38082:25;38124:15;38110:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38082:58;;38156:9;38151:113;38171:15;38167:1;:19;38151:113;;;38222:30;38242:6;38250:1;38222:19;:30::i;:::-;38208:8;38217:1;38208:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;38188:3;;;;;:::i;:::-;;;;38151:113;;;;38281:8;38274:15;;;;37907:390;;;:::o;35157:31::-;;;;:::o;19457:228::-;19560:7;19601:13;:11;:13::i;:::-;19593:5;:21;19585:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;19672:5;19665:12;;19457:228;;;:::o;39773:104::-;7097:12;:10;:12::i;:::-;7086:23;;:7;:5;:7::i;:::-;:23;;;7078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39858:11:::1;39848:7;:21;;;;;;;;;;;;:::i;:::-;;39773:104:::0;:::o;35234:26::-;;;;;;;;;;;;;:::o;22694:124::-;22758:7;22785:20;22797:7;22785:11;:20::i;:::-;:25;;;22778:32;;22694:124;;;:::o;34968:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21410:258::-;21474:7;21533:1;21516:19;;:5;:19;;;;21494:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;21632:12;:19;21645:5;21632:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;21624:36;;21617:43;;21410:258;;;:::o;7517:103::-;7097:12;:10;:12::i;:::-;7086:23;;:7;:5;:7::i;:::-;:23;;;7078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7582:30:::1;7609:1;7582:18;:30::i;:::-;7517:103::o:0;39643:122::-;7097:12;:10;:12::i;:::-;7086:23;;:7;:5;:7::i;:::-;:23;;;7078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39740:17:::1;39724:13;:33;;;;39643:122:::0;:::o;6866:87::-;6912:7;6939:6;;;;;;;;;;;6932:13;;6866:87;:::o;23054:104::-;23110:13;23143:7;23136:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23054:104;:::o;35267:34::-;;;;;;;;;;;;;:::o;36232:695::-;36302:6;;;;;;;;;;;36301:7;36293:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;36368:1;36354:11;:15;36346:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36449:13;;36434:11;:28;;36412:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;36575:9;;36560:11;36544:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;36536:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;36644:15;;;;;;;;;;;36643:16;36635:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;36720:11;36713:4;;:18;;;;:::i;:::-;36700:9;:31;;36692:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;36767:34;36777:10;36789:11;36767:9;:34::i;:::-;36908:11;36860:20;:32;36881:10;36860:32;;;;;;;;;;;;;;;;:59;;;;:::i;:::-;36812:20;:32;36833:10;36812:32;;;;;;;;;;;;;;;:107;;;;36232:695;:::o;24944:311::-;25074:12;:10;:12::i;:::-;25062:24;;:8;:24;;;;25054:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;25175:8;25130:18;:32;25149:12;:10;:12::i;:::-;25130:32;;;;;;;;;;;;;;;:42;25163:8;25130:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25228:8;25199:48;;25214:12;:10;:12::i;:::-;25199:48;;;25238:8;25199:48;;;;;;:::i;:::-;;;;;;;;24944:311;;:::o;36935:964::-;37074:6;;;;;;;;;;;37073:7;37065:16;;;;;;37131:9;;37116:11;37100:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;37092:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;37211:83;37230:12;;37211:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37244:8;;37281:10;37264:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;37254:39;;;;;;37211:18;:83::i;:::-;37189:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;37379:1;37365:11;:15;37357:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37431:15;;;;;;;;;;;37423:24;;;;;;37530:18;;37515:11;37480:20;:32;37501:10;37480:32;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:68;;37458:219;;;;;;;;;;;;:::i;:::-;;;;;;;;;37716:11;37709:4;;:18;;;;:::i;:::-;37696:9;:31;;37688:40;;;;;;37739:34;37749:10;37761:11;37739:9;:34::i;:::-;37880:11;37832:20;:32;37853:10;37832:32;;;;;;;;;;;;;;;;:59;;;;:::i;:::-;37784:20;:32;37805:10;37784:32;;;;;;;;;;;;;;;:107;;;;36935:964;;;:::o;26088:355::-;26247:28;26257:4;26263:2;26267:7;26247:9;:28::i;:::-;26308:48;26331:4;26337:2;26341:7;26350:5;26308:22;:48::i;:::-;26286:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;26088:355;;;;:::o;35113:37::-;;;;:::o;35195:32::-;;;;:::o;38305:602::-;38423:13;38476:16;38484:7;38476;:16::i;:::-;38454:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;38580:28;38611:10;:8;:10::i;:::-;38580:41;;38683:1;38658:14;38652:28;:32;:247;;;;;;;;;;;;;;;;;38776:14;38817:18;:7;:16;:18::i;:::-;38733:125;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38652:247;38632:267;;;38305:602;;;:::o;39525:110::-;7097:12;:10;:12::i;:::-;7086:23;;:7;:5;:7::i;:::-;:23;;;7078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39621:6:::1;39600:18;:27;;;;39525:110:::0;:::o;35035:32::-;;;;:::o;30969:43::-;;;;:::o;25326:214::-;25468:4;25497:18;:25;25516:5;25497:25;;;;;;;;;;;;;;;:35;25523:8;25497:35;;;;;;;;;;;;;;;;;;;;;;;;;25490:42;;25326:214;;;;:::o;38935:478::-;7097:12;:10;:12::i;:::-;7086:23;;:7;:5;:7::i;:::-;:23;;;7078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39074:1:::1;39060:11;:15;39052:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;39135:13;;39120:11;:28;;39112:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39219:10;;39205:11;39189:13;;:27;;;;:::i;:::-;:40;39181:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;39312:9;;39297:11;39281:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;39273:49;;;::::0;::::1;;39333:33;39343:9;39354:11;39333:9;:33::i;:::-;39394:11;39377:13;;:28;;;;;;;:::i;:::-;;;;;;;;38935:478:::0;;:::o;7775:201::-;7097:12;:10;:12::i;:::-;7086:23;;:7;:5;:7::i;:::-;:23;;;7078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7884:1:::1;7864:22;;:8;:22;;;;7856:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7940:28;7959:8;7940:18;:28::i;:::-;7775:201:::0;:::o;15451:157::-;15536:4;15575:25;15560:40;;;:11;:40;;;;15553:47;;15451:157;;;:::o;6240:98::-;6293:7;6320:10;6313:17;;6240:98;:::o;26698:111::-;26755:4;26789:12;;26779:7;:22;26772:29;;26698:111;;;:::o;30765:196::-;30907:2;30880:15;:24;30896:7;30880:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30945:7;30941:2;30925:28;;30934:5;30925:28;;;;;;;;;;;;30765:196;;;:::o;28938:1709::-;29053:35;29091:20;29103:7;29091:11;:20::i;:::-;29053:58;;29124:22;29166:13;:18;;;29150:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;29225:12;:10;:12::i;:::-;29201:36;;:20;29213:7;29201:11;:20::i;:::-;:36;;;29150:87;:154;;;;29254:50;29271:13;:18;;;29291:12;:10;:12::i;:::-;29254:16;:50::i;:::-;29150:154;29124:181;;29340:17;29318:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;29492:4;29470:26;;:13;:18;;;:26;;;29448:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;29595:1;29581:16;;:2;:16;;;;29573:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;29652:43;29674:4;29680:2;29684:7;29693:1;29652:21;:43::i;:::-;29760:49;29777:1;29781:7;29790:13;:18;;;29760:8;:49::i;:::-;29852:1;29822:12;:18;29835:4;29822:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29892:1;29864:12;:16;29877:2;29864:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29927:43;;;;;;;;29942:2;29927:43;;;;;;29953:15;29927:43;;;;;29904:11;:20;29916:7;29904:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30210:19;30242:1;30232:7;:11;;;;:::i;:::-;30210:33;;30299:1;30258:43;;:11;:24;30270:11;30258:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;30254:288;;;30322:20;30330:11;30322:7;:20::i;:::-;30318:213;;;30390:125;;;;;;;;30427:13;:18;;;30390:125;;;;;;30468:13;:28;;;30390:125;;;;;30363:11;:24;30375:11;30363:24;;;;;;;;;;;:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30318:213;30254:288;30578:7;30574:2;30559:27;;30568:4;30559:27;;;;;;;;;;;;30597:42;30618:4;30624:2;30628:7;30637:1;30597:20;:42::i;:::-;28938:1709;;;;;;:::o;21950:682::-;22038:21;;:::i;:::-;22085:16;22093:7;22085;:16::i;:::-;22077:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;22161:26;22213:12;22202:7;:23;22198:103;;22288:1;22273:12;22263:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;22242:47;;22198:103;22318:12;22333:7;22318:22;;22313:242;22350:18;22342:4;:26;22313:242;;22393:31;22427:11;:17;22439:4;22427:17;;;;;;;;;;;22393:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22489:1;22463:28;;:9;:14;;;:28;;;22459:85;;22519:9;22512:16;;;;;;;22459:85;22313:242;22370:6;;;;;:::i;:::-;;;;22313:242;;;;22567:57;;;;;;;;;;:::i;:::-;;;;;;;;21950:682;;;;:::o;8136:191::-;8210:16;8229:6;;;;;;;;;;;8210:25;;8255:8;8246:6;;:17;;;;;;;;;;;;;;;;;;8310:8;8279:40;;8300:8;8279:40;;;;;;;;;;;;8136:191;;:::o;26817:104::-;26886:27;26896:2;26900:8;26886:27;;;;;;;;;;;;:9;:27::i;:::-;26817:104;;:::o;15976:190::-;16101:4;16154;16125:25;16138:5;16145:4;16125:12;:25::i;:::-;:33;16118:40;;15976:190;;;;;:::o;32640:985::-;32795:4;32816:15;:2;:13;;;:15::i;:::-;32812:806;;;32885:2;32869:36;;;32928:12;:10;:12::i;:::-;32963:4;32990:7;33020:5;32869:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32848:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33248:1;33231:6;:13;:18;33227:321;;;33274:109;;;;;;;;;;:::i;:::-;;;;;;;;33227:321;33498:6;33492:13;33483:6;33479:2;33475:15;33468:38;32848:715;33118:45;;;33108:55;;;:6;:55;;;;33101:62;;;;;32812:806;33602:4;33595:11;;32640:985;;;;;;;:::o;36101:108::-;36161:13;36194:7;36187:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36101:108;:::o;250:723::-;306:13;536:1;527:5;:10;523:53;;;554:10;;;;;;;;;;;;;;;;;;;;;523:53;586:12;601:5;586:20;;617:14;642:78;657:1;649:4;:9;642:78;;675:8;;;;;:::i;:::-;;;;706:2;698:10;;;;;:::i;:::-;;;642:78;;;730:19;762:6;752:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;730:39;;780:154;796:1;787:5;:10;780:154;;824:1;814:11;;;;;:::i;:::-;;;891:2;883:5;:10;;;;:::i;:::-;870:2;:24;;;;:::i;:::-;857:39;;840:6;847;840:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;920:2;911:11;;;;;:::i;:::-;;;780:154;;;958:6;944:21;;;;;250:723;;;;:::o;34113:159::-;;;;;:::o;34684:158::-;;;;;:::o;27284:1400::-;27407:20;27430:12;;27407:35;;27475:1;27461:16;;:2;:16;;;;27453:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27660:21;27668:12;27660:7;:21::i;:::-;27659:22;27651:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;27746:12;27734:8;:24;;27726:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;27810:61;27840:1;27844:2;27848:12;27862:8;27810:21;:61::i;:::-;27884:30;27917:12;:16;27930:2;27917:16;;;;;;;;;;;;;;;27884:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27963:135;;;;;;;;28019:8;27989:11;:19;;;:39;;;;:::i;:::-;27963:135;;;;;;28078:8;28043:11;:24;;;:44;;;;:::i;:::-;27963:135;;;;;27944:12;:16;27957:2;27944:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28137:43;;;;;;;;28152:2;28137:43;;;;;;28163:15;28137:43;;;;;28109:11;:25;28121:12;28109:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28193:20;28216:12;28193:35;;28246:9;28241:325;28265:8;28261:1;:12;28241:325;;;28325:12;28321:2;28300:38;;28317:1;28300:38;;;;;;;;;;;;28379:59;28410:1;28414:2;28418:12;28432:5;28379:22;:59::i;:::-;28353:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;28540:14;;;;;:::i;:::-;;;;28275:3;;;;;:::i;:::-;;;;28241:325;;;;28593:12;28578;:27;;;;28616:60;28645:1;28649:2;28653:12;28667:8;28616:20;:60::i;:::-;27284:1400;;;;;;:::o;16528:813::-;16638:7;16663:20;16686:4;16663:27;;16706:9;16701:603;16725:5;:12;16721:1;:16;16701:603;;;16759:20;16782:5;16788:1;16782:8;;;;;;;;;;;;;;;;;;;;;;16759:31;;16825:12;16809;:28;16805:488;;17001:12;17015;16984:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16952:95;;;;;;16937:110;;16805:488;;;17231:12;17245;17214:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17182:95;;;;;;17167:110;;16805:488;16701:603;16739:3;;;;;:::i;:::-;;;;16701:603;;;;17321:12;17314:19;;;16528:813;;;;:::o;2064:196::-;2124:4;2141:12;2208:7;2196:20;2188:28;;2251:1;2244:4;:8;2237:15;;;2064:196;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;;;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:139::-;;1465:6;1452:20;1443:29;;1481:33;1508:5;1481:33;:::i;:::-;1433:87;;;;:::o;1526:137::-;;1609:6;1596:20;1587:29;;1625:32;1651:5;1625:32;:::i;:::-;1577:86;;;;:::o;1669:141::-;;1756:6;1750:13;1741:22;;1772:32;1798:5;1772:32;:::i;:::-;1731:79;;;;:::o;1829:271::-;;1933:3;1926:4;1918:6;1914:17;1910:27;1900:2;;1951:1;1948;1941:12;1900:2;1991:6;1978:20;2016:78;2090:3;2082:6;2075:4;2067:6;2063:17;2016:78;:::i;:::-;2007:87;;1890:210;;;;;:::o;2120:273::-;;2225:3;2218:4;2210:6;2206:17;2202:27;2192:2;;2243:1;2240;2233:12;2192:2;2283:6;2270:20;2308:79;2383:3;2375:6;2368:4;2360:6;2356:17;2308:79;:::i;:::-;2299:88;;2182:211;;;;;:::o;2399:139::-;;2483:6;2470:20;2461:29;;2499:33;2526:5;2499:33;:::i;:::-;2451:87;;;;:::o;2544:262::-;;2652:2;2640:9;2631:7;2627:23;2623:32;2620:2;;;2668:1;2665;2658:12;2620:2;2711:1;2736:53;2781:7;2772:6;2761:9;2757:22;2736:53;:::i;:::-;2726:63;;2682:117;2610:196;;;;:::o;2812:407::-;;;2937:2;2925:9;2916:7;2912:23;2908:32;2905:2;;;2953:1;2950;2943:12;2905:2;2996:1;3021:53;3066:7;3057:6;3046:9;3042:22;3021:53;:::i;:::-;3011:63;;2967:117;3123:2;3149:53;3194:7;3185:6;3174:9;3170:22;3149:53;:::i;:::-;3139:63;;3094:118;2895:324;;;;;:::o;3225:552::-;;;;3367:2;3355:9;3346:7;3342:23;3338:32;3335:2;;;3383:1;3380;3373:12;3335:2;3426:1;3451:53;3496:7;3487:6;3476:9;3472:22;3451:53;:::i;:::-;3441:63;;3397:117;3553:2;3579:53;3624:7;3615:6;3604:9;3600:22;3579:53;:::i;:::-;3569:63;;3524:118;3681:2;3707:53;3752:7;3743:6;3732:9;3728:22;3707:53;:::i;:::-;3697:63;;3652:118;3325:452;;;;;:::o;3783:809::-;;;;;3951:3;3939:9;3930:7;3926:23;3922:33;3919:2;;;3968:1;3965;3958:12;3919:2;4011:1;4036:53;4081:7;4072:6;4061:9;4057:22;4036:53;:::i;:::-;4026:63;;3982:117;4138:2;4164:53;4209:7;4200:6;4189:9;4185:22;4164:53;:::i;:::-;4154:63;;4109:118;4266:2;4292:53;4337:7;4328:6;4317:9;4313:22;4292:53;:::i;:::-;4282:63;;4237:118;4422:2;4411:9;4407:18;4394:32;4453:18;4445:6;4442:30;4439:2;;;4485:1;4482;4475:12;4439:2;4513:62;4567:7;4558:6;4547:9;4543:22;4513:62;:::i;:::-;4503:72;;4365:220;3909:683;;;;;;;:::o;4598:401::-;;;4720:2;4708:9;4699:7;4695:23;4691:32;4688:2;;;4736:1;4733;4726:12;4688:2;4779:1;4804:53;4849:7;4840:6;4829:9;4825:22;4804:53;:::i;:::-;4794:63;;4750:117;4906:2;4932:50;4974:7;4965:6;4954:9;4950:22;4932:50;:::i;:::-;4922:60;;4877:115;4678:321;;;;;:::o;5005:407::-;;;5130:2;5118:9;5109:7;5105:23;5101:32;5098:2;;;5146:1;5143;5136:12;5098:2;5189:1;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5160:117;5316:2;5342:53;5387:7;5378:6;5367:9;5363:22;5342:53;:::i;:::-;5332:63;;5287:118;5088:324;;;;;:::o;5418:570::-;;;;5578:2;5566:9;5557:7;5553:23;5549:32;5546:2;;;5594:1;5591;5584:12;5546:2;5665:1;5654:9;5650:17;5637:31;5695:18;5687:6;5684:30;5681:2;;;5727:1;5724;5717:12;5681:2;5763:80;5835:7;5826:6;5815:9;5811:22;5763:80;:::i;:::-;5745:98;;;;5608:245;5892:2;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5863:118;5536:452;;;;;:::o;5994:256::-;;6099:2;6087:9;6078:7;6074:23;6070:32;6067:2;;;6115:1;6112;6105:12;6067:2;6158:1;6183:50;6225:7;6216:6;6205:9;6201:22;6183:50;:::i;:::-;6173:60;;6129:114;6057:193;;;;:::o;6256:262::-;;6364:2;6352:9;6343:7;6339:23;6335:32;6332:2;;;6380:1;6377;6370:12;6332:2;6423:1;6448:53;6493:7;6484:6;6473:9;6469:22;6448:53;:::i;:::-;6438:63;;6394:117;6322:196;;;;:::o;6524:260::-;;6631:2;6619:9;6610:7;6606:23;6602:32;6599:2;;;6647:1;6644;6637:12;6599:2;6690:1;6715:52;6759:7;6750:6;6739:9;6735:22;6715:52;:::i;:::-;6705:62;;6661:116;6589:195;;;;:::o;6790:282::-;;6908:2;6896:9;6887:7;6883:23;6879:32;6876:2;;;6924:1;6921;6914:12;6876:2;6967:1;6992:63;7047:7;7038:6;7027:9;7023:22;6992:63;:::i;:::-;6982:73;;6938:127;6866:206;;;;:::o;7078:375::-;;7196:2;7184:9;7175:7;7171:23;7167:32;7164:2;;;7212:1;7209;7202:12;7164:2;7283:1;7272:9;7268:17;7255:31;7313:18;7305:6;7302:30;7299:2;;;7345:1;7342;7335:12;7299:2;7373:63;7428:7;7419:6;7408:9;7404:22;7373:63;:::i;:::-;7363:73;;7226:220;7154:299;;;;:::o;7459:262::-;;7567:2;7555:9;7546:7;7542:23;7538:32;7535:2;;;7583:1;7580;7573:12;7535:2;7626:1;7651:53;7696:7;7687:6;7676:9;7672:22;7651:53;:::i;:::-;7641:63;;7597:117;7525:196;;;;:::o;7727:407::-;;;7852:2;7840:9;7831:7;7827:23;7823:32;7820:2;;;7868:1;7865;7858:12;7820:2;7911:1;7936:53;7981:7;7972:6;7961:9;7957:22;7936:53;:::i;:::-;7926:63;;7882:117;8038:2;8064:53;8109:7;8100:6;8089:9;8085:22;8064:53;:::i;:::-;8054:63;;8009:118;7810:324;;;;;:::o;8140:179::-;;8230:46;8272:3;8264:6;8230:46;:::i;:::-;8308:4;8303:3;8299:14;8285:28;;8220:99;;;;:::o;8325:118::-;8412:24;8430:5;8412:24;:::i;:::-;8407:3;8400:37;8390:53;;:::o;8449:157::-;8554:45;8574:24;8592:5;8574:24;:::i;:::-;8554:45;:::i;:::-;8549:3;8542:58;8532:74;;:::o;8642:732::-;;8790:54;8838:5;8790:54;:::i;:::-;8860:86;8939:6;8934:3;8860:86;:::i;:::-;8853:93;;8970:56;9020:5;8970:56;:::i;:::-;9049:7;9080:1;9065:284;9090:6;9087:1;9084:13;9065:284;;;9166:6;9160:13;9193:63;9252:3;9237:13;9193:63;:::i;:::-;9186:70;;9279:60;9332:6;9279:60;:::i;:::-;9269:70;;9125:224;9112:1;9109;9105:9;9100:14;;9065:284;;;9069:14;9365:3;9358:10;;8766:608;;;;;;;:::o;9380:109::-;9461:21;9476:5;9461:21;:::i;:::-;9456:3;9449:34;9439:50;;:::o;9495:118::-;9582:24;9600:5;9582:24;:::i;:::-;9577:3;9570:37;9560:53;;:::o;9619:157::-;9724:45;9744:24;9762:5;9744:24;:::i;:::-;9724:45;:::i;:::-;9719:3;9712:58;9702:74;;:::o;9782:360::-;;9896:38;9928:5;9896:38;:::i;:::-;9950:70;10013:6;10008:3;9950:70;:::i;:::-;9943:77;;10029:52;10074:6;10069:3;10062:4;10055:5;10051:16;10029:52;:::i;:::-;10106:29;10128:6;10106:29;:::i;:::-;10101:3;10097:39;10090:46;;9872:270;;;;;:::o;10148:364::-;;10264:39;10297:5;10264:39;:::i;:::-;10319:71;10383:6;10378:3;10319:71;:::i;:::-;10312:78;;10399:52;10444:6;10439:3;10432:4;10425:5;10421:16;10399:52;:::i;:::-;10476:29;10498:6;10476:29;:::i;:::-;10471:3;10467:39;10460:46;;10240:272;;;;;:::o;10518:377::-;;10652:39;10685:5;10652:39;:::i;:::-;10707:89;10789:6;10784:3;10707:89;:::i;:::-;10700:96;;10805:52;10850:6;10845:3;10838:4;10831:5;10827:16;10805:52;:::i;:::-;10882:6;10877:3;10873:16;10866:23;;10628:267;;;;;:::o;10901:366::-;;11064:67;11128:2;11123:3;11064:67;:::i;:::-;11057:74;;11140:93;11229:3;11140:93;:::i;:::-;11258:2;11253:3;11249:12;11242:19;;11047:220;;;:::o;11273:366::-;;11436:67;11500:2;11495:3;11436:67;:::i;:::-;11429:74;;11512:93;11601:3;11512:93;:::i;:::-;11630:2;11625:3;11621:12;11614:19;;11419:220;;;:::o;11645:366::-;;11808:67;11872:2;11867:3;11808:67;:::i;:::-;11801:74;;11884:93;11973:3;11884:93;:::i;:::-;12002:2;11997:3;11993:12;11986:19;;11791:220;;;:::o;12017:366::-;;12180:67;12244:2;12239:3;12180:67;:::i;:::-;12173:74;;12256:93;12345:3;12256:93;:::i;:::-;12374:2;12369:3;12365:12;12358:19;;12163:220;;;:::o;12389:366::-;;12552:67;12616:2;12611:3;12552:67;:::i;:::-;12545:74;;12628:93;12717:3;12628:93;:::i;:::-;12746:2;12741:3;12737:12;12730:19;;12535:220;;;:::o;12761:366::-;;12924:67;12988:2;12983:3;12924:67;:::i;:::-;12917:74;;13000:93;13089:3;13000:93;:::i;:::-;13118:2;13113:3;13109:12;13102:19;;12907:220;;;:::o;13133:366::-;;13296:67;13360:2;13355:3;13296:67;:::i;:::-;13289:74;;13372:93;13461:3;13372:93;:::i;:::-;13490:2;13485:3;13481:12;13474:19;;13279:220;;;:::o;13505:366::-;;13668:67;13732:2;13727:3;13668:67;:::i;:::-;13661:74;;13744:93;13833:3;13744:93;:::i;:::-;13862:2;13857:3;13853:12;13846:19;;13651:220;;;:::o;13877:366::-;;14040:67;14104:2;14099:3;14040:67;:::i;:::-;14033:74;;14116:93;14205:3;14116:93;:::i;:::-;14234:2;14229:3;14225:12;14218:19;;14023:220;;;:::o;14249:366::-;;14412:67;14476:2;14471:3;14412:67;:::i;:::-;14405:74;;14488:93;14577:3;14488:93;:::i;:::-;14606:2;14601:3;14597:12;14590:19;;14395:220;;;:::o;14621:366::-;;14784:67;14848:2;14843:3;14784:67;:::i;:::-;14777:74;;14860:93;14949:3;14860:93;:::i;:::-;14978:2;14973:3;14969:12;14962:19;;14767:220;;;:::o;14993:366::-;;15156:67;15220:2;15215:3;15156:67;:::i;:::-;15149:74;;15232:93;15321:3;15232:93;:::i;:::-;15350:2;15345:3;15341:12;15334:19;;15139:220;;;:::o;15365:366::-;;15528:67;15592:2;15587:3;15528:67;:::i;:::-;15521:74;;15604:93;15693:3;15604:93;:::i;:::-;15722:2;15717:3;15713:12;15706:19;;15511:220;;;:::o;15737:366::-;;15900:67;15964:2;15959:3;15900:67;:::i;:::-;15893:74;;15976:93;16065:3;15976:93;:::i;:::-;16094:2;16089:3;16085:12;16078:19;;15883:220;;;:::o;16109:366::-;;16272:67;16336:2;16331:3;16272:67;:::i;:::-;16265:74;;16348:93;16437:3;16348:93;:::i;:::-;16466:2;16461:3;16457:12;16450:19;;16255:220;;;:::o;16481:368::-;;16644:68;16708:3;16703;16644:68;:::i;:::-;16637:75;;16721:93;16810:3;16721:93;:::i;:::-;16839:3;16834;16830:13;16823:20;;16627:222;;;:::o;16855:366::-;;17018:67;17082:2;17077:3;17018:67;:::i;:::-;17011:74;;17094:93;17183:3;17094:93;:::i;:::-;17212:2;17207:3;17203:12;17196:19;;17001:220;;;:::o;17227:366::-;;17390:67;17454:2;17449:3;17390:67;:::i;:::-;17383:74;;17466:93;17555:3;17466:93;:::i;:::-;17584:2;17579:3;17575:12;17568:19;;17373:220;;;:::o;17599:366::-;;17762:67;17826:2;17821:3;17762:67;:::i;:::-;17755:74;;17838:93;17927:3;17838:93;:::i;:::-;17956:2;17951:3;17947:12;17940:19;;17745:220;;;:::o;17971:366::-;;18134:67;18198:2;18193:3;18134:67;:::i;:::-;18127:74;;18210:93;18299:3;18210:93;:::i;:::-;18328:2;18323:3;18319:12;18312:19;;18117:220;;;:::o;18343:366::-;;18506:67;18570:2;18565:3;18506:67;:::i;:::-;18499:74;;18582:93;18671:3;18582:93;:::i;:::-;18700:2;18695:3;18691:12;18684:19;;18489:220;;;:::o;18715:366::-;;18878:67;18942:2;18937:3;18878:67;:::i;:::-;18871:74;;18954:93;19043:3;18954:93;:::i;:::-;19072:2;19067:3;19063:12;19056:19;;18861:220;;;:::o;19087:366::-;;19250:67;19314:2;19309:3;19250:67;:::i;:::-;19243:74;;19326:93;19415:3;19326:93;:::i;:::-;19444:2;19439:3;19435:12;19428:19;;19233:220;;;:::o;19459:366::-;;19622:67;19686:2;19681:3;19622:67;:::i;:::-;19615:74;;19698:93;19787:3;19698:93;:::i;:::-;19816:2;19811:3;19807:12;19800:19;;19605:220;;;:::o;19831:366::-;;19994:67;20058:2;20053:3;19994:67;:::i;:::-;19987:74;;20070:93;20159:3;20070:93;:::i;:::-;20188:2;20183:3;20179:12;20172:19;;19977:220;;;:::o;20203:366::-;;20366:67;20430:2;20425:3;20366:67;:::i;:::-;20359:74;;20442:93;20531:3;20442:93;:::i;:::-;20560:2;20555:3;20551:12;20544:19;;20349:220;;;:::o;20575:366::-;;20738:67;20802:2;20797:3;20738:67;:::i;:::-;20731:74;;20814:93;20903:3;20814:93;:::i;:::-;20932:2;20927:3;20923:12;20916:19;;20721:220;;;:::o;20947:366::-;;21110:67;21174:2;21169:3;21110:67;:::i;:::-;21103:74;;21186:93;21275:3;21186:93;:::i;:::-;21304:2;21299:3;21295:12;21288:19;;21093:220;;;:::o;21319:366::-;;21482:67;21546:2;21541:3;21482:67;:::i;:::-;21475:74;;21558:93;21647:3;21558:93;:::i;:::-;21676:2;21671:3;21667:12;21660:19;;21465:220;;;:::o;21691:366::-;;21854:67;21918:2;21913:3;21854:67;:::i;:::-;21847:74;;21930:93;22019:3;21930:93;:::i;:::-;22048:2;22043:3;22039:12;22032:19;;21837:220;;;:::o;22063:366::-;;22226:67;22290:2;22285:3;22226:67;:::i;:::-;22219:74;;22302:93;22391:3;22302:93;:::i;:::-;22420:2;22415:3;22411:12;22404:19;;22209:220;;;:::o;22435:108::-;22512:24;22530:5;22512:24;:::i;:::-;22507:3;22500:37;22490:53;;:::o;22549:118::-;22636:24;22654:5;22636:24;:::i;:::-;22631:3;22624:37;22614:53;;:::o;22673:256::-;;22800:75;22871:3;22862:6;22800:75;:::i;:::-;22900:2;22895:3;22891:12;22884:19;;22920:3;22913:10;;22789:140;;;;:::o;22935:397::-;;23090:75;23161:3;23152:6;23090:75;:::i;:::-;23190:2;23185:3;23181:12;23174:19;;23203:75;23274:3;23265:6;23203:75;:::i;:::-;23303:2;23298:3;23294:12;23287:19;;23323:3;23316:10;;23079:253;;;;;:::o;23338:435::-;;23540:95;23631:3;23622:6;23540:95;:::i;:::-;23533:102;;23652:95;23743:3;23734:6;23652:95;:::i;:::-;23645:102;;23764:3;23757:10;;23522:251;;;;;:::o;23779:222::-;;23910:2;23899:9;23895:18;23887:26;;23923:71;23991:1;23980:9;23976:17;23967:6;23923:71;:::i;:::-;23877:124;;;;:::o;24007:640::-;;24240:3;24229:9;24225:19;24217:27;;24254:71;24322:1;24311:9;24307:17;24298:6;24254:71;:::i;:::-;24335:72;24403:2;24392:9;24388:18;24379:6;24335:72;:::i;:::-;24417;24485:2;24474:9;24470:18;24461:6;24417:72;:::i;:::-;24536:9;24530:4;24526:20;24521:2;24510:9;24506:18;24499:48;24564:76;24635:4;24626:6;24564:76;:::i;:::-;24556:84;;24207:440;;;;;;;:::o;24653:373::-;;24834:2;24823:9;24819:18;24811:26;;24883:9;24877:4;24873:20;24869:1;24858:9;24854:17;24847:47;24911:108;25014:4;25005:6;24911:108;:::i;:::-;24903:116;;24801:225;;;;:::o;25032:210::-;;25157:2;25146:9;25142:18;25134:26;;25170:65;25232:1;25221:9;25217:17;25208:6;25170:65;:::i;:::-;25124:118;;;;:::o;25248:222::-;;25379:2;25368:9;25364:18;25356:26;;25392:71;25460:1;25449:9;25445:17;25436:6;25392:71;:::i;:::-;25346:124;;;;:::o;25476:313::-;;25627:2;25616:9;25612:18;25604:26;;25676:9;25670:4;25666:20;25662:1;25651:9;25647:17;25640:47;25704:78;25777:4;25768:6;25704:78;:::i;:::-;25696:86;;25594:195;;;;:::o;25795:419::-;;25999:2;25988:9;25984:18;25976:26;;26048:9;26042:4;26038:20;26034:1;26023:9;26019:17;26012:47;26076:131;26202:4;26076:131;:::i;:::-;26068:139;;25966:248;;;:::o;26220:419::-;;26424:2;26413:9;26409:18;26401:26;;26473:9;26467:4;26463:20;26459:1;26448:9;26444:17;26437:47;26501:131;26627:4;26501:131;:::i;:::-;26493:139;;26391:248;;;:::o;26645:419::-;;26849:2;26838:9;26834:18;26826:26;;26898:9;26892:4;26888:20;26884:1;26873:9;26869:17;26862:47;26926:131;27052:4;26926:131;:::i;:::-;26918:139;;26816:248;;;:::o;27070:419::-;;27274:2;27263:9;27259:18;27251:26;;27323:9;27317:4;27313:20;27309:1;27298:9;27294:17;27287:47;27351:131;27477:4;27351:131;:::i;:::-;27343:139;;27241:248;;;:::o;27495:419::-;;27699:2;27688:9;27684:18;27676:26;;27748:9;27742:4;27738:20;27734:1;27723:9;27719:17;27712:47;27776:131;27902:4;27776:131;:::i;:::-;27768:139;;27666:248;;;:::o;27920:419::-;;28124:2;28113:9;28109:18;28101:26;;28173:9;28167:4;28163:20;28159:1;28148:9;28144:17;28137:47;28201:131;28327:4;28201:131;:::i;:::-;28193:139;;28091:248;;;:::o;28345:419::-;;28549:2;28538:9;28534:18;28526:26;;28598:9;28592:4;28588:20;28584:1;28573:9;28569:17;28562:47;28626:131;28752:4;28626:131;:::i;:::-;28618:139;;28516:248;;;:::o;28770:419::-;;28974:2;28963:9;28959:18;28951:26;;29023:9;29017:4;29013:20;29009:1;28998:9;28994:17;28987:47;29051:131;29177:4;29051:131;:::i;:::-;29043:139;;28941:248;;;:::o;29195:419::-;;29399:2;29388:9;29384:18;29376:26;;29448:9;29442:4;29438:20;29434:1;29423:9;29419:17;29412:47;29476:131;29602:4;29476:131;:::i;:::-;29468:139;;29366:248;;;:::o;29620:419::-;;29824:2;29813:9;29809:18;29801:26;;29873:9;29867:4;29863:20;29859:1;29848:9;29844:17;29837:47;29901:131;30027:4;29901:131;:::i;:::-;29893:139;;29791:248;;;:::o;30045:419::-;;30249:2;30238:9;30234:18;30226:26;;30298:9;30292:4;30288:20;30284:1;30273:9;30269:17;30262:47;30326:131;30452:4;30326:131;:::i;:::-;30318:139;;30216:248;;;:::o;30470:419::-;;30674:2;30663:9;30659:18;30651:26;;30723:9;30717:4;30713:20;30709:1;30698:9;30694:17;30687:47;30751:131;30877:4;30751:131;:::i;:::-;30743:139;;30641:248;;;:::o;30895:419::-;;31099:2;31088:9;31084:18;31076:26;;31148:9;31142:4;31138:20;31134:1;31123:9;31119:17;31112:47;31176:131;31302:4;31176:131;:::i;:::-;31168:139;;31066:248;;;:::o;31320:419::-;;31524:2;31513:9;31509:18;31501:26;;31573:9;31567:4;31563:20;31559:1;31548:9;31544:17;31537:47;31601:131;31727:4;31601:131;:::i;:::-;31593:139;;31491:248;;;:::o;31745:419::-;;31949:2;31938:9;31934:18;31926:26;;31998:9;31992:4;31988:20;31984:1;31973:9;31969:17;31962:47;32026:131;32152:4;32026:131;:::i;:::-;32018:139;;31916:248;;;:::o;32170:419::-;;32374:2;32363:9;32359:18;32351:26;;32423:9;32417:4;32413:20;32409:1;32398:9;32394:17;32387:47;32451:131;32577:4;32451:131;:::i;:::-;32443:139;;32341:248;;;:::o;32595:419::-;;32799:2;32788:9;32784:18;32776:26;;32848:9;32842:4;32838:20;32834:1;32823:9;32819:17;32812:47;32876:131;33002:4;32876:131;:::i;:::-;32868:139;;32766:248;;;:::o;33020:419::-;;33224:2;33213:9;33209:18;33201:26;;33273:9;33267:4;33263:20;33259:1;33248:9;33244:17;33237:47;33301:131;33427:4;33301:131;:::i;:::-;33293:139;;33191:248;;;:::o;33445:419::-;;33649:2;33638:9;33634:18;33626:26;;33698:9;33692:4;33688:20;33684:1;33673:9;33669:17;33662:47;33726:131;33852:4;33726:131;:::i;:::-;33718:139;;33616:248;;;:::o;33870:419::-;;34074:2;34063:9;34059:18;34051:26;;34123:9;34117:4;34113:20;34109:1;34098:9;34094:17;34087:47;34151:131;34277:4;34151:131;:::i;:::-;34143:139;;34041:248;;;:::o;34295:419::-;;34499:2;34488:9;34484:18;34476:26;;34548:9;34542:4;34538:20;34534:1;34523:9;34519:17;34512:47;34576:131;34702:4;34576:131;:::i;:::-;34568:139;;34466:248;;;:::o;34720:419::-;;34924:2;34913:9;34909:18;34901:26;;34973:9;34967:4;34963:20;34959:1;34948:9;34944:17;34937:47;35001:131;35127:4;35001:131;:::i;:::-;34993:139;;34891:248;;;:::o;35145:419::-;;35349:2;35338:9;35334:18;35326:26;;35398:9;35392:4;35388:20;35384:1;35373:9;35369:17;35362:47;35426:131;35552:4;35426:131;:::i;:::-;35418:139;;35316:248;;;:::o;35570:419::-;;35774:2;35763:9;35759:18;35751:26;;35823:9;35817:4;35813:20;35809:1;35798:9;35794:17;35787:47;35851:131;35977:4;35851:131;:::i;:::-;35843:139;;35741:248;;;:::o;35995:419::-;;36199:2;36188:9;36184:18;36176:26;;36248:9;36242:4;36238:20;36234:1;36223:9;36219:17;36212:47;36276:131;36402:4;36276:131;:::i;:::-;36268:139;;36166:248;;;:::o;36420:419::-;;36624:2;36613:9;36609:18;36601:26;;36673:9;36667:4;36663:20;36659:1;36648:9;36644:17;36637:47;36701:131;36827:4;36701:131;:::i;:::-;36693:139;;36591:248;;;:::o;36845:419::-;;37049:2;37038:9;37034:18;37026:26;;37098:9;37092:4;37088:20;37084:1;37073:9;37069:17;37062:47;37126:131;37252:4;37126:131;:::i;:::-;37118:139;;37016:248;;;:::o;37270:419::-;;37474:2;37463:9;37459:18;37451:26;;37523:9;37517:4;37513:20;37509:1;37498:9;37494:17;37487:47;37551:131;37677:4;37551:131;:::i;:::-;37543:139;;37441:248;;;:::o;37695:419::-;;37899:2;37888:9;37884:18;37876:26;;37948:9;37942:4;37938:20;37934:1;37923:9;37919:17;37912:47;37976:131;38102:4;37976:131;:::i;:::-;37968:139;;37866:248;;;:::o;38120:419::-;;38324:2;38313:9;38309:18;38301:26;;38373:9;38367:4;38363:20;38359:1;38348:9;38344:17;38337:47;38401:131;38527:4;38401:131;:::i;:::-;38393:139;;38291:248;;;:::o;38545:419::-;;38749:2;38738:9;38734:18;38726:26;;38798:9;38792:4;38788:20;38784:1;38773:9;38769:17;38762:47;38826:131;38952:4;38826:131;:::i;:::-;38818:139;;38716:248;;;:::o;38970:222::-;;39101:2;39090:9;39086:18;39078:26;;39114:71;39182:1;39171:9;39167:17;39158:6;39114:71;:::i;:::-;39068:124;;;;:::o;39198:129::-;;39259:20;;:::i;:::-;39249:30;;39288:33;39316:4;39308:6;39288:33;:::i;:::-;39239:88;;;:::o;39333:75::-;;39399:2;39393:9;39383:19;;39373:35;:::o;39414:307::-;;39565:18;39557:6;39554:30;39551:2;;;39587:18;;:::i;:::-;39551:2;39625:29;39647:6;39625:29;:::i;:::-;39617:37;;39709:4;39703;39699:15;39691:23;;39480:241;;;:::o;39727:308::-;;39879:18;39871:6;39868:30;39865:2;;;39901:18;;:::i;:::-;39865:2;39939:29;39961:6;39939:29;:::i;:::-;39931:37;;40023:4;40017;40013:15;40005:23;;39794:241;;;:::o;40041:132::-;;40131:3;40123:11;;40161:4;40156:3;40152:14;40144:22;;40113:60;;;:::o;40179:114::-;;40280:5;40274:12;40264:22;;40253:40;;;:::o;40299:98::-;;40384:5;40378:12;40368:22;;40357:40;;;:::o;40403:99::-;;40489:5;40483:12;40473:22;;40462:40;;;:::o;40508:113::-;;40610:4;40605:3;40601:14;40593:22;;40583:38;;;:::o;40627:184::-;;40760:6;40755:3;40748:19;40800:4;40795:3;40791:14;40776:29;;40738:73;;;;:::o;40817:168::-;;40934:6;40929:3;40922:19;40974:4;40969:3;40965:14;40950:29;;40912:73;;;;:::o;40991:169::-;;41109:6;41104:3;41097:19;41149:4;41144:3;41140:14;41125:29;;41087:73;;;;:::o;41166:148::-;;41305:3;41290:18;;41280:34;;;;:::o;41320:273::-;;41379:20;41397:1;41379:20;:::i;:::-;41374:25;;41413:20;41431:1;41413:20;:::i;:::-;41408:25;;41535:1;41499:34;41495:42;41492:1;41489:49;41486:2;;;41541:18;;:::i;:::-;41486:2;41585:1;41582;41578:9;41571:16;;41364:229;;;;:::o;41599:305::-;;41658:20;41676:1;41658:20;:::i;:::-;41653:25;;41692:20;41710:1;41692:20;:::i;:::-;41687:25;;41846:1;41778:66;41774:74;41771:1;41768:81;41765:2;;;41852:18;;:::i;:::-;41765:2;41896:1;41893;41889:9;41882:16;;41643:261;;;;:::o;41910:185::-;;41967:20;41985:1;41967:20;:::i;:::-;41962:25;;42001:20;42019:1;42001:20;:::i;:::-;41996:25;;42040:1;42030:2;;42045:18;;:::i;:::-;42030:2;42087:1;42084;42080:9;42075:14;;41952:143;;;;:::o;42101:348::-;;42164:20;42182:1;42164:20;:::i;:::-;42159:25;;42198:20;42216:1;42198:20;:::i;:::-;42193:25;;42386:1;42318:66;42314:74;42311:1;42308:81;42303:1;42296:9;42289:17;42285:105;42282:2;;;42393:18;;:::i;:::-;42282:2;42441:1;42438;42434:9;42423:20;;42149:300;;;;:::o;42455:191::-;;42515:20;42533:1;42515:20;:::i;:::-;42510:25;;42549:20;42567:1;42549:20;:::i;:::-;42544:25;;42588:1;42585;42582:8;42579:2;;;42593:18;;:::i;:::-;42579:2;42638:1;42635;42631:9;42623:17;;42500:146;;;;:::o;42652:191::-;;42712:20;42730:1;42712:20;:::i;:::-;42707:25;;42746:20;42764:1;42746:20;:::i;:::-;42741:25;;42785:1;42782;42779:8;42776:2;;;42790:18;;:::i;:::-;42776:2;42835:1;42832;42828:9;42820:17;;42697:146;;;;:::o;42849:96::-;;42915:24;42933:5;42915:24;:::i;:::-;42904:35;;42894:51;;;:::o;42951:90::-;;43028:5;43021:13;43014:21;43003:32;;42993:48;;;:::o;43047:77::-;;43113:5;43102:16;;43092:32;;;:::o;43130:149::-;;43206:66;43199:5;43195:78;43184:89;;43174:105;;;:::o;43285:118::-;;43362:34;43355:5;43351:46;43340:57;;43330:73;;;:::o;43409:126::-;;43486:42;43479:5;43475:54;43464:65;;43454:81;;;:::o;43541:77::-;;43607:5;43596:16;;43586:32;;;:::o;43624:154::-;43708:6;43703:3;43698;43685:30;43770:1;43761:6;43756:3;43752:16;43745:27;43675:103;;;:::o;43784:307::-;43852:1;43862:113;43876:6;43873:1;43870:13;43862:113;;;43961:1;43956:3;43952:11;43946:18;43942:1;43937:3;43933:11;43926:39;43898:2;43895:1;43891:10;43886:15;;43862:113;;;43993:6;43990:1;43987:13;43984:2;;;44073:1;44064:6;44059:3;44055:16;44048:27;43984:2;43833:258;;;;:::o;44097:171::-;;44159:24;44177:5;44159:24;:::i;:::-;44150:33;;44205:4;44198:5;44195:15;44192:2;;;44213:18;;:::i;:::-;44192:2;44260:1;44253:5;44249:13;44242:20;;44140:128;;;:::o;44274:320::-;;44355:1;44349:4;44345:12;44335:22;;44402:1;44396:4;44392:12;44423:18;44413:2;;44479:4;44471:6;44467:17;44457:27;;44413:2;44541;44533:6;44530:14;44510:18;44507:38;44504:2;;;44560:18;;:::i;:::-;44504:2;44325:269;;;;:::o;44600:281::-;44683:27;44705:4;44683:27;:::i;:::-;44675:6;44671:40;44813:6;44801:10;44798:22;44777:18;44765:10;44762:34;44759:62;44756:2;;;44824:18;;:::i;:::-;44756:2;44864:10;44860:2;44853:22;44643:238;;;:::o;44887:233::-;;44949:24;44967:5;44949:24;:::i;:::-;44940:33;;44995:66;44988:5;44985:77;44982:2;;;45065:18;;:::i;:::-;44982:2;45112:1;45105:5;45101:13;45094:20;;44930:190;;;:::o;45126:100::-;;45194:26;45214:5;45194:26;:::i;:::-;45183:37;;45173:53;;;:::o;45232:79::-;;45300:5;45289:16;;45279:32;;;:::o;45317:94::-;;45385:20;45399:5;45385:20;:::i;:::-;45374:31;;45364:47;;;:::o;45417:176::-;;45466:20;45484:1;45466:20;:::i;:::-;45461:25;;45500:20;45518:1;45500:20;:::i;:::-;45495:25;;45539:1;45529:2;;45544:18;;:::i;:::-;45529:2;45585:1;45582;45578:9;45573:14;;45451:142;;;;:::o;45599:180::-;45647:77;45644:1;45637:88;45744:4;45741:1;45734:15;45768:4;45765:1;45758:15;45785:180;45833:77;45830:1;45823:88;45930:4;45927:1;45920:15;45954:4;45951:1;45944:15;45971:180;46019:77;46016:1;46009:88;46116:4;46113:1;46106:15;46140:4;46137:1;46130:15;46157:180;46205:77;46202:1;46195:88;46302:4;46299:1;46292:15;46326:4;46323:1;46316:15;46343:102;;46435:2;46431:7;46426:2;46419:5;46415:14;46411:28;46401:38;;46391:54;;;:::o;46451:94::-;;46532:5;46528:2;46524:14;46503:35;;46493:52;;;:::o;46551:221::-;46691:34;46687:1;46679:6;46675:14;46668:58;46760:4;46755:2;46747:6;46743:15;46736:29;46657:115;:::o;46778:225::-;46918:34;46914:1;46906:6;46902:14;46895:58;46987:8;46982:2;46974:6;46970:15;46963:33;46884:119;:::o;47009:229::-;47149:34;47145:1;47137:6;47133:14;47126:58;47218:12;47213:2;47205:6;47201:15;47194:37;47115:123;:::o;47244:222::-;47384:34;47380:1;47372:6;47368:14;47361:58;47453:5;47448:2;47440:6;47436:15;47429:30;47350:116;:::o;47472:224::-;47612:34;47608:1;47600:6;47596:14;47589:58;47681:7;47676:2;47668:6;47664:15;47657:32;47578:118;:::o;47702:244::-;47842:34;47838:1;47830:6;47826:14;47819:58;47911:27;47906:2;47898:6;47894:15;47887:52;47808:138;:::o;47952:230::-;48092:34;48088:1;48080:6;48076:14;48069:58;48161:13;48156:2;48148:6;48144:15;48137:38;48058:124;:::o;48188:225::-;48328:34;48324:1;48316:6;48312:14;48305:58;48397:8;48392:2;48384:6;48380:15;48373:33;48294:119;:::o;48419:182::-;48559:34;48555:1;48547:6;48543:14;48536:58;48525:76;:::o;48607:172::-;48747:24;48743:1;48735:6;48731:14;48724:48;48713:66;:::o;48785:234::-;48925:34;48921:1;48913:6;48909:14;48902:58;48994:17;48989:2;48981:6;48977:15;48970:42;48891:128;:::o;49025:176::-;49165:28;49161:1;49153:6;49149:14;49142:52;49131:70;:::o;49207:237::-;49347:34;49343:1;49335:6;49331:14;49324:58;49416:20;49411:2;49403:6;49399:15;49392:45;49313:131;:::o;49450:220::-;49590:34;49586:1;49578:6;49574:14;49567:58;49659:3;49654:2;49646:6;49642:15;49635:28;49556:114;:::o;49676:167::-;49816:19;49812:1;49804:6;49800:14;49793:43;49782:61;:::o;49849:362::-;49989:34;49985:1;49977:6;49973:14;49966:58;50058:34;50053:2;50045:6;50041:15;50034:59;50127:34;50122:2;50114:6;50110:15;50103:59;50196:7;50191:2;50183:6;50179:15;50172:32;49955:256;:::o;50217:178::-;50357:30;50353:1;50345:6;50341:14;50334:54;50323:72;:::o;50401:174::-;50541:26;50537:1;50529:6;50525:14;50518:50;50507:68;:::o;50581:221::-;50721:34;50717:1;50709:6;50705:14;50698:58;50790:4;50785:2;50777:6;50773:15;50766:29;50687:115;:::o;50808:165::-;50948:17;50944:1;50936:6;50932:14;50925:41;50914:59;:::o;50979:168::-;51119:20;51115:1;51107:6;51103:14;51096:44;51085:62;:::o;51153:238::-;51293:34;51289:1;51281:6;51277:14;51270:58;51362:21;51357:2;51349:6;51345:15;51338:46;51259:132;:::o;51397:179::-;51537:31;51533:1;51525:6;51521:14;51514:55;51503:73;:::o;51582:220::-;51722:34;51718:1;51710:6;51706:14;51699:58;51791:3;51786:2;51778:6;51774:15;51767:28;51688:114;:::o;51808:233::-;51948:34;51944:1;51936:6;51932:14;51925:58;52017:16;52012:2;52004:6;52000:15;51993:41;51914:127;:::o;52047:234::-;52187:34;52183:1;52175:6;52171:14;52164:58;52256:17;52251:2;52243:6;52239:15;52232:42;52153:128;:::o;52287:222::-;52427:34;52423:1;52415:6;52411:14;52404:58;52496:5;52491:2;52483:6;52479:15;52472:30;52393:116;:::o;52515:232::-;52655:34;52651:1;52643:6;52639:14;52632:58;52724:15;52719:2;52711:6;52707:15;52700:40;52621:126;:::o;52753:177::-;52893:29;52889:1;52881:6;52877:14;52870:53;52859:71;:::o;52936:221::-;53076:34;53072:1;53064:6;53060:14;53053:58;53145:4;53140:2;53132:6;53128:15;53121:29;53042:115;:::o;53163:171::-;53303:23;53299:1;53291:6;53287:14;53280:47;53269:65;:::o;53340:122::-;53413:24;53431:5;53413:24;:::i;:::-;53406:5;53403:35;53393:2;;53452:1;53449;53442:12;53393:2;53383:79;:::o;53468:116::-;53538:21;53553:5;53538:21;:::i;:::-;53531:5;53528:32;53518:2;;53574:1;53571;53564:12;53518:2;53508:76;:::o;53590:122::-;53663:24;53681:5;53663:24;:::i;:::-;53656:5;53653:35;53643:2;;53702:1;53699;53692:12;53643:2;53633:79;:::o;53718:120::-;53790:23;53807:5;53790:23;:::i;:::-;53783:5;53780:34;53770:2;;53828:1;53825;53818:12;53770:2;53760:78;:::o;53844:122::-;53917:24;53935:5;53917:24;:::i;:::-;53910:5;53907:35;53897:2;;53956:1;53953;53946:12;53897:2;53887:79;:::o

Swarm Source

ipfs://1837a449f21846f588f8abc7f9be81f8532e3dc56ab34ce56b8fa2226f5f287f
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.