ETH Price: $3,281.27 (-1.47%)

Token

Cancerous Cow (CC)
 

Overview

Max Total Supply

3,333 CC

Holders

1,468

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
7 CC
0x947245F9057514be448236cde5C20Db263BB4F7F
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CancerousCow

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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 Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

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

pragma solidity ^0.8.0; 

abstract contract ReentrancyGuard { 
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
   _status = _ENTERED;

        _;
        _status = _NOT_ENTERED;
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
 
    function toString(uint256 value) internal pure returns (string memory) { 
        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);
    }
 
    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);
    }
 
    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);
    }
}
 
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);
 
    constructor() {
        _transferOwnership(_msgSender());
    }
 
    function owner() public view virtual returns (address) {
        return _owner;
    } 
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
 
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
 
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
 
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
 
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 { 
            if (returndata.length > 0) { 

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
 
interface IERC721Receiver { 
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
 
interface IERC165 { 
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
 
abstract contract ERC165 is IERC165 { 
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
} 
interface IERC721 is IERC165 { 
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); 
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); 
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved); 
    function balanceOf(address owner) external view returns (uint256 balance); 
    function ownerOf(uint256 tokenId) external view returns (address owner); 
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external; 
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external; 
    function approve(address to, uint256 tokenId) external;
 
    function getApproved(uint256 tokenId) external view returns (address operator); 
    function setApprovalForAll(address operator, bool _approved) external; 
    function isApprovedForAll(address owner, address operator) external view returns (bool); 
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
} 
interface IERC721Enumerable is IERC721 { 
    function totalSupply() external view returns (uint256); 
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); 
    function tokenByIndex(uint256 index) external view returns (uint256);
}  
interface IERC721Metadata is IERC721 { 
    function name() external view returns (string memory); 
    function symbol() external view returns (string memory); 
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

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

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _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;

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

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

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

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

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

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _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 virtual override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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 _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _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);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = 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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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 TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

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

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

contract CancerousCow is Ownable, ERC721A, ReentrancyGuard {
    using Strings for uint256;


  uint256 public MAX_PER_Transaction = 2; // maximam amount that user can mint
  mapping(address => uint256) public publicClaimedBy;

  uint256 public  PRICE = 0.005 ether; 

  uint256 private constant TotalCollectionSize_ = 3333; // total number of nfts
  uint256 private constant MaxMintPerBatch_ = 20; //max mint per traction


  bool public _revelNFT = false;
  string private _baseTokenURI;
  string private _uriBeforeRevel;
  uint public reserve = 0;
  mapping(address => bool) private blacklistedAddresses;


  uint public status = 0; //0-pause 1-whitelist 2-public

  constructor() ERC721A("Cancerous Cow","CC") {
    _uriBeforeRevel = "https://gateway.pinata.cloud/ipfs/Qmatb6f4d3kxW4jj6bjWxNFJWCQm74o2jzQR9ofxSPN3Ya/Pre-reveal.json";
    blacklistedAddresses[0x5B4F87CADC9625CB9B9cFf449324D204e799D19a] = true;
    blacklistedAddresses[0xfcEf588794167279E0d1e34121214dc7D33b663F] = true;

  }

  modifier callerIsUser() {
    require(tx.origin == msg.sender, "The caller is another contract");
    _;
  }
 
  function mint(uint256 quantity) external payable callerIsUser {
    require(status == 2 , "Sale is not Active");
    require(!blacklistedAddresses[msg.sender], "You are black listed");
    require(totalSupply() + quantity <= TotalCollectionSize_-reserve, "reached max supply");
    require(quantity <= MAX_PER_Transaction,"can not mint this many");
    require(msg.value >= PRICE * quantity, "Need to send more ETH.");


    publicClaimedBy[msg.sender] += quantity;
    require(publicClaimedBy[msg.sender] <= MAX_PER_Transaction, "Purchase exceeds max allowed");
    _safeMint(msg.sender, quantity);
  }

   function isBlacklisted(address _user) public view returns (bool) {
    return blacklistedAddresses[_user];
  }

  
  function addNewBlacklistUsers(address[] calldata _users) public onlyOwner {
    // ["","",""]
    for(uint i=0;i<_users.length;i++)
        blacklistedAddresses[_users[i]] = true;
  }

   function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
    if(_revelNFT){
    string memory baseURI = _baseURI();
    return
      bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, "/", tokenId.toString(), ".json")) : "";
        } else {
            return _uriBeforeRevel;
        }
  }

  function setURIbeforeRevel(string memory URI) external onlyOwner {
    _uriBeforeRevel = URI;
  }

  function setBaseURI(string memory baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }
  function _baseURI() internal view virtual override returns (string memory) {
    return _baseTokenURI;
  }
  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }
  function getOwnershipData(uint256 tokenId)
    external
    view
    returns (TokenOwnership memory)
  {
    return _ownershipOf(tokenId);
  }

  function withdrawMoney() external onlyOwner nonReentrant {
    (bool success, ) = msg.sender.call{value: address(this).balance}("");
    require(success, "Transfer failed.");
  }

  function changeRevelStatus() external onlyOwner {
    _revelNFT = !_revelNFT;
  }

  function changeMintPrice(uint256 _newPrice) external onlyOwner
  {
      PRICE = _newPrice;
  }
  function changeMAX_PER_Transaction(uint256 q) external onlyOwner
  {
      MAX_PER_Transaction = q;
  }

  function setStatus(uint256 s)external onlyOwner{
      status = s;
  }

   function getStatus()public view returns(uint){
      return status;
  }

 function setReserveTokens(uint256 _quantity) public onlyOwner {
        reserve=_quantity;
    }
    
  function getPrice(uint256 _quantity) public view returns (uint256) {
       
        return _quantity*PRICE;
    }

 function mintReserveTokens(uint quantity) public onlyOwner {
        require(quantity <= reserve, "The quantity exceeds the reserve.");
        reserve -= quantity;
        _safeMint(msg.sender, quantity);

    }

  function airdrop(address a, uint q)public onlyOwner{
    require(totalSupply() + q <= TotalCollectionSize_, "reached max supply");
    _safeMint(a, q);
  }


    //    WhiteList CODE STARTS    //

    uint256 public whiteListMaxMint = 1;
    bytes32 public whitelistMerkleRoot;
    mapping(address => uint256) public whiteListClaimedBy;
    uint256 private TotalWLavailable = 2222; // total number of nfts


    function setWhitelistMerkleRoot(bytes32 _whitelistMerkleRoot) external onlyOwner {
        whitelistMerkleRoot = _whitelistMerkleRoot;
    }

    function inWhitelist(bytes32[] memory _proof, address _owner) public view returns (bool) {
        return MerkleProof.verify(_proof, whitelistMerkleRoot, keccak256(abi.encodePacked(_owner)));
    }

    function purchaseWhiteListTokens(uint256 _howMany, bytes32[] calldata _proof) external payable {
        require(status == 1 , "Sale is not active ");
        require(totalSupply()+_howMany<=TotalWLavailable,"Quantity must be lesser then MaxSupply");
        require(inWhitelist(_proof, msg.sender), "You are not in presale");

        require(whiteListClaimedBy[msg.sender] < whiteListMaxMint, "Purchase exceeds max allowed");
        whiteListClaimedBy[msg.sender] += _howMany;


        _safeMint(msg.sender, _howMany);

    }

     function setWhiteListMaxMint(uint256 _whiteListMaxMint) external onlyOwner {
        whiteListMaxMint = _whiteListMaxMint;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_Transaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_revelNFT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"addNewBlacklistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"},{"internalType":"uint256","name":"q","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"changeMAX_PER_Transaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changeMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeRevelStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"address","name":"_owner","type":"address"}],"name":"inWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintReserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"address","name":"","type":"address"}],"name":"publicClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_howMany","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"purchaseWhiteListTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","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":"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"setReserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"s","type":"uint256"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setURIbeforeRevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whiteListMaxMint","type":"uint256"}],"name":"setWhiteListMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistMerkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteListClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526002600a556611c37937e08000600c556000600d60006101000a81548160ff0219169083151502179055506000601055600060125560016013556108ae6016553480156200005157600080fd5b506040518060400160405280600d81526020017f43616e6365726f757320436f77000000000000000000000000000000000000008152506040518060400160405280600281526020017f4343000000000000000000000000000000000000000000000000000000000000815250620000de620000d26200024060201b60201c565b6200024860201b60201c565b8160039080519060200190620000f692919062000315565b5080600490805190602001906200010f92919062000315565b50620001206200030c60201b60201c565b600181905550505060016009819055506040518060800160405280606081526020016200531660609139600f90805190602001906200016192919062000315565b50600160116000735b4f87cadc9625cb9b9cff449324d204e799d19a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fcef588794167279e0d1e34121214dc7d33b663f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200042a565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b8280546200032390620003c5565b90600052602060002090601f01602090048101928262000347576000855562000393565b82601f106200036257805160ff191683800117855562000393565b8280016001018555821562000393579182015b828111156200039257825182559160200191906001019062000375565b5b509050620003a29190620003a6565b5090565b5b80821115620003c1576000816000905550600101620003a7565b5090565b60006002820490506001821680620003de57607f821691505b60208210811415620003f557620003f4620003fb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614edc806200043a6000396000f3fe6080604052600436106102875760003560e01c8063715018a61161015a578063ac446002116100c1578063dc33e6811161007a578063dc33e68114610985578063e5ec56a0146109c2578063e7572230146109ff578063e985e9c514610a3c578063f2fde38b14610a79578063fe575a8714610aa257610287565b8063ac4460021461089d578063b88d4fde146108b4578063bd0a8439146108dd578063bd32fb66146108f4578063c87b56dd1461091d578063cd3293de1461095a57610287565b80639231ab2a116101135780639231ab2a1461079c57806395d89b41146107d9578063a0712d6814610804578063a22cb46514610820578063a40ece7a14610849578063aa98e0c61461087257610287565b8063715018a61461069e57806375236143146106b55780637cdd702e146106f25780638ba4cc3c1461071d5780638d859f3e146107465780638da5cb5b1461077157610287565b80632ea7c5d9116101fe5780635c37809d116101b75780635c37809d1461057e57806362c6f7b9146105a75780636352211e146105d257806369ba1a751461060f5780636a44e1731461063857806370a082311461066157610287565b80632ea7c5d9146104845780633fd17366146104ad57806342842e0e146104d65780634e69d560146104ff57806351d7ff931461052a57806355f804b31461055557610287565b806310157fc31161025057806310157fc31461038357806318160ddd1461039f5780631984b286146103ca578063200d2ed21461040757806323b872dd14610432578063288bd8fd1461045b57610287565b8062445bfd1461028c57806301ffc9a7146102b557806306fdde03146102f2578063081812fc1461031d578063095ea7b31461035a575b600080fd5b34801561029857600080fd5b506102b360048036038101906102ae9190613c41565b610adf565b005b3480156102c157600080fd5b506102dc60048036038101906102d79190613d17565b610c00565b6040516102e99190614316565b60405180910390f35b3480156102fe57600080fd5b50610307610ce2565b604051610314919061434c565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f9190613dba565b610d74565b60405161035191906142af565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c9190613c01565b610df0565b005b61039d60048036038101906103989190613de7565b610efb565b005b3480156103ab57600080fd5b506103b4611109565b6040516103c19190614589565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec9190613a7e565b611120565b6040516103fe9190614589565b60405180910390f35b34801561041357600080fd5b5061041c611138565b6040516104299190614589565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190613aeb565b61113e565b005b34801561046757600080fd5b50610482600480360381019061047d9190613dba565b61114e565b005b34801561049057600080fd5b506104ab60048036038101906104a69190613dba565b611235565b005b3480156104b957600080fd5b506104d460048036038101906104cf9190613dba565b6112bb565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190613aeb565b611341565b005b34801561050b57600080fd5b50610514611361565b6040516105219190614589565b60405180910390f35b34801561053657600080fd5b5061053f61136b565b60405161054c9190614589565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190613d71565b611371565b005b34801561058a57600080fd5b506105a560048036038101906105a09190613d71565b611407565b005b3480156105b357600080fd5b506105bc61149d565b6040516105c99190614316565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f49190613dba565b6114b0565b60405161060691906142af565b60405180910390f35b34801561061b57600080fd5b5061063660048036038101906106319190613dba565b6114c6565b005b34801561064457600080fd5b5061065f600480360381019061065a9190613dba565b61154c565b005b34801561066d57600080fd5b5061068860048036038101906106839190613a7e565b6115d2565b6040516106959190614589565b60405180910390f35b3480156106aa57600080fd5b506106b36116a2565b005b3480156106c157600080fd5b506106dc60048036038101906106d79190613a7e565b61172a565b6040516106e99190614589565b60405180910390f35b3480156106fe57600080fd5b50610707611742565b6040516107149190614589565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f9190613c01565b611748565b005b34801561075257600080fd5b5061075b611829565b6040516107689190614589565b60405180910390f35b34801561077d57600080fd5b5061078661182f565b60405161079391906142af565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190613dba565b611858565b6040516107d0919061456e565b60405180910390f35b3480156107e557600080fd5b506107ee611870565b6040516107fb919061434c565b60405180910390f35b61081e60048036038101906108199190613dba565b611902565b005b34801561082c57600080fd5b5061084760048036038101906108429190613bc1565b611c22565b005b34801561085557600080fd5b50610870600480360381019061086b9190613dba565b611d9a565b005b34801561087e57600080fd5b50610887611e20565b6040516108949190614331565b60405180910390f35b3480156108a957600080fd5b506108b2611e26565b005b3480156108c057600080fd5b506108db60048036038101906108d69190613b3e565b611fa7565b005b3480156108e957600080fd5b506108f2612023565b005b34801561090057600080fd5b5061091b60048036038101906109169190613cea565b6120cb565b005b34801561092957600080fd5b50610944600480360381019061093f9190613dba565b612151565b604051610951919061434c565b60405180910390f35b34801561096657600080fd5b5061096f6122a0565b60405161097c9190614589565b60405180910390f35b34801561099157600080fd5b506109ac60048036038101906109a79190613a7e565b6122a6565b6040516109b99190614589565b60405180910390f35b3480156109ce57600080fd5b506109e960048036038101906109e49190613c8e565b6122b8565b6040516109f69190614316565b60405180910390f35b348015610a0b57600080fd5b50610a266004803603810190610a219190613dba565b6122f5565b604051610a339190614589565b60405180910390f35b348015610a4857600080fd5b50610a636004803603810190610a5e9190613aab565b61230c565b604051610a709190614316565b60405180910390f35b348015610a8557600080fd5b50610aa06004803603810190610a9b9190613a7e565b6123a0565b005b348015610aae57600080fd5b50610ac96004803603810190610ac49190613a7e565b612498565b604051610ad69190614316565b60405180910390f35b610ae76124ee565b73ffffffffffffffffffffffffffffffffffffffff16610b0561182f565b73ffffffffffffffffffffffffffffffffffffffff1614610b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b529061446e565b60405180910390fd5b60005b82829050811015610bfb57600160116000858585818110610b8257610b81614a1c565b5b9050602002016020810190610b979190613a7e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610bf3906148f1565b915050610b5e565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ccb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cdb5750610cda826124f6565b5b9050919050565b606060038054610cf19061488e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1d9061488e565b8015610d6a5780601f10610d3f57610100808354040283529160200191610d6a565b820191906000526020600020905b815481529060010190602001808311610d4d57829003601f168201915b5050505050905090565b6000610d7f82612560565b610db5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dfb826114b0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e63576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e826124ee565b73ffffffffffffffffffffffffffffffffffffffff1614158015610eb45750610eb281610ead6124ee565b61230c565b155b15610eeb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ef68383836125ae565b505050565b600160125414610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f379061438e565b60405180910390fd5b60165483610f4c611109565b610f5691906146a5565b1115610f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8e9061448e565b60405180910390fd5b610fe2828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050336122b8565b611021576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110189061444e565b60405180910390fd5b601354601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109b9061452e565b60405180910390fd5b82601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110f391906146a5565b925050819055506111043384612660565b505050565b600061111361267e565b6002546001540303905090565b60156020528060005260406000206000915090505481565b60125481565b611149838383612687565b505050565b6111566124ee565b73ffffffffffffffffffffffffffffffffffffffff1661117461182f565b73ffffffffffffffffffffffffffffffffffffffff16146111ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c19061446e565b60405180910390fd5b60105481111561120f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611206906143ae565b60405180910390fd5b80601060008282546112219190614786565b925050819055506112323382612660565b50565b61123d6124ee565b73ffffffffffffffffffffffffffffffffffffffff1661125b61182f565b73ffffffffffffffffffffffffffffffffffffffff16146112b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a89061446e565b60405180910390fd5b8060138190555050565b6112c36124ee565b73ffffffffffffffffffffffffffffffffffffffff166112e161182f565b73ffffffffffffffffffffffffffffffffffffffff1614611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132e9061446e565b60405180910390fd5b80600c8190555050565b61135c83838360405180602001604052806000815250611fa7565b505050565b6000601254905090565b600a5481565b6113796124ee565b73ffffffffffffffffffffffffffffffffffffffff1661139761182f565b73ffffffffffffffffffffffffffffffffffffffff16146113ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e49061446e565b60405180910390fd5b80600e90805190602001906114039291906136f0565b5050565b61140f6124ee565b73ffffffffffffffffffffffffffffffffffffffff1661142d61182f565b73ffffffffffffffffffffffffffffffffffffffff1614611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a9061446e565b60405180910390fd5b80600f90805190602001906114999291906136f0565b5050565b600d60009054906101000a900460ff1681565b60006114bb82612b3d565b600001519050919050565b6114ce6124ee565b73ffffffffffffffffffffffffffffffffffffffff166114ec61182f565b73ffffffffffffffffffffffffffffffffffffffff1614611542576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115399061446e565b60405180910390fd5b8060128190555050565b6115546124ee565b73ffffffffffffffffffffffffffffffffffffffff1661157261182f565b73ffffffffffffffffffffffffffffffffffffffff16146115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf9061446e565b60405180910390fd5b8060108190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561163a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6116aa6124ee565b73ffffffffffffffffffffffffffffffffffffffff166116c861182f565b73ffffffffffffffffffffffffffffffffffffffff161461171e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117159061446e565b60405180910390fd5b6117286000612dcc565b565b600b6020528060005260406000206000915090505481565b60135481565b6117506124ee565b73ffffffffffffffffffffffffffffffffffffffff1661176e61182f565b73ffffffffffffffffffffffffffffffffffffffff16146117c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bb9061446e565b60405180910390fd5b610d05816117d0611109565b6117da91906146a5565b111561181b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118129061442e565b60405180910390fd5b6118258282612660565b5050565b600c5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611860613776565b61186982612b3d565b9050919050565b60606004805461187f9061488e565b80601f01602080910402602001604051908101604052809291908181526020018280546118ab9061488e565b80156118f85780601f106118cd576101008083540402835291602001916118f8565b820191906000526020600020905b8154815290600101906020018083116118db57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611970576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119679061440e565b60405180910390fd5b6002601254146119b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ac906143ce565b60405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a39906143ee565b60405180910390fd5b601054610d05611a529190614786565b81611a5b611109565b611a6591906146a5565b1115611aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9d9061442e565b60405180910390fd5b600a54811115611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae29061450e565b60405180910390fd5b80600c54611af9919061472c565b341015611b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b32906144ee565b60405180910390fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b8a91906146a5565b92505081905550600a54600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0c9061452e565b60405180910390fd5b611c1f3382612660565b50565b611c2a6124ee565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c8f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611c9c6124ee565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d496124ee565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d8e9190614316565b60405180910390a35050565b611da26124ee565b73ffffffffffffffffffffffffffffffffffffffff16611dc061182f565b73ffffffffffffffffffffffffffffffffffffffff1614611e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0d9061446e565b60405180910390fd5b80600a8190555050565b60145481565b611e2e6124ee565b73ffffffffffffffffffffffffffffffffffffffff16611e4c61182f565b73ffffffffffffffffffffffffffffffffffffffff1614611ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e999061446e565b60405180910390fd5b60026009541415611ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edf9061454e565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051611f169061429a565b60006040518083038185875af1925050503d8060008114611f53576040519150601f19603f3d011682016040523d82523d6000602084013e611f58565b606091505b5050905080611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f93906144ce565b60405180910390fd5b506001600981905550565b611fb2848484612687565b611fd18373ffffffffffffffffffffffffffffffffffffffff16612e90565b8015611fe65750611fe484848484612ea3565b155b1561201d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61202b6124ee565b73ffffffffffffffffffffffffffffffffffffffff1661204961182f565b73ffffffffffffffffffffffffffffffffffffffff161461209f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120969061446e565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6120d36124ee565b73ffffffffffffffffffffffffffffffffffffffff166120f161182f565b73ffffffffffffffffffffffffffffffffffffffff1614612147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213e9061446e565b60405180910390fd5b8060148190555050565b606061215c82612560565b61219b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612192906144ae565b60405180910390fd5b600d60009054906101000a900460ff161561220d5760006121ba613003565b905060008151116121da5760405180602001604052806000815250612205565b806121e484613095565b6040516020016121f5929190614260565b6040516020818303038152906040525b91505061229b565b600f805461221a9061488e565b80601f01602080910402602001604051908101604052809291908181526020018280546122469061488e565b80156122935780601f1061226857610100808354040283529160200191612293565b820191906000526020600020905b81548152906001019060200180831161227657829003601f168201915b505050505090505b919050565b60105481565b60006122b1826131f6565b9050919050565b60006122ed83601454846040516020016122d29190614245565b60405160208183030381529060405280519060200120613260565b905092915050565b6000600c5482612305919061472c565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123a86124ee565b73ffffffffffffffffffffffffffffffffffffffff166123c661182f565b73ffffffffffffffffffffffffffffffffffffffff161461241c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124139061446e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561248c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124839061436e565b60405180910390fd5b61249581612dcc565b50565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161256b61267e565b1115801561257a575060015482105b80156125a7575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61267a828260405180602001604052806000815250613277565b5050565b60006001905090565b600061269282612b3d565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126fd576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661271e6124ee565b73ffffffffffffffffffffffffffffffffffffffff16148061274d575061274c856127476124ee565b61230c565b5b80612792575061275b6124ee565b73ffffffffffffffffffffffffffffffffffffffff1661277a84610d74565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806127cb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612832576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61283f8585856001613289565b61284b600084876125ae565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612acb576001548214612aca57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b36858585600161328f565b5050505050565b612b45613776565b600082905080612b5361267e565b11158015612b62575060015481105b15612d95576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d9357600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c77578092505050612dc7565b5b600115612d9257818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d8d578092505050612dc7565b612c78565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ec96124ee565b8786866040518563ffffffff1660e01b8152600401612eeb94939291906142ca565b602060405180830381600087803b158015612f0557600080fd5b505af1925050508015612f3657506040513d601f19601f82011682018060405250810190612f339190613d44565b60015b612fb0573d8060008114612f66576040519150601f19603f3d011682016040523d82523d6000602084013e612f6b565b606091505b50600081511415612fa8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e80546130129061488e565b80601f016020809104026020016040519081016040528092919081815260200182805461303e9061488e565b801561308b5780601f106130605761010080835404028352916020019161308b565b820191906000526020600020905b81548152906001019060200180831161306e57829003601f168201915b5050505050905090565b606060008214156130dd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131f1565b600082905060005b6000821461310f5780806130f8906148f1565b915050600a8261310891906146fb565b91506130e5565b60008167ffffffffffffffff81111561312b5761312a614a4b565b5b6040519080825280601f01601f19166020018201604052801561315d5781602001600182028036833780820191505090505b5090505b600085146131ea576001826131769190614786565b9150600a85613185919061495e565b603061319191906146a5565b60f81b8183815181106131a7576131a6614a1c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131e391906146fb565b9450613161565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b60008261326d8584613295565b1490509392505050565b613284838383600161330a565b505050565b50505050565b50505050565b60008082905060005b84518110156132ff5760008582815181106132bc576132bb614a1c565b5b602002602001015190508083116132de576132d783826136d9565b92506132eb565b6132e881846136d9565b92505b5080806132f7906148f1565b91505061329e565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613378576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156133b3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133c06000868387613289565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561358a57506135898773ffffffffffffffffffffffffffffffffffffffff16612e90565b5b15613650575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135ff6000888480600101955088612ea3565b613635576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561359057826001541461364b57600080fd5b6136bc565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613651575b8160018190555050506136d2600086838761328f565b5050505050565b600082600052816020526040600020905092915050565b8280546136fc9061488e565b90600052602060002090601f01602090048101928261371e5760008555613765565b82601f1061373757805160ff1916838001178555613765565b82800160010185558215613765579182015b82811115613764578251825591602001919060010190613749565b5b50905061377291906137b9565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156137d25760008160009055506001016137ba565b5090565b60006137e96137e4846145c9565b6145a4565b9050808382526020820190508285602086028201111561380c5761380b614a84565b5b60005b8581101561383c578161382288826139ce565b84526020840193506020830192505060018101905061380f565b5050509392505050565b6000613859613854846145f5565b6145a4565b90508281526020810184848401111561387557613874614a89565b5b61388084828561484c565b509392505050565b600061389b61389684614626565b6145a4565b9050828152602081018484840111156138b7576138b6614a89565b5b6138c284828561484c565b509392505050565b6000813590506138d981614e33565b92915050565b60008083601f8401126138f5576138f4614a7f565b5b8235905067ffffffffffffffff81111561391257613911614a7a565b5b60208301915083602082028301111561392e5761392d614a84565b5b9250929050565b60008083601f84011261394b5761394a614a7f565b5b8235905067ffffffffffffffff81111561396857613967614a7a565b5b60208301915083602082028301111561398457613983614a84565b5b9250929050565b600082601f8301126139a05761399f614a7f565b5b81356139b08482602086016137d6565b91505092915050565b6000813590506139c881614e4a565b92915050565b6000813590506139dd81614e61565b92915050565b6000813590506139f281614e78565b92915050565b600081519050613a0781614e78565b92915050565b600082601f830112613a2257613a21614a7f565b5b8135613a32848260208601613846565b91505092915050565b600082601f830112613a5057613a4f614a7f565b5b8135613a60848260208601613888565b91505092915050565b600081359050613a7881614e8f565b92915050565b600060208284031215613a9457613a93614a93565b5b6000613aa2848285016138ca565b91505092915050565b60008060408385031215613ac257613ac1614a93565b5b6000613ad0858286016138ca565b9250506020613ae1858286016138ca565b9150509250929050565b600080600060608486031215613b0457613b03614a93565b5b6000613b12868287016138ca565b9350506020613b23868287016138ca565b9250506040613b3486828701613a69565b9150509250925092565b60008060008060808587031215613b5857613b57614a93565b5b6000613b66878288016138ca565b9450506020613b77878288016138ca565b9350506040613b8887828801613a69565b925050606085013567ffffffffffffffff811115613ba957613ba8614a8e565b5b613bb587828801613a0d565b91505092959194509250565b60008060408385031215613bd857613bd7614a93565b5b6000613be6858286016138ca565b9250506020613bf7858286016139b9565b9150509250929050565b60008060408385031215613c1857613c17614a93565b5b6000613c26858286016138ca565b9250506020613c3785828601613a69565b9150509250929050565b60008060208385031215613c5857613c57614a93565b5b600083013567ffffffffffffffff811115613c7657613c75614a8e565b5b613c82858286016138df565b92509250509250929050565b60008060408385031215613ca557613ca4614a93565b5b600083013567ffffffffffffffff811115613cc357613cc2614a8e565b5b613ccf8582860161398b565b9250506020613ce0858286016138ca565b9150509250929050565b600060208284031215613d0057613cff614a93565b5b6000613d0e848285016139ce565b91505092915050565b600060208284031215613d2d57613d2c614a93565b5b6000613d3b848285016139e3565b91505092915050565b600060208284031215613d5a57613d59614a93565b5b6000613d68848285016139f8565b91505092915050565b600060208284031215613d8757613d86614a93565b5b600082013567ffffffffffffffff811115613da557613da4614a8e565b5b613db184828501613a3b565b91505092915050565b600060208284031215613dd057613dcf614a93565b5b6000613dde84828501613a69565b91505092915050565b600080600060408486031215613e0057613dff614a93565b5b6000613e0e86828701613a69565b935050602084013567ffffffffffffffff811115613e2f57613e2e614a8e565b5b613e3b86828701613935565b92509250509250925092565b613e50816147ba565b82525050565b613e5f816147ba565b82525050565b613e76613e71826147ba565b61493a565b82525050565b613e85816147cc565b82525050565b613e94816147cc565b82525050565b613ea3816147d8565b82525050565b6000613eb482614657565b613ebe818561466d565b9350613ece81856020860161485b565b613ed781614a98565b840191505092915050565b6000613eed82614662565b613ef78185614689565b9350613f0781856020860161485b565b613f1081614a98565b840191505092915050565b6000613f2682614662565b613f30818561469a565b9350613f4081856020860161485b565b80840191505092915050565b6000613f59602683614689565b9150613f6482614ab6565b604082019050919050565b6000613f7c601383614689565b9150613f8782614b05565b602082019050919050565b6000613f9f602183614689565b9150613faa82614b2e565b604082019050919050565b6000613fc2601283614689565b9150613fcd82614b7d565b602082019050919050565b6000613fe5601483614689565b9150613ff082614ba6565b602082019050919050565b6000614008601e83614689565b915061401382614bcf565b602082019050919050565b600061402b601283614689565b915061403682614bf8565b602082019050919050565b600061404e601683614689565b915061405982614c21565b602082019050919050565b600061407160058361469a565b915061407c82614c4a565b600582019050919050565b6000614094602083614689565b915061409f82614c73565b602082019050919050565b60006140b7602683614689565b91506140c282614c9c565b604082019050919050565b60006140da602f83614689565b91506140e582614ceb565b604082019050919050565b60006140fd60008361467e565b915061410882614d3a565b600082019050919050565b6000614120601083614689565b915061412b82614d3d565b602082019050919050565b6000614143601683614689565b915061414e82614d66565b602082019050919050565b6000614166601683614689565b915061417182614d8f565b602082019050919050565b6000614189601c83614689565b915061419482614db8565b602082019050919050565b60006141ac601f83614689565b91506141b782614de1565b602082019050919050565b60006141cf60018361469a565b91506141da82614e0a565b600182019050919050565b6060820160008201516141fb6000850182613e47565b50602082015161420e6020850182614236565b5060408201516142216040850182613e7c565b50505050565b6142308161482e565b82525050565b61423f81614838565b82525050565b60006142518284613e65565b60148201915081905092915050565b600061426c8285613f1b565b9150614277826141c2565b91506142838284613f1b565b915061428e82614064565b91508190509392505050565b60006142a5826140f0565b9150819050919050565b60006020820190506142c46000830184613e56565b92915050565b60006080820190506142df6000830187613e56565b6142ec6020830186613e56565b6142f96040830185614227565b818103606083015261430b8184613ea9565b905095945050505050565b600060208201905061432b6000830184613e8b565b92915050565b60006020820190506143466000830184613e9a565b92915050565b600060208201905081810360008301526143668184613ee2565b905092915050565b6000602082019050818103600083015261438781613f4c565b9050919050565b600060208201905081810360008301526143a781613f6f565b9050919050565b600060208201905081810360008301526143c781613f92565b9050919050565b600060208201905081810360008301526143e781613fb5565b9050919050565b6000602082019050818103600083015261440781613fd8565b9050919050565b6000602082019050818103600083015261442781613ffb565b9050919050565b600060208201905081810360008301526144478161401e565b9050919050565b6000602082019050818103600083015261446781614041565b9050919050565b6000602082019050818103600083015261448781614087565b9050919050565b600060208201905081810360008301526144a7816140aa565b9050919050565b600060208201905081810360008301526144c7816140cd565b9050919050565b600060208201905081810360008301526144e781614113565b9050919050565b6000602082019050818103600083015261450781614136565b9050919050565b6000602082019050818103600083015261452781614159565b9050919050565b600060208201905081810360008301526145478161417c565b9050919050565b600060208201905081810360008301526145678161419f565b9050919050565b600060608201905061458360008301846141e5565b92915050565b600060208201905061459e6000830184614227565b92915050565b60006145ae6145bf565b90506145ba82826148c0565b919050565b6000604051905090565b600067ffffffffffffffff8211156145e4576145e3614a4b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156146105761460f614a4b565b5b61461982614a98565b9050602081019050919050565b600067ffffffffffffffff82111561464157614640614a4b565b5b61464a82614a98565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006146b08261482e565b91506146bb8361482e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146f0576146ef61498f565b5b828201905092915050565b60006147068261482e565b91506147118361482e565b925082614721576147206149be565b5b828204905092915050565b60006147378261482e565b91506147428361482e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561477b5761477a61498f565b5b828202905092915050565b60006147918261482e565b915061479c8361482e565b9250828210156147af576147ae61498f565b5b828203905092915050565b60006147c58261480e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561487957808201518184015260208101905061485e565b83811115614888576000848401525b50505050565b600060028204905060018216806148a657607f821691505b602082108114156148ba576148b96149ed565b5b50919050565b6148c982614a98565b810181811067ffffffffffffffff821117156148e8576148e7614a4b565b5b80604052505050565b60006148fc8261482e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561492f5761492e61498f565b5b600182019050919050565b60006149458261494c565b9050919050565b600061495782614aa9565b9050919050565b60006149698261482e565b91506149748361482e565b925082614984576149836149be565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976652000000000000000000000000000600082015250565b7f546865207175616e74697479206578636565647320746865207265736572766560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f596f752061726520626c61636b206c6973746564000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f596f7520617265206e6f7420696e2070726573616c6500000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5175616e74697479206d757374206265206c6573736572207468656e204d617860008201527f537570706c790000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b614e3c816147ba565b8114614e4757600080fd5b50565b614e53816147cc565b8114614e5e57600080fd5b50565b614e6a816147d8565b8114614e7557600080fd5b50565b614e81816147e2565b8114614e8c57600080fd5b50565b614e988161482e565b8114614ea357600080fd5b5056fea26469706673582212204af780be2e9932ac935db3f0fba645f14bd391381a2c4fc12cadae3ac357065e64736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d61746236663464336b7857346a6a36626a57784e464a5743516d37346f326a7a5152396f667853504e3359612f5072652d72657665616c2e6a736f6e

Deployed Bytecode

0x6080604052600436106102875760003560e01c8063715018a61161015a578063ac446002116100c1578063dc33e6811161007a578063dc33e68114610985578063e5ec56a0146109c2578063e7572230146109ff578063e985e9c514610a3c578063f2fde38b14610a79578063fe575a8714610aa257610287565b8063ac4460021461089d578063b88d4fde146108b4578063bd0a8439146108dd578063bd32fb66146108f4578063c87b56dd1461091d578063cd3293de1461095a57610287565b80639231ab2a116101135780639231ab2a1461079c57806395d89b41146107d9578063a0712d6814610804578063a22cb46514610820578063a40ece7a14610849578063aa98e0c61461087257610287565b8063715018a61461069e57806375236143146106b55780637cdd702e146106f25780638ba4cc3c1461071d5780638d859f3e146107465780638da5cb5b1461077157610287565b80632ea7c5d9116101fe5780635c37809d116101b75780635c37809d1461057e57806362c6f7b9146105a75780636352211e146105d257806369ba1a751461060f5780636a44e1731461063857806370a082311461066157610287565b80632ea7c5d9146104845780633fd17366146104ad57806342842e0e146104d65780634e69d560146104ff57806351d7ff931461052a57806355f804b31461055557610287565b806310157fc31161025057806310157fc31461038357806318160ddd1461039f5780631984b286146103ca578063200d2ed21461040757806323b872dd14610432578063288bd8fd1461045b57610287565b8062445bfd1461028c57806301ffc9a7146102b557806306fdde03146102f2578063081812fc1461031d578063095ea7b31461035a575b600080fd5b34801561029857600080fd5b506102b360048036038101906102ae9190613c41565b610adf565b005b3480156102c157600080fd5b506102dc60048036038101906102d79190613d17565b610c00565b6040516102e99190614316565b60405180910390f35b3480156102fe57600080fd5b50610307610ce2565b604051610314919061434c565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f9190613dba565b610d74565b60405161035191906142af565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c9190613c01565b610df0565b005b61039d60048036038101906103989190613de7565b610efb565b005b3480156103ab57600080fd5b506103b4611109565b6040516103c19190614589565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec9190613a7e565b611120565b6040516103fe9190614589565b60405180910390f35b34801561041357600080fd5b5061041c611138565b6040516104299190614589565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190613aeb565b61113e565b005b34801561046757600080fd5b50610482600480360381019061047d9190613dba565b61114e565b005b34801561049057600080fd5b506104ab60048036038101906104a69190613dba565b611235565b005b3480156104b957600080fd5b506104d460048036038101906104cf9190613dba565b6112bb565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190613aeb565b611341565b005b34801561050b57600080fd5b50610514611361565b6040516105219190614589565b60405180910390f35b34801561053657600080fd5b5061053f61136b565b60405161054c9190614589565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190613d71565b611371565b005b34801561058a57600080fd5b506105a560048036038101906105a09190613d71565b611407565b005b3480156105b357600080fd5b506105bc61149d565b6040516105c99190614316565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f49190613dba565b6114b0565b60405161060691906142af565b60405180910390f35b34801561061b57600080fd5b5061063660048036038101906106319190613dba565b6114c6565b005b34801561064457600080fd5b5061065f600480360381019061065a9190613dba565b61154c565b005b34801561066d57600080fd5b5061068860048036038101906106839190613a7e565b6115d2565b6040516106959190614589565b60405180910390f35b3480156106aa57600080fd5b506106b36116a2565b005b3480156106c157600080fd5b506106dc60048036038101906106d79190613a7e565b61172a565b6040516106e99190614589565b60405180910390f35b3480156106fe57600080fd5b50610707611742565b6040516107149190614589565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f9190613c01565b611748565b005b34801561075257600080fd5b5061075b611829565b6040516107689190614589565b60405180910390f35b34801561077d57600080fd5b5061078661182f565b60405161079391906142af565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190613dba565b611858565b6040516107d0919061456e565b60405180910390f35b3480156107e557600080fd5b506107ee611870565b6040516107fb919061434c565b60405180910390f35b61081e60048036038101906108199190613dba565b611902565b005b34801561082c57600080fd5b5061084760048036038101906108429190613bc1565b611c22565b005b34801561085557600080fd5b50610870600480360381019061086b9190613dba565b611d9a565b005b34801561087e57600080fd5b50610887611e20565b6040516108949190614331565b60405180910390f35b3480156108a957600080fd5b506108b2611e26565b005b3480156108c057600080fd5b506108db60048036038101906108d69190613b3e565b611fa7565b005b3480156108e957600080fd5b506108f2612023565b005b34801561090057600080fd5b5061091b60048036038101906109169190613cea565b6120cb565b005b34801561092957600080fd5b50610944600480360381019061093f9190613dba565b612151565b604051610951919061434c565b60405180910390f35b34801561096657600080fd5b5061096f6122a0565b60405161097c9190614589565b60405180910390f35b34801561099157600080fd5b506109ac60048036038101906109a79190613a7e565b6122a6565b6040516109b99190614589565b60405180910390f35b3480156109ce57600080fd5b506109e960048036038101906109e49190613c8e565b6122b8565b6040516109f69190614316565b60405180910390f35b348015610a0b57600080fd5b50610a266004803603810190610a219190613dba565b6122f5565b604051610a339190614589565b60405180910390f35b348015610a4857600080fd5b50610a636004803603810190610a5e9190613aab565b61230c565b604051610a709190614316565b60405180910390f35b348015610a8557600080fd5b50610aa06004803603810190610a9b9190613a7e565b6123a0565b005b348015610aae57600080fd5b50610ac96004803603810190610ac49190613a7e565b612498565b604051610ad69190614316565b60405180910390f35b610ae76124ee565b73ffffffffffffffffffffffffffffffffffffffff16610b0561182f565b73ffffffffffffffffffffffffffffffffffffffff1614610b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b529061446e565b60405180910390fd5b60005b82829050811015610bfb57600160116000858585818110610b8257610b81614a1c565b5b9050602002016020810190610b979190613a7e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610bf3906148f1565b915050610b5e565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ccb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cdb5750610cda826124f6565b5b9050919050565b606060038054610cf19061488e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1d9061488e565b8015610d6a5780601f10610d3f57610100808354040283529160200191610d6a565b820191906000526020600020905b815481529060010190602001808311610d4d57829003601f168201915b5050505050905090565b6000610d7f82612560565b610db5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dfb826114b0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e63576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e826124ee565b73ffffffffffffffffffffffffffffffffffffffff1614158015610eb45750610eb281610ead6124ee565b61230c565b155b15610eeb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ef68383836125ae565b505050565b600160125414610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f379061438e565b60405180910390fd5b60165483610f4c611109565b610f5691906146a5565b1115610f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8e9061448e565b60405180910390fd5b610fe2828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050336122b8565b611021576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110189061444e565b60405180910390fd5b601354601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109b9061452e565b60405180910390fd5b82601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110f391906146a5565b925050819055506111043384612660565b505050565b600061111361267e565b6002546001540303905090565b60156020528060005260406000206000915090505481565b60125481565b611149838383612687565b505050565b6111566124ee565b73ffffffffffffffffffffffffffffffffffffffff1661117461182f565b73ffffffffffffffffffffffffffffffffffffffff16146111ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c19061446e565b60405180910390fd5b60105481111561120f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611206906143ae565b60405180910390fd5b80601060008282546112219190614786565b925050819055506112323382612660565b50565b61123d6124ee565b73ffffffffffffffffffffffffffffffffffffffff1661125b61182f565b73ffffffffffffffffffffffffffffffffffffffff16146112b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a89061446e565b60405180910390fd5b8060138190555050565b6112c36124ee565b73ffffffffffffffffffffffffffffffffffffffff166112e161182f565b73ffffffffffffffffffffffffffffffffffffffff1614611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132e9061446e565b60405180910390fd5b80600c8190555050565b61135c83838360405180602001604052806000815250611fa7565b505050565b6000601254905090565b600a5481565b6113796124ee565b73ffffffffffffffffffffffffffffffffffffffff1661139761182f565b73ffffffffffffffffffffffffffffffffffffffff16146113ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e49061446e565b60405180910390fd5b80600e90805190602001906114039291906136f0565b5050565b61140f6124ee565b73ffffffffffffffffffffffffffffffffffffffff1661142d61182f565b73ffffffffffffffffffffffffffffffffffffffff1614611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a9061446e565b60405180910390fd5b80600f90805190602001906114999291906136f0565b5050565b600d60009054906101000a900460ff1681565b60006114bb82612b3d565b600001519050919050565b6114ce6124ee565b73ffffffffffffffffffffffffffffffffffffffff166114ec61182f565b73ffffffffffffffffffffffffffffffffffffffff1614611542576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115399061446e565b60405180910390fd5b8060128190555050565b6115546124ee565b73ffffffffffffffffffffffffffffffffffffffff1661157261182f565b73ffffffffffffffffffffffffffffffffffffffff16146115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf9061446e565b60405180910390fd5b8060108190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561163a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6116aa6124ee565b73ffffffffffffffffffffffffffffffffffffffff166116c861182f565b73ffffffffffffffffffffffffffffffffffffffff161461171e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117159061446e565b60405180910390fd5b6117286000612dcc565b565b600b6020528060005260406000206000915090505481565b60135481565b6117506124ee565b73ffffffffffffffffffffffffffffffffffffffff1661176e61182f565b73ffffffffffffffffffffffffffffffffffffffff16146117c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bb9061446e565b60405180910390fd5b610d05816117d0611109565b6117da91906146a5565b111561181b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118129061442e565b60405180910390fd5b6118258282612660565b5050565b600c5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611860613776565b61186982612b3d565b9050919050565b60606004805461187f9061488e565b80601f01602080910402602001604051908101604052809291908181526020018280546118ab9061488e565b80156118f85780601f106118cd576101008083540402835291602001916118f8565b820191906000526020600020905b8154815290600101906020018083116118db57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611970576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119679061440e565b60405180910390fd5b6002601254146119b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ac906143ce565b60405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a39906143ee565b60405180910390fd5b601054610d05611a529190614786565b81611a5b611109565b611a6591906146a5565b1115611aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9d9061442e565b60405180910390fd5b600a54811115611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae29061450e565b60405180910390fd5b80600c54611af9919061472c565b341015611b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b32906144ee565b60405180910390fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b8a91906146a5565b92505081905550600a54600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0c9061452e565b60405180910390fd5b611c1f3382612660565b50565b611c2a6124ee565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c8f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611c9c6124ee565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d496124ee565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d8e9190614316565b60405180910390a35050565b611da26124ee565b73ffffffffffffffffffffffffffffffffffffffff16611dc061182f565b73ffffffffffffffffffffffffffffffffffffffff1614611e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0d9061446e565b60405180910390fd5b80600a8190555050565b60145481565b611e2e6124ee565b73ffffffffffffffffffffffffffffffffffffffff16611e4c61182f565b73ffffffffffffffffffffffffffffffffffffffff1614611ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e999061446e565b60405180910390fd5b60026009541415611ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edf9061454e565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051611f169061429a565b60006040518083038185875af1925050503d8060008114611f53576040519150601f19603f3d011682016040523d82523d6000602084013e611f58565b606091505b5050905080611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f93906144ce565b60405180910390fd5b506001600981905550565b611fb2848484612687565b611fd18373ffffffffffffffffffffffffffffffffffffffff16612e90565b8015611fe65750611fe484848484612ea3565b155b1561201d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61202b6124ee565b73ffffffffffffffffffffffffffffffffffffffff1661204961182f565b73ffffffffffffffffffffffffffffffffffffffff161461209f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120969061446e565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6120d36124ee565b73ffffffffffffffffffffffffffffffffffffffff166120f161182f565b73ffffffffffffffffffffffffffffffffffffffff1614612147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213e9061446e565b60405180910390fd5b8060148190555050565b606061215c82612560565b61219b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612192906144ae565b60405180910390fd5b600d60009054906101000a900460ff161561220d5760006121ba613003565b905060008151116121da5760405180602001604052806000815250612205565b806121e484613095565b6040516020016121f5929190614260565b6040516020818303038152906040525b91505061229b565b600f805461221a9061488e565b80601f01602080910402602001604051908101604052809291908181526020018280546122469061488e565b80156122935780601f1061226857610100808354040283529160200191612293565b820191906000526020600020905b81548152906001019060200180831161227657829003601f168201915b505050505090505b919050565b60105481565b60006122b1826131f6565b9050919050565b60006122ed83601454846040516020016122d29190614245565b60405160208183030381529060405280519060200120613260565b905092915050565b6000600c5482612305919061472c565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123a86124ee565b73ffffffffffffffffffffffffffffffffffffffff166123c661182f565b73ffffffffffffffffffffffffffffffffffffffff161461241c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124139061446e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561248c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124839061436e565b60405180910390fd5b61249581612dcc565b50565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161256b61267e565b1115801561257a575060015482105b80156125a7575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61267a828260405180602001604052806000815250613277565b5050565b60006001905090565b600061269282612b3d565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126fd576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661271e6124ee565b73ffffffffffffffffffffffffffffffffffffffff16148061274d575061274c856127476124ee565b61230c565b5b80612792575061275b6124ee565b73ffffffffffffffffffffffffffffffffffffffff1661277a84610d74565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806127cb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612832576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61283f8585856001613289565b61284b600084876125ae565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612acb576001548214612aca57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b36858585600161328f565b5050505050565b612b45613776565b600082905080612b5361267e565b11158015612b62575060015481105b15612d95576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d9357600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c77578092505050612dc7565b5b600115612d9257818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d8d578092505050612dc7565b612c78565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ec96124ee565b8786866040518563ffffffff1660e01b8152600401612eeb94939291906142ca565b602060405180830381600087803b158015612f0557600080fd5b505af1925050508015612f3657506040513d601f19601f82011682018060405250810190612f339190613d44565b60015b612fb0573d8060008114612f66576040519150601f19603f3d011682016040523d82523d6000602084013e612f6b565b606091505b50600081511415612fa8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e80546130129061488e565b80601f016020809104026020016040519081016040528092919081815260200182805461303e9061488e565b801561308b5780601f106130605761010080835404028352916020019161308b565b820191906000526020600020905b81548152906001019060200180831161306e57829003601f168201915b5050505050905090565b606060008214156130dd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131f1565b600082905060005b6000821461310f5780806130f8906148f1565b915050600a8261310891906146fb565b91506130e5565b60008167ffffffffffffffff81111561312b5761312a614a4b565b5b6040519080825280601f01601f19166020018201604052801561315d5781602001600182028036833780820191505090505b5090505b600085146131ea576001826131769190614786565b9150600a85613185919061495e565b603061319191906146a5565b60f81b8183815181106131a7576131a6614a1c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131e391906146fb565b9450613161565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b60008261326d8584613295565b1490509392505050565b613284838383600161330a565b505050565b50505050565b50505050565b60008082905060005b84518110156132ff5760008582815181106132bc576132bb614a1c565b5b602002602001015190508083116132de576132d783826136d9565b92506132eb565b6132e881846136d9565b92505b5080806132f7906148f1565b91505061329e565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613378576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156133b3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133c06000868387613289565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561358a57506135898773ffffffffffffffffffffffffffffffffffffffff16612e90565b5b15613650575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135ff6000888480600101955088612ea3565b613635576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561359057826001541461364b57600080fd5b6136bc565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613651575b8160018190555050506136d2600086838761328f565b5050505050565b600082600052816020526040600020905092915050565b8280546136fc9061488e565b90600052602060002090601f01602090048101928261371e5760008555613765565b82601f1061373757805160ff1916838001178555613765565b82800160010185558215613765579182015b82811115613764578251825591602001919060010190613749565b5b50905061377291906137b9565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156137d25760008160009055506001016137ba565b5090565b60006137e96137e4846145c9565b6145a4565b9050808382526020820190508285602086028201111561380c5761380b614a84565b5b60005b8581101561383c578161382288826139ce565b84526020840193506020830192505060018101905061380f565b5050509392505050565b6000613859613854846145f5565b6145a4565b90508281526020810184848401111561387557613874614a89565b5b61388084828561484c565b509392505050565b600061389b61389684614626565b6145a4565b9050828152602081018484840111156138b7576138b6614a89565b5b6138c284828561484c565b509392505050565b6000813590506138d981614e33565b92915050565b60008083601f8401126138f5576138f4614a7f565b5b8235905067ffffffffffffffff81111561391257613911614a7a565b5b60208301915083602082028301111561392e5761392d614a84565b5b9250929050565b60008083601f84011261394b5761394a614a7f565b5b8235905067ffffffffffffffff81111561396857613967614a7a565b5b60208301915083602082028301111561398457613983614a84565b5b9250929050565b600082601f8301126139a05761399f614a7f565b5b81356139b08482602086016137d6565b91505092915050565b6000813590506139c881614e4a565b92915050565b6000813590506139dd81614e61565b92915050565b6000813590506139f281614e78565b92915050565b600081519050613a0781614e78565b92915050565b600082601f830112613a2257613a21614a7f565b5b8135613a32848260208601613846565b91505092915050565b600082601f830112613a5057613a4f614a7f565b5b8135613a60848260208601613888565b91505092915050565b600081359050613a7881614e8f565b92915050565b600060208284031215613a9457613a93614a93565b5b6000613aa2848285016138ca565b91505092915050565b60008060408385031215613ac257613ac1614a93565b5b6000613ad0858286016138ca565b9250506020613ae1858286016138ca565b9150509250929050565b600080600060608486031215613b0457613b03614a93565b5b6000613b12868287016138ca565b9350506020613b23868287016138ca565b9250506040613b3486828701613a69565b9150509250925092565b60008060008060808587031215613b5857613b57614a93565b5b6000613b66878288016138ca565b9450506020613b77878288016138ca565b9350506040613b8887828801613a69565b925050606085013567ffffffffffffffff811115613ba957613ba8614a8e565b5b613bb587828801613a0d565b91505092959194509250565b60008060408385031215613bd857613bd7614a93565b5b6000613be6858286016138ca565b9250506020613bf7858286016139b9565b9150509250929050565b60008060408385031215613c1857613c17614a93565b5b6000613c26858286016138ca565b9250506020613c3785828601613a69565b9150509250929050565b60008060208385031215613c5857613c57614a93565b5b600083013567ffffffffffffffff811115613c7657613c75614a8e565b5b613c82858286016138df565b92509250509250929050565b60008060408385031215613ca557613ca4614a93565b5b600083013567ffffffffffffffff811115613cc357613cc2614a8e565b5b613ccf8582860161398b565b9250506020613ce0858286016138ca565b9150509250929050565b600060208284031215613d0057613cff614a93565b5b6000613d0e848285016139ce565b91505092915050565b600060208284031215613d2d57613d2c614a93565b5b6000613d3b848285016139e3565b91505092915050565b600060208284031215613d5a57613d59614a93565b5b6000613d68848285016139f8565b91505092915050565b600060208284031215613d8757613d86614a93565b5b600082013567ffffffffffffffff811115613da557613da4614a8e565b5b613db184828501613a3b565b91505092915050565b600060208284031215613dd057613dcf614a93565b5b6000613dde84828501613a69565b91505092915050565b600080600060408486031215613e0057613dff614a93565b5b6000613e0e86828701613a69565b935050602084013567ffffffffffffffff811115613e2f57613e2e614a8e565b5b613e3b86828701613935565b92509250509250925092565b613e50816147ba565b82525050565b613e5f816147ba565b82525050565b613e76613e71826147ba565b61493a565b82525050565b613e85816147cc565b82525050565b613e94816147cc565b82525050565b613ea3816147d8565b82525050565b6000613eb482614657565b613ebe818561466d565b9350613ece81856020860161485b565b613ed781614a98565b840191505092915050565b6000613eed82614662565b613ef78185614689565b9350613f0781856020860161485b565b613f1081614a98565b840191505092915050565b6000613f2682614662565b613f30818561469a565b9350613f4081856020860161485b565b80840191505092915050565b6000613f59602683614689565b9150613f6482614ab6565b604082019050919050565b6000613f7c601383614689565b9150613f8782614b05565b602082019050919050565b6000613f9f602183614689565b9150613faa82614b2e565b604082019050919050565b6000613fc2601283614689565b9150613fcd82614b7d565b602082019050919050565b6000613fe5601483614689565b9150613ff082614ba6565b602082019050919050565b6000614008601e83614689565b915061401382614bcf565b602082019050919050565b600061402b601283614689565b915061403682614bf8565b602082019050919050565b600061404e601683614689565b915061405982614c21565b602082019050919050565b600061407160058361469a565b915061407c82614c4a565b600582019050919050565b6000614094602083614689565b915061409f82614c73565b602082019050919050565b60006140b7602683614689565b91506140c282614c9c565b604082019050919050565b60006140da602f83614689565b91506140e582614ceb565b604082019050919050565b60006140fd60008361467e565b915061410882614d3a565b600082019050919050565b6000614120601083614689565b915061412b82614d3d565b602082019050919050565b6000614143601683614689565b915061414e82614d66565b602082019050919050565b6000614166601683614689565b915061417182614d8f565b602082019050919050565b6000614189601c83614689565b915061419482614db8565b602082019050919050565b60006141ac601f83614689565b91506141b782614de1565b602082019050919050565b60006141cf60018361469a565b91506141da82614e0a565b600182019050919050565b6060820160008201516141fb6000850182613e47565b50602082015161420e6020850182614236565b5060408201516142216040850182613e7c565b50505050565b6142308161482e565b82525050565b61423f81614838565b82525050565b60006142518284613e65565b60148201915081905092915050565b600061426c8285613f1b565b9150614277826141c2565b91506142838284613f1b565b915061428e82614064565b91508190509392505050565b60006142a5826140f0565b9150819050919050565b60006020820190506142c46000830184613e56565b92915050565b60006080820190506142df6000830187613e56565b6142ec6020830186613e56565b6142f96040830185614227565b818103606083015261430b8184613ea9565b905095945050505050565b600060208201905061432b6000830184613e8b565b92915050565b60006020820190506143466000830184613e9a565b92915050565b600060208201905081810360008301526143668184613ee2565b905092915050565b6000602082019050818103600083015261438781613f4c565b9050919050565b600060208201905081810360008301526143a781613f6f565b9050919050565b600060208201905081810360008301526143c781613f92565b9050919050565b600060208201905081810360008301526143e781613fb5565b9050919050565b6000602082019050818103600083015261440781613fd8565b9050919050565b6000602082019050818103600083015261442781613ffb565b9050919050565b600060208201905081810360008301526144478161401e565b9050919050565b6000602082019050818103600083015261446781614041565b9050919050565b6000602082019050818103600083015261448781614087565b9050919050565b600060208201905081810360008301526144a7816140aa565b9050919050565b600060208201905081810360008301526144c7816140cd565b9050919050565b600060208201905081810360008301526144e781614113565b9050919050565b6000602082019050818103600083015261450781614136565b9050919050565b6000602082019050818103600083015261452781614159565b9050919050565b600060208201905081810360008301526145478161417c565b9050919050565b600060208201905081810360008301526145678161419f565b9050919050565b600060608201905061458360008301846141e5565b92915050565b600060208201905061459e6000830184614227565b92915050565b60006145ae6145bf565b90506145ba82826148c0565b919050565b6000604051905090565b600067ffffffffffffffff8211156145e4576145e3614a4b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156146105761460f614a4b565b5b61461982614a98565b9050602081019050919050565b600067ffffffffffffffff82111561464157614640614a4b565b5b61464a82614a98565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006146b08261482e565b91506146bb8361482e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146f0576146ef61498f565b5b828201905092915050565b60006147068261482e565b91506147118361482e565b925082614721576147206149be565b5b828204905092915050565b60006147378261482e565b91506147428361482e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561477b5761477a61498f565b5b828202905092915050565b60006147918261482e565b915061479c8361482e565b9250828210156147af576147ae61498f565b5b828203905092915050565b60006147c58261480e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561487957808201518184015260208101905061485e565b83811115614888576000848401525b50505050565b600060028204905060018216806148a657607f821691505b602082108114156148ba576148b96149ed565b5b50919050565b6148c982614a98565b810181811067ffffffffffffffff821117156148e8576148e7614a4b565b5b80604052505050565b60006148fc8261482e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561492f5761492e61498f565b5b600182019050919050565b60006149458261494c565b9050919050565b600061495782614aa9565b9050919050565b60006149698261482e565b91506149748361482e565b925082614984576149836149be565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976652000000000000000000000000000600082015250565b7f546865207175616e74697479206578636565647320746865207265736572766560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f596f752061726520626c61636b206c6973746564000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f596f7520617265206e6f7420696e2070726573616c6500000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5175616e74697479206d757374206265206c6573736572207468656e204d617860008201527f537570706c790000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b614e3c816147ba565b8114614e4757600080fd5b50565b614e53816147cc565b8114614e5e57600080fd5b50565b614e6a816147d8565b8114614e7557600080fd5b50565b614e81816147e2565b8114614e8c57600080fd5b50565b614e988161482e565b8114614ea357600080fd5b5056fea26469706673582212204af780be2e9932ac935db3f0fba645f14bd391381a2c4fc12cadae3ac357065e64736f6c63430008070033

Deployed Bytecode Sourcemap

32868:5672:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34758:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15123:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18236:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19739:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19302:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37858:540;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14372:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37367:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33500:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20604:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36852:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38407:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36251:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20845:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36544:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32968:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35496:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35391:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33308:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18044:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36465:72;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36622:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15492:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5154:103;;;;;;;;;;;;;:::i;:::-;;33048:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37284:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37075:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33105:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4931:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35821:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18405:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34015:614;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20015:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36353:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37326:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35975:181;;;;;;;;;;;;;:::i;:::-;;21101:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36162:83;;;;;;;;;;;;;:::i;:::-;;37501:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34952:433;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33410:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35710:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37651:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36730:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20373:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5266:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34636:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34758:187;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34862:6:::1;34858:81;34873:6;;:13;;34871:1;:15;34858:81;;;34935:4;34901:20;:31;34922:6;;34929:1;34922:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;34901:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;34887:3;;;;;:::i;:::-;;;;34858:81;;;;34758:187:::0;;:::o;15123:305::-;15225:4;15277:25;15262:40;;;:11;:40;;;;:105;;;;15334:33;15319:48;;;:11;:48;;;;15262:105;:158;;;;15384:36;15408:11;15384:23;:36::i;:::-;15262:158;15242:178;;15123:305;;;:::o;18236:100::-;18290:13;18323:5;18316:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18236:100;:::o;19739:204::-;19807:7;19832:16;19840:7;19832;:16::i;:::-;19827:64;;19857:34;;;;;;;;;;;;;;19827:64;19911:15;:24;19927:7;19911:24;;;;;;;;;;;;;;;;;;;;;19904:31;;19739:204;;;:::o;19302:371::-;19375:13;19391:24;19407:7;19391:15;:24::i;:::-;19375:40;;19436:5;19430:11;;:2;:11;;;19426:48;;;19450:24;;;;;;;;;;;;;;19426:48;19507:5;19491:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;19517:37;19534:5;19541:12;:10;:12::i;:::-;19517:16;:37::i;:::-;19516:38;19491:63;19487:138;;;19578:35;;;;;;;;;;;;;;19487:138;19637:28;19646:2;19650:7;19659:5;19637:8;:28::i;:::-;19364:309;19302:371;;:::o;37858:540::-;37982:1;37972:6;;:11;37964:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;38051:16;;38041:8;38027:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;38019:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;38128:31;38140:6;;38128:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38148:10;38128:11;:31::i;:::-;38120:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;38240:16;;38207:18;:30;38226:10;38207:30;;;;;;;;;;;;;;;;:49;38199:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;38334:8;38300:18;:30;38319:10;38300:30;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;38357:31;38367:10;38379:8;38357:9;:31::i;:::-;37858:540;;;:::o;14372:303::-;14416:7;14641:15;:13;:15::i;:::-;14626:12;;14610:13;;:28;:46;14603:53;;14372:303;:::o;37367:53::-;;;;;;;;;;;;;;;;;:::o;33500:22::-;;;;:::o;20604:170::-;20738:28;20748:4;20754:2;20758:7;20738:9;:28::i;:::-;20604:170;;;:::o;36852:217::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36942:7:::1;;36930:8;:19;;36922:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37009:8;36998:7;;:19;;;;;;;:::i;:::-;;;;;;;;37028:31;37038:10;37050:8;37028:9;:31::i;:::-;36852:217:::0;:::o;38407:130::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38512:17:::1;38493:16;:36;;;;38407:130:::0;:::o;36251:98::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36334:9:::1;36326:5;:17;;;;36251:98:::0;:::o;20845:185::-;20983:39;21000:4;21006:2;21010:7;20983:39;;;;;;;;;;;;:16;:39::i;:::-;20845:185;;;:::o;36544:73::-;36584:4;36605:6;;36598:13;;36544:73;:::o;32968:38::-;;;;:::o;35496:98::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35581:7:::1;35565:13;:23;;;;;;;;;;;;:::i;:::-;;35496:98:::0;:::o;35391:99::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35481:3:::1;35463:15;:21;;;;;;;;;;;;:::i;:::-;;35391:99:::0;:::o;33308:29::-;;;;;;;;;;;;;:::o;18044:125::-;18108:7;18135:21;18148:7;18135:12;:21::i;:::-;:26;;;18128:33;;18044:125;;;:::o;36465:72::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36530:1:::1;36521:6;:10;;;;36465:72:::0;:::o;36622:98::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36703:9:::1;36695:7;:17;;;;36622:98:::0;:::o;15492:206::-;15556:7;15597:1;15580:19;;:5;:19;;;15576:60;;;15608:28;;;;;;;;;;;;;;15576:60;15662:12;:19;15675:5;15662:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;15654:36;;15647:43;;15492:206;;;:::o;5154:103::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5219:30:::1;5246:1;5219:18;:30::i;:::-;5154:103::o:0;33048:50::-;;;;;;;;;;;;;;;;;:::o;37284:35::-;;;;:::o;37075:158::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33196:4:::1;37157:1;37141:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:41;;37133:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;37212:15;37222:1;37225;37212:9;:15::i;:::-;37075:158:::0;;:::o;33105:35::-;;;;:::o;4931:87::-;4977:7;5004:6;;;;;;;;;;;4997:13;;4931:87;:::o;35821:148::-;35902:21;;:::i;:::-;35942;35955:7;35942:12;:21::i;:::-;35935:28;;35821:148;;;:::o;18405:104::-;18461:13;18494:7;18487:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18405:104;:::o;34015:614::-;33949:10;33936:23;;:9;:23;;;33928:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34102:1:::1;34092:6;;:11;34084:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;34143:20;:32;34164:10;34143:32;;;;;;;;;;;;;;;;;;;;;;;;;34142:33;34134:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34264:7;;33196:4;34243:28;;;;:::i;:::-;34231:8;34215:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:56;;34207:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34321:19;;34309:8;:31;;34301:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34402:8;34394:5;;:16;;;;:::i;:::-;34381:9;:29;;34373:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;34479:8;34448:15;:27;34464:10;34448:27;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;34533:19;;34502:15;:27;34518:10;34502:27;;;;;;;;;;;;;;;;:50;;34494:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;34592:31;34602:10;34614:8;34592:9;:31::i;:::-;34015:614:::0;:::o;20015:287::-;20126:12;:10;:12::i;:::-;20114:24;;:8;:24;;;20110:54;;;20147:17;;;;;;;;;;;;;;20110:54;20222:8;20177:18;:32;20196:12;:10;:12::i;:::-;20177:32;;;;;;;;;;;;;;;:42;20210:8;20177:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;20275:8;20246:48;;20261:12;:10;:12::i;:::-;20246:48;;;20285:8;20246:48;;;;;;:::i;:::-;;;;;;;;20015:287;;:::o;36353:106::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36452:1:::1;36430:19;:23;;;;36353:106:::0;:::o;37326:34::-;;;;:::o;35975:181::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2713:1:::1;2859:7;;:19;;2851:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2713:1;2920:7;:18;;;;36040:12:::2;36058:10;:15;;36081:21;36058:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36039:68;;;36122:7;36114:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;36032:124;2669:1:::1;2963:7;:22;;;;35975:181::o:0;21101:369::-;21268:28;21278:4;21284:2;21288:7;21268:9;:28::i;:::-;21311:15;:2;:13;;;:15::i;:::-;:76;;;;;21331:56;21362:4;21368:2;21372:7;21381:5;21331:30;:56::i;:::-;21330:57;21311:76;21307:156;;;21411:40;;;;;;;;;;;;;;21307:156;21101:369;;;;:::o;36162:83::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36230:9:::1;;;;;;;;;;;36229:10;36217:9;;:22;;;;;;;;;;;;;;;;;;36162:83::o:0;37501:142::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37615:20:::1;37593:19;:42;;;;37501:142:::0;:::o;34952:433::-;35025:13;35055:16;35063:7;35055;:16::i;:::-;35047:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;35132:9;;;;;;;;;;;35129:251;;;35149:21;35173:10;:8;:10::i;:::-;35149:34;;35228:1;35210:7;35204:21;:25;:109;;;;;;;;;;;;;;;;;35265:7;35279:18;:7;:16;:18::i;:::-;35248:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35204:109;35190:123;;;;;35129:251;35353:15;35346:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34952:433;;;;:::o;33410:23::-;;;;:::o;35710:107::-;35768:7;35791:20;35805:5;35791:13;:20::i;:::-;35784:27;;35710:107;;;:::o;37651:199::-;37734:4;37758:84;37777:6;37785:19;;37833:6;37816:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;37806:35;;;;;;37758:18;:84::i;:::-;37751:91;;37651:199;;;;:::o;36730:117::-;36788:7;36834:5;;36824:9;:15;;;;:::i;:::-;36817:22;;36730:117;;;:::o;20373:164::-;20470:4;20494:18;:25;20513:5;20494:25;;;;;;;;;;;;;;;:35;20520:8;20494:35;;;;;;;;;;;;;;;;;;;;;;;;;20487:42;;20373:164;;;;:::o;5266:201::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5375:1:::1;5355:22;;:8;:22;;;;5347:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5431:28;5450:8;5431:18;:28::i;:::-;5266:201:::0;:::o;34636:112::-;34695:4;34715:20;:27;34736:5;34715:27;;;;;;;;;;;;;;;;;;;;;;;;;34708:34;;34636:112;;;:::o;4474:98::-;4527:7;4554:10;4547:17;;4474:98;:::o;9584:157::-;9669:4;9708:25;9693:40;;;:11;:40;;;;9686:47;;9584:157;;;:::o;21725:174::-;21782:4;21825:7;21806:15;:13;:15::i;:::-;:26;;:53;;;;;21846:13;;21836:7;:23;21806:53;:85;;;;;21864:11;:20;21876:7;21864:20;;;;;;;;;;;:27;;;;;;;;;;;;21863:28;21806:85;21799:92;;21725:174;;;:::o;29882:196::-;30024:2;29997:15;:24;30013:7;29997:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30062:7;30058:2;30042:28;;30051:5;30042:28;;;;;;;;;;;;29882:196;;;:::o;21907:104::-;21976:27;21986:2;21990:8;21976:27;;;;;;;;;;;;:9;:27::i;:::-;21907:104;;:::o;14146:92::-;14202:7;14229:1;14222:8;;14146:92;:::o;24825:2130::-;24940:35;24978:21;24991:7;24978:12;:21::i;:::-;24940:59;;25038:4;25016:26;;:13;:18;;;:26;;;25012:67;;25051:28;;;;;;;;;;;;;;25012:67;25092:22;25134:4;25118:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;25155:36;25172:4;25178:12;:10;:12::i;:::-;25155:16;:36::i;:::-;25118:73;:126;;;;25232:12;:10;:12::i;:::-;25208:36;;:20;25220:7;25208:11;:20::i;:::-;:36;;;25118:126;25092:153;;25263:17;25258:66;;25289:35;;;;;;;;;;;;;;25258:66;25353:1;25339:16;;:2;:16;;;25335:52;;;25364:23;;;;;;;;;;;;;;25335:52;25400:43;25422:4;25428:2;25432:7;25441:1;25400:21;:43::i;:::-;25508:35;25525:1;25529:7;25538:4;25508:8;:35::i;:::-;25869:1;25839:12;:18;25852:4;25839:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25913:1;25885:12;:16;25898:2;25885:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25931:31;25965:11;:20;25977:7;25965:20;;;;;;;;;;;25931:54;;26016:2;26000:8;:13;;;:18;;;;;;;;;;;;;;;;;;26066:15;26033:8;:23;;;:49;;;;;;;;;;;;;;;;;;26334:19;26366:1;26356:7;:11;26334:33;;26382:31;26416:11;:24;26428:11;26416:24;;;;;;;;;;;26382:58;;26484:1;26459:27;;:8;:13;;;;;;;;;;;;:27;;;26455:384;;;26669:13;;26654:11;:28;26650:174;;26723:4;26707:8;:13;;;:20;;;;;;;;;;;;;;;;;;26776:13;:28;;;26750:8;:23;;;:54;;;;;;;;;;;;;;;;;;26650:174;26455:384;25814:1036;;;26886:7;26882:2;26867:27;;26876:4;26867:27;;;;;;;;;;;;26905:42;26926:4;26932:2;26936:7;26945:1;26905:20;:42::i;:::-;24929:2026;;24825:2130;;;:::o;16873:1109::-;16935:21;;:::i;:::-;16969:12;16984:7;16969:22;;17052:4;17033:15;:13;:15::i;:::-;:23;;:47;;;;;17067:13;;17060:4;:20;17033:47;17029:886;;;17101:31;17135:11;:17;17147:4;17135:17;;;;;;;;;;;17101:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17176:9;:16;;;17171:729;;17247:1;17221:28;;:9;:14;;;:28;;;17217:101;;17285:9;17278:16;;;;;;17217:101;17620:261;17627:4;17620:261;;;17660:6;;;;;;;;17705:11;:17;17717:4;17705:17;;;;;;;;;;;17693:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17779:1;17753:28;;:9;:14;;;:28;;;17749:109;;17821:9;17814:16;;;;;;17749:109;17620:261;;;17171:729;17082:833;17029:886;17943:31;;;;;;;;;;;;;;16873:1109;;;;:::o;5476:191::-;5550:16;5569:6;;;;;;;;;;;5550:25;;5595:8;5586:6;;:17;;;;;;;;;;;;;;;;;;5650:8;5619:40;;5640:8;5619:40;;;;;;;;;;;;5539:128;5476:191;:::o;5699:197::-;5759:4;5777:12;5844:7;5832:20;5824:28;;5887:1;5880:4;:8;5873:15;;;5699:197;;;:::o;30570:667::-;30733:4;30770:2;30754:36;;;30791:12;:10;:12::i;:::-;30805:4;30811:7;30820:5;30754:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30750:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31005:1;30988:6;:13;:18;30984:235;;;31034:40;;;;;;;;;;;;;;30984:235;31177:6;31171:13;31162:6;31158:2;31154:15;31147:38;30750:480;30883:45;;;30873:55;;;:6;:55;;;;30866:62;;;30570:667;;;;;;:::o;35598:108::-;35658:13;35687;35680:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35598:108;:::o;3091:533::-;3147:13;3187:1;3178:5;:10;3174:53;;;3205:10;;;;;;;;;;;;;;;;;;;;;3174:53;3237:12;3252:5;3237:20;;3268:14;3293:78;3308:1;3300:4;:9;3293:78;;3326:8;;;;;:::i;:::-;;;;3357:2;3349:10;;;;;:::i;:::-;;;3293:78;;;3381:19;3413:6;3403:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3381:39;;3431:154;3447:1;3438:5;:10;3431:154;;3475:1;3465:11;;;;;:::i;:::-;;;3542:2;3534:5;:10;;;;:::i;:::-;3521:2;:24;;;;:::i;:::-;3508:39;;3491:6;3498;3491:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3571:2;3562:11;;;;;:::i;:::-;;;3431:154;;;3609:6;3595:21;;;;;3091:533;;;;:::o;15780:137::-;15841:7;15876:12;:19;15889:5;15876:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;15868:41;;15861:48;;15780:137;;;:::o;1094:190::-;1219:4;1272;1243:25;1256:5;1263:4;1243:12;:25::i;:::-;:33;1236:40;;1094:190;;;;;:::o;22374:163::-;22497:32;22503:2;22507:8;22517:5;22524:4;22497:5;:32::i;:::-;22374:163;;;:::o;31885:159::-;;;;;:::o;32703:158::-;;;;;:::o;1645:675::-;1728:7;1748:20;1771:4;1748:27;;1791:9;1786:497;1810:5;:12;1806:1;:16;1786:497;;;1844:20;1867:5;1873:1;1867:8;;;;;;;;:::i;:::-;;;;;;;;1844:31;;1910:12;1894;:28;1890:382;;2037:42;2052:12;2066;2037:14;:42::i;:::-;2022:57;;1890:382;;;2214:42;2229:12;2243;2214:14;:42::i;:::-;2199:57;;1890:382;1829:454;1824:3;;;;;:::i;:::-;;;;1786:497;;;;2300:12;2293:19;;;1645:675;;;;:::o;22796:1775::-;22935:20;22958:13;;22935:36;;23000:1;22986:16;;:2;:16;;;22982:48;;;23011:19;;;;;;;;;;;;;;22982:48;23057:1;23045:8;:13;23041:44;;;23067:18;;;;;;;;;;;;;;23041:44;23098:61;23128:1;23132:2;23136:12;23150:8;23098:21;:61::i;:::-;23471:8;23436:12;:16;23449:2;23436:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23535:8;23495:12;:16;23508:2;23495:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23594:2;23561:11;:25;23573:12;23561:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;23661:15;23611:11;:25;23623:12;23611:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;23694:20;23717:12;23694:35;;23744:11;23773:8;23758:12;:23;23744:37;;23802:4;:23;;;;;23810:15;:2;:13;;;:15::i;:::-;23802:23;23798:641;;;23846:314;23902:12;23898:2;23877:38;;23894:1;23877:38;;;;;;;;;;;;23943:69;23982:1;23986:2;23990:14;;;;;;24006:5;23943:30;:69::i;:::-;23938:174;;24048:40;;;;;;;;;;;;;;23938:174;24155:3;24139:12;:19;;23846:314;;24241:12;24224:13;;:29;24220:43;;24255:8;;;24220:43;23798:641;;;24304:120;24360:14;;;;;;24356:2;24335:40;;24352:1;24335:40;;;;;;;;;;;;24419:3;24403:12;:19;;24304:120;;23798:641;24469:12;24453:13;:28;;;;23411:1082;;24503:60;24532:1;24536:2;24540:12;24554:8;24503:20;:60::i;:::-;22924:1647;22796:1775;;;;:::o;2328:224::-;2396:13;2459:1;2453:4;2446:15;2488:1;2482:4;2475:15;2529:4;2523;2513:21;2504:30;;2328:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:568::-;1821:8;1831:6;1881:3;1874:4;1866:6;1862:17;1858:27;1848:122;;1889:79;;:::i;:::-;1848:122;2002:6;1989:20;1979:30;;2032:18;2024:6;2021:30;2018:117;;;2054:79;;:::i;:::-;2018:117;2168:4;2160:6;2156:17;2144:29;;2222:3;2214:4;2206:6;2202:17;2192:8;2188:32;2185:41;2182:128;;;2229:79;;:::i;:::-;2182:128;1748:568;;;;;:::o;2339:::-;2412:8;2422:6;2472:3;2465:4;2457:6;2453:17;2449:27;2439:122;;2480:79;;:::i;:::-;2439:122;2593:6;2580:20;2570:30;;2623:18;2615:6;2612:30;2609:117;;;2645:79;;:::i;:::-;2609:117;2759:4;2751:6;2747:17;2735:29;;2813:3;2805:4;2797:6;2793:17;2783:8;2779:32;2776:41;2773:128;;;2820:79;;:::i;:::-;2773:128;2339:568;;;;;:::o;2930:370::-;3001:5;3050:3;3043:4;3035:6;3031:17;3027:27;3017:122;;3058:79;;:::i;:::-;3017:122;3175:6;3162:20;3200:94;3290:3;3282:6;3275:4;3267:6;3263:17;3200:94;:::i;:::-;3191:103;;3007:293;2930:370;;;;:::o;3306:133::-;3349:5;3387:6;3374:20;3365:29;;3403:30;3427:5;3403:30;:::i;:::-;3306:133;;;;:::o;3445:139::-;3491:5;3529:6;3516:20;3507:29;;3545:33;3572:5;3545:33;:::i;:::-;3445:139;;;;:::o;3590:137::-;3635:5;3673:6;3660:20;3651:29;;3689:32;3715:5;3689:32;:::i;:::-;3590:137;;;;:::o;3733:141::-;3789:5;3820:6;3814:13;3805:22;;3836:32;3862:5;3836:32;:::i;:::-;3733:141;;;;:::o;3893:338::-;3948:5;3997:3;3990:4;3982:6;3978:17;3974:27;3964:122;;4005:79;;:::i;:::-;3964:122;4122:6;4109:20;4147:78;4221:3;4213:6;4206:4;4198:6;4194:17;4147:78;:::i;:::-;4138:87;;3954:277;3893:338;;;;:::o;4251:340::-;4307:5;4356:3;4349:4;4341:6;4337:17;4333:27;4323:122;;4364:79;;:::i;:::-;4323:122;4481:6;4468:20;4506:79;4581:3;4573:6;4566:4;4558:6;4554:17;4506:79;:::i;:::-;4497:88;;4313:278;4251:340;;;;:::o;4597:139::-;4643:5;4681:6;4668:20;4659:29;;4697:33;4724:5;4697:33;:::i;:::-;4597:139;;;;:::o;4742:329::-;4801:6;4850:2;4838:9;4829:7;4825:23;4821:32;4818:119;;;4856:79;;:::i;:::-;4818:119;4976:1;5001:53;5046:7;5037:6;5026:9;5022:22;5001:53;:::i;:::-;4991:63;;4947:117;4742:329;;;;:::o;5077:474::-;5145:6;5153;5202:2;5190:9;5181:7;5177:23;5173:32;5170:119;;;5208:79;;:::i;:::-;5170:119;5328:1;5353:53;5398:7;5389:6;5378:9;5374:22;5353:53;:::i;:::-;5343:63;;5299:117;5455:2;5481:53;5526:7;5517:6;5506:9;5502:22;5481:53;:::i;:::-;5471:63;;5426:118;5077:474;;;;;:::o;5557:619::-;5634:6;5642;5650;5699:2;5687:9;5678:7;5674:23;5670:32;5667:119;;;5705:79;;:::i;:::-;5667:119;5825:1;5850:53;5895:7;5886:6;5875:9;5871:22;5850:53;:::i;:::-;5840:63;;5796:117;5952:2;5978:53;6023:7;6014:6;6003:9;5999:22;5978:53;:::i;:::-;5968:63;;5923:118;6080:2;6106:53;6151:7;6142:6;6131:9;6127:22;6106:53;:::i;:::-;6096:63;;6051:118;5557:619;;;;;:::o;6182:943::-;6277:6;6285;6293;6301;6350:3;6338:9;6329:7;6325:23;6321:33;6318:120;;;6357:79;;:::i;:::-;6318:120;6477:1;6502:53;6547:7;6538:6;6527:9;6523:22;6502:53;:::i;:::-;6492:63;;6448:117;6604:2;6630:53;6675:7;6666:6;6655:9;6651:22;6630:53;:::i;:::-;6620:63;;6575:118;6732:2;6758:53;6803:7;6794:6;6783:9;6779:22;6758:53;:::i;:::-;6748:63;;6703:118;6888:2;6877:9;6873:18;6860:32;6919:18;6911:6;6908:30;6905:117;;;6941:79;;:::i;:::-;6905:117;7046:62;7100:7;7091:6;7080:9;7076:22;7046:62;:::i;:::-;7036:72;;6831:287;6182:943;;;;;;;:::o;7131:468::-;7196:6;7204;7253:2;7241:9;7232:7;7228:23;7224:32;7221:119;;;7259:79;;:::i;:::-;7221:119;7379:1;7404:53;7449:7;7440:6;7429:9;7425:22;7404:53;:::i;:::-;7394:63;;7350:117;7506:2;7532:50;7574:7;7565:6;7554:9;7550:22;7532:50;:::i;:::-;7522:60;;7477:115;7131:468;;;;;:::o;7605:474::-;7673:6;7681;7730:2;7718:9;7709:7;7705:23;7701:32;7698:119;;;7736:79;;:::i;:::-;7698:119;7856:1;7881:53;7926:7;7917:6;7906:9;7902:22;7881:53;:::i;:::-;7871:63;;7827:117;7983:2;8009:53;8054:7;8045:6;8034:9;8030:22;8009:53;:::i;:::-;7999:63;;7954:118;7605:474;;;;;:::o;8085:559::-;8171:6;8179;8228:2;8216:9;8207:7;8203:23;8199:32;8196:119;;;8234:79;;:::i;:::-;8196:119;8382:1;8371:9;8367:17;8354:31;8412:18;8404:6;8401:30;8398:117;;;8434:79;;:::i;:::-;8398:117;8547:80;8619:7;8610:6;8599:9;8595:22;8547:80;:::i;:::-;8529:98;;;;8325:312;8085:559;;;;;:::o;8650:684::-;8743:6;8751;8800:2;8788:9;8779:7;8775:23;8771:32;8768:119;;;8806:79;;:::i;:::-;8768:119;8954:1;8943:9;8939:17;8926:31;8984:18;8976:6;8973:30;8970:117;;;9006:79;;:::i;:::-;8970:117;9111:78;9181:7;9172:6;9161:9;9157:22;9111:78;:::i;:::-;9101:88;;8897:302;9238:2;9264:53;9309:7;9300:6;9289:9;9285:22;9264:53;:::i;:::-;9254:63;;9209:118;8650:684;;;;;:::o;9340:329::-;9399:6;9448:2;9436:9;9427:7;9423:23;9419:32;9416:119;;;9454:79;;:::i;:::-;9416:119;9574:1;9599:53;9644:7;9635:6;9624:9;9620:22;9599:53;:::i;:::-;9589:63;;9545:117;9340:329;;;;:::o;9675:327::-;9733:6;9782:2;9770:9;9761:7;9757:23;9753:32;9750:119;;;9788:79;;:::i;:::-;9750:119;9908:1;9933:52;9977:7;9968:6;9957:9;9953:22;9933:52;:::i;:::-;9923:62;;9879:116;9675:327;;;;:::o;10008:349::-;10077:6;10126:2;10114:9;10105:7;10101:23;10097:32;10094:119;;;10132:79;;:::i;:::-;10094:119;10252:1;10277:63;10332:7;10323:6;10312:9;10308:22;10277:63;:::i;:::-;10267:73;;10223:127;10008:349;;;;:::o;10363:509::-;10432:6;10481:2;10469:9;10460:7;10456:23;10452:32;10449:119;;;10487:79;;:::i;:::-;10449:119;10635:1;10624:9;10620:17;10607:31;10665:18;10657:6;10654:30;10651:117;;;10687:79;;:::i;:::-;10651:117;10792:63;10847:7;10838:6;10827:9;10823:22;10792:63;:::i;:::-;10782:73;;10578:287;10363:509;;;;:::o;10878:329::-;10937:6;10986:2;10974:9;10965:7;10961:23;10957:32;10954:119;;;10992:79;;:::i;:::-;10954:119;11112:1;11137:53;11182:7;11173:6;11162:9;11158:22;11137:53;:::i;:::-;11127:63;;11083:117;10878:329;;;;:::o;11213:704::-;11308:6;11316;11324;11373:2;11361:9;11352:7;11348:23;11344:32;11341:119;;;11379:79;;:::i;:::-;11341:119;11499:1;11524:53;11569:7;11560:6;11549:9;11545:22;11524:53;:::i;:::-;11514:63;;11470:117;11654:2;11643:9;11639:18;11626:32;11685:18;11677:6;11674:30;11671:117;;;11707:79;;:::i;:::-;11671:117;11820:80;11892:7;11883:6;11872:9;11868:22;11820:80;:::i;:::-;11802:98;;;;11597:313;11213:704;;;;;:::o;11923:108::-;12000:24;12018:5;12000:24;:::i;:::-;11995:3;11988:37;11923:108;;:::o;12037:118::-;12124:24;12142:5;12124:24;:::i;:::-;12119:3;12112:37;12037:118;;:::o;12161:157::-;12266:45;12286:24;12304:5;12286:24;:::i;:::-;12266:45;:::i;:::-;12261:3;12254:58;12161:157;;:::o;12324:99::-;12395:21;12410:5;12395:21;:::i;:::-;12390:3;12383:34;12324:99;;:::o;12429:109::-;12510:21;12525:5;12510:21;:::i;:::-;12505:3;12498:34;12429:109;;:::o;12544:118::-;12631:24;12649:5;12631:24;:::i;:::-;12626:3;12619:37;12544:118;;:::o;12668:360::-;12754:3;12782:38;12814:5;12782:38;:::i;:::-;12836:70;12899:6;12894:3;12836:70;:::i;:::-;12829:77;;12915:52;12960:6;12955:3;12948:4;12941:5;12937:16;12915:52;:::i;:::-;12992:29;13014:6;12992:29;:::i;:::-;12987:3;12983:39;12976:46;;12758:270;12668:360;;;;:::o;13034:364::-;13122:3;13150:39;13183:5;13150:39;:::i;:::-;13205:71;13269:6;13264:3;13205:71;:::i;:::-;13198:78;;13285:52;13330:6;13325:3;13318:4;13311:5;13307:16;13285:52;:::i;:::-;13362:29;13384:6;13362:29;:::i;:::-;13357:3;13353:39;13346:46;;13126:272;13034:364;;;;:::o;13404:377::-;13510:3;13538:39;13571:5;13538:39;:::i;:::-;13593:89;13675:6;13670:3;13593:89;:::i;:::-;13586:96;;13691:52;13736:6;13731:3;13724:4;13717:5;13713:16;13691:52;:::i;:::-;13768:6;13763:3;13759:16;13752:23;;13514:267;13404:377;;;;:::o;13787:366::-;13929:3;13950:67;14014:2;14009:3;13950:67;:::i;:::-;13943:74;;14026:93;14115:3;14026:93;:::i;:::-;14144:2;14139:3;14135:12;14128:19;;13787:366;;;:::o;14159:::-;14301:3;14322:67;14386:2;14381:3;14322:67;:::i;:::-;14315:74;;14398:93;14487:3;14398:93;:::i;:::-;14516:2;14511:3;14507:12;14500:19;;14159:366;;;:::o;14531:::-;14673:3;14694:67;14758:2;14753:3;14694:67;:::i;:::-;14687:74;;14770:93;14859:3;14770:93;:::i;:::-;14888:2;14883:3;14879:12;14872:19;;14531:366;;;:::o;14903:::-;15045:3;15066:67;15130:2;15125:3;15066:67;:::i;:::-;15059:74;;15142:93;15231:3;15142:93;:::i;:::-;15260:2;15255:3;15251:12;15244:19;;14903:366;;;:::o;15275:::-;15417:3;15438:67;15502:2;15497:3;15438:67;:::i;:::-;15431:74;;15514:93;15603:3;15514:93;:::i;:::-;15632:2;15627:3;15623:12;15616:19;;15275:366;;;:::o;15647:::-;15789:3;15810:67;15874:2;15869:3;15810:67;:::i;:::-;15803:74;;15886:93;15975:3;15886:93;:::i;:::-;16004:2;15999:3;15995:12;15988:19;;15647:366;;;:::o;16019:::-;16161:3;16182:67;16246:2;16241:3;16182:67;:::i;:::-;16175:74;;16258:93;16347:3;16258:93;:::i;:::-;16376:2;16371:3;16367:12;16360:19;;16019:366;;;:::o;16391:::-;16533:3;16554:67;16618:2;16613:3;16554:67;:::i;:::-;16547:74;;16630:93;16719:3;16630:93;:::i;:::-;16748:2;16743:3;16739:12;16732:19;;16391:366;;;:::o;16763:400::-;16923:3;16944:84;17026:1;17021:3;16944:84;:::i;:::-;16937:91;;17037:93;17126:3;17037:93;:::i;:::-;17155:1;17150:3;17146:11;17139:18;;16763:400;;;:::o;17169:366::-;17311:3;17332:67;17396:2;17391:3;17332:67;:::i;:::-;17325:74;;17408:93;17497:3;17408:93;:::i;:::-;17526:2;17521:3;17517:12;17510:19;;17169:366;;;:::o;17541:::-;17683:3;17704:67;17768:2;17763:3;17704:67;:::i;:::-;17697:74;;17780:93;17869:3;17780:93;:::i;:::-;17898:2;17893:3;17889:12;17882:19;;17541:366;;;:::o;17913:::-;18055:3;18076:67;18140:2;18135:3;18076:67;:::i;:::-;18069:74;;18152:93;18241:3;18152:93;:::i;:::-;18270:2;18265:3;18261:12;18254:19;;17913:366;;;:::o;18285:398::-;18444:3;18465:83;18546:1;18541:3;18465:83;:::i;:::-;18458:90;;18557:93;18646:3;18557:93;:::i;:::-;18675:1;18670:3;18666:11;18659:18;;18285:398;;;:::o;18689:366::-;18831:3;18852:67;18916:2;18911:3;18852:67;:::i;:::-;18845:74;;18928:93;19017:3;18928:93;:::i;:::-;19046:2;19041:3;19037:12;19030:19;;18689:366;;;:::o;19061:::-;19203:3;19224:67;19288:2;19283:3;19224:67;:::i;:::-;19217:74;;19300:93;19389:3;19300:93;:::i;:::-;19418:2;19413:3;19409:12;19402:19;;19061:366;;;:::o;19433:::-;19575:3;19596:67;19660:2;19655:3;19596:67;:::i;:::-;19589:74;;19672:93;19761:3;19672:93;:::i;:::-;19790:2;19785:3;19781:12;19774:19;;19433:366;;;:::o;19805:::-;19947:3;19968:67;20032:2;20027:3;19968:67;:::i;:::-;19961:74;;20044:93;20133:3;20044:93;:::i;:::-;20162:2;20157:3;20153:12;20146:19;;19805:366;;;:::o;20177:::-;20319:3;20340:67;20404:2;20399:3;20340:67;:::i;:::-;20333:74;;20416:93;20505:3;20416:93;:::i;:::-;20534:2;20529:3;20525:12;20518:19;;20177:366;;;:::o;20549:400::-;20709:3;20730:84;20812:1;20807:3;20730:84;:::i;:::-;20723:91;;20823:93;20912:3;20823:93;:::i;:::-;20941:1;20936:3;20932:11;20925:18;;20549:400;;;:::o;21025:697::-;21184:4;21179:3;21175:14;21271:4;21264:5;21260:16;21254:23;21290:63;21347:4;21342:3;21338:14;21324:12;21290:63;:::i;:::-;21199:164;21455:4;21448:5;21444:16;21438:23;21474:61;21529:4;21524:3;21520:14;21506:12;21474:61;:::i;:::-;21373:172;21629:4;21622:5;21618:16;21612:23;21648:57;21699:4;21694:3;21690:14;21676:12;21648:57;:::i;:::-;21555:160;21153:569;21025:697;;:::o;21728:118::-;21815:24;21833:5;21815:24;:::i;:::-;21810:3;21803:37;21728:118;;:::o;21852:105::-;21927:23;21944:5;21927:23;:::i;:::-;21922:3;21915:36;21852:105;;:::o;21963:256::-;22075:3;22090:75;22161:3;22152:6;22090:75;:::i;:::-;22190:2;22185:3;22181:12;22174:19;;22210:3;22203:10;;21963:256;;;;:::o;22225:967::-;22607:3;22629:95;22720:3;22711:6;22629:95;:::i;:::-;22622:102;;22741:148;22885:3;22741:148;:::i;:::-;22734:155;;22906:95;22997:3;22988:6;22906:95;:::i;:::-;22899:102;;23018:148;23162:3;23018:148;:::i;:::-;23011:155;;23183:3;23176:10;;22225:967;;;;;:::o;23198:379::-;23382:3;23404:147;23547:3;23404:147;:::i;:::-;23397:154;;23568:3;23561:10;;23198:379;;;:::o;23583:222::-;23676:4;23714:2;23703:9;23699:18;23691:26;;23727:71;23795:1;23784:9;23780:17;23771:6;23727:71;:::i;:::-;23583:222;;;;:::o;23811:640::-;24006:4;24044:3;24033:9;24029:19;24021:27;;24058:71;24126:1;24115:9;24111:17;24102:6;24058:71;:::i;:::-;24139:72;24207:2;24196:9;24192:18;24183:6;24139:72;:::i;:::-;24221;24289:2;24278:9;24274:18;24265:6;24221:72;:::i;:::-;24340:9;24334:4;24330:20;24325:2;24314:9;24310:18;24303:48;24368:76;24439:4;24430:6;24368:76;:::i;:::-;24360:84;;23811:640;;;;;;;:::o;24457:210::-;24544:4;24582:2;24571:9;24567:18;24559:26;;24595:65;24657:1;24646:9;24642:17;24633:6;24595:65;:::i;:::-;24457:210;;;;:::o;24673:222::-;24766:4;24804:2;24793:9;24789:18;24781:26;;24817:71;24885:1;24874:9;24870:17;24861:6;24817:71;:::i;:::-;24673:222;;;;:::o;24901:313::-;25014:4;25052:2;25041:9;25037:18;25029:26;;25101:9;25095:4;25091:20;25087:1;25076:9;25072:17;25065:47;25129:78;25202:4;25193:6;25129:78;:::i;:::-;25121:86;;24901:313;;;;:::o;25220:419::-;25386:4;25424:2;25413:9;25409:18;25401:26;;25473:9;25467:4;25463:20;25459:1;25448:9;25444:17;25437:47;25501:131;25627:4;25501:131;:::i;:::-;25493:139;;25220:419;;;:::o;25645:::-;25811:4;25849:2;25838:9;25834:18;25826:26;;25898:9;25892:4;25888:20;25884:1;25873:9;25869:17;25862:47;25926:131;26052:4;25926:131;:::i;:::-;25918:139;;25645:419;;;:::o;26070:::-;26236:4;26274:2;26263:9;26259:18;26251:26;;26323:9;26317:4;26313:20;26309:1;26298:9;26294:17;26287:47;26351:131;26477:4;26351:131;:::i;:::-;26343:139;;26070:419;;;:::o;26495:::-;26661:4;26699:2;26688:9;26684:18;26676:26;;26748:9;26742:4;26738:20;26734:1;26723:9;26719:17;26712:47;26776:131;26902:4;26776:131;:::i;:::-;26768:139;;26495:419;;;:::o;26920:::-;27086:4;27124:2;27113:9;27109:18;27101:26;;27173:9;27167:4;27163:20;27159:1;27148:9;27144:17;27137:47;27201:131;27327:4;27201:131;:::i;:::-;27193:139;;26920:419;;;:::o;27345:::-;27511:4;27549:2;27538:9;27534:18;27526:26;;27598:9;27592:4;27588:20;27584:1;27573:9;27569:17;27562:47;27626:131;27752:4;27626:131;:::i;:::-;27618:139;;27345:419;;;:::o;27770:::-;27936:4;27974:2;27963:9;27959:18;27951:26;;28023:9;28017:4;28013:20;28009:1;27998:9;27994:17;27987:47;28051:131;28177:4;28051:131;:::i;:::-;28043:139;;27770:419;;;:::o;28195:::-;28361:4;28399:2;28388:9;28384:18;28376:26;;28448:9;28442:4;28438:20;28434:1;28423:9;28419:17;28412:47;28476:131;28602:4;28476:131;:::i;:::-;28468:139;;28195:419;;;:::o;28620:::-;28786:4;28824:2;28813:9;28809:18;28801:26;;28873:9;28867:4;28863:20;28859:1;28848:9;28844:17;28837:47;28901:131;29027:4;28901:131;:::i;:::-;28893:139;;28620:419;;;:::o;29045:::-;29211:4;29249:2;29238:9;29234:18;29226:26;;29298:9;29292:4;29288:20;29284:1;29273:9;29269:17;29262:47;29326:131;29452:4;29326:131;:::i;:::-;29318:139;;29045:419;;;:::o;29470:::-;29636:4;29674:2;29663:9;29659:18;29651:26;;29723:9;29717:4;29713:20;29709:1;29698:9;29694:17;29687:47;29751:131;29877:4;29751:131;:::i;:::-;29743:139;;29470:419;;;:::o;29895:::-;30061:4;30099:2;30088:9;30084:18;30076:26;;30148:9;30142:4;30138:20;30134:1;30123:9;30119:17;30112:47;30176:131;30302:4;30176:131;:::i;:::-;30168:139;;29895:419;;;:::o;30320:::-;30486:4;30524:2;30513:9;30509:18;30501:26;;30573:9;30567:4;30563:20;30559:1;30548:9;30544:17;30537:47;30601:131;30727:4;30601:131;:::i;:::-;30593:139;;30320:419;;;:::o;30745:::-;30911:4;30949:2;30938:9;30934:18;30926:26;;30998:9;30992:4;30988:20;30984:1;30973:9;30969:17;30962:47;31026:131;31152:4;31026:131;:::i;:::-;31018:139;;30745:419;;;:::o;31170:::-;31336:4;31374:2;31363:9;31359:18;31351:26;;31423:9;31417:4;31413:20;31409:1;31398:9;31394:17;31387:47;31451:131;31577:4;31451:131;:::i;:::-;31443:139;;31170:419;;;:::o;31595:::-;31761:4;31799:2;31788:9;31784:18;31776:26;;31848:9;31842:4;31838:20;31834:1;31823:9;31819:17;31812:47;31876:131;32002:4;31876:131;:::i;:::-;31868:139;;31595:419;;;:::o;32020:346::-;32175:4;32213:2;32202:9;32198:18;32190:26;;32226:133;32356:1;32345:9;32341:17;32332:6;32226:133;:::i;:::-;32020:346;;;;:::o;32372:222::-;32465:4;32503:2;32492:9;32488:18;32480:26;;32516:71;32584:1;32573:9;32569:17;32560:6;32516:71;:::i;:::-;32372:222;;;;:::o;32600:129::-;32634:6;32661:20;;:::i;:::-;32651:30;;32690:33;32718:4;32710:6;32690:33;:::i;:::-;32600:129;;;:::o;32735:75::-;32768:6;32801:2;32795:9;32785:19;;32735:75;:::o;32816:311::-;32893:4;32983:18;32975:6;32972:30;32969:56;;;33005:18;;:::i;:::-;32969:56;33055:4;33047:6;33043:17;33035:25;;33115:4;33109;33105:15;33097:23;;32816:311;;;:::o;33133:307::-;33194:4;33284:18;33276:6;33273:30;33270:56;;;33306:18;;:::i;:::-;33270:56;33344:29;33366:6;33344:29;:::i;:::-;33336:37;;33428:4;33422;33418:15;33410:23;;33133:307;;;:::o;33446:308::-;33508:4;33598:18;33590:6;33587:30;33584:56;;;33620:18;;:::i;:::-;33584:56;33658:29;33680:6;33658:29;:::i;:::-;33650:37;;33742:4;33736;33732:15;33724:23;;33446:308;;;:::o;33760:98::-;33811:6;33845:5;33839:12;33829:22;;33760:98;;;:::o;33864:99::-;33916:6;33950:5;33944:12;33934:22;;33864:99;;;:::o;33969:168::-;34052:11;34086:6;34081:3;34074:19;34126:4;34121:3;34117:14;34102:29;;33969:168;;;;:::o;34143:147::-;34244:11;34281:3;34266:18;;34143:147;;;;:::o;34296:169::-;34380:11;34414:6;34409:3;34402:19;34454:4;34449:3;34445:14;34430:29;;34296:169;;;;:::o;34471:148::-;34573:11;34610:3;34595:18;;34471:148;;;;:::o;34625:305::-;34665:3;34684:20;34702:1;34684:20;:::i;:::-;34679:25;;34718:20;34736:1;34718:20;:::i;:::-;34713:25;;34872:1;34804:66;34800:74;34797:1;34794:81;34791:107;;;34878:18;;:::i;:::-;34791:107;34922:1;34919;34915:9;34908:16;;34625:305;;;;:::o;34936:185::-;34976:1;34993:20;35011:1;34993:20;:::i;:::-;34988:25;;35027:20;35045:1;35027:20;:::i;:::-;35022:25;;35066:1;35056:35;;35071:18;;:::i;:::-;35056:35;35113:1;35110;35106:9;35101:14;;34936:185;;;;:::o;35127:348::-;35167:7;35190:20;35208:1;35190:20;:::i;:::-;35185:25;;35224:20;35242:1;35224:20;:::i;:::-;35219:25;;35412:1;35344:66;35340:74;35337:1;35334:81;35329:1;35322:9;35315:17;35311:105;35308:131;;;35419:18;;:::i;:::-;35308:131;35467:1;35464;35460:9;35449:20;;35127:348;;;;:::o;35481:191::-;35521:4;35541:20;35559:1;35541:20;:::i;:::-;35536:25;;35575:20;35593:1;35575:20;:::i;:::-;35570:25;;35614:1;35611;35608:8;35605:34;;;35619:18;;:::i;:::-;35605:34;35664:1;35661;35657:9;35649:17;;35481:191;;;;:::o;35678:96::-;35715:7;35744:24;35762:5;35744:24;:::i;:::-;35733:35;;35678:96;;;:::o;35780:90::-;35814:7;35857:5;35850:13;35843:21;35832:32;;35780:90;;;:::o;35876:77::-;35913:7;35942:5;35931:16;;35876:77;;;:::o;35959:149::-;35995:7;36035:66;36028:5;36024:78;36013:89;;35959:149;;;:::o;36114:126::-;36151:7;36191:42;36184:5;36180:54;36169:65;;36114:126;;;:::o;36246:77::-;36283:7;36312:5;36301:16;;36246:77;;;:::o;36329:101::-;36365:7;36405:18;36398:5;36394:30;36383:41;;36329:101;;;:::o;36436:154::-;36520:6;36515:3;36510;36497:30;36582:1;36573:6;36568:3;36564:16;36557:27;36436:154;;;:::o;36596:307::-;36664:1;36674:113;36688:6;36685:1;36682:13;36674:113;;;36773:1;36768:3;36764:11;36758:18;36754:1;36749:3;36745:11;36738:39;36710:2;36707:1;36703:10;36698:15;;36674:113;;;36805:6;36802:1;36799:13;36796:101;;;36885:1;36876:6;36871:3;36867:16;36860:27;36796:101;36645:258;36596:307;;;:::o;36909:320::-;36953:6;36990:1;36984:4;36980:12;36970:22;;37037:1;37031:4;37027:12;37058:18;37048:81;;37114:4;37106:6;37102:17;37092:27;;37048:81;37176:2;37168:6;37165:14;37145:18;37142:38;37139:84;;;37195:18;;:::i;:::-;37139:84;36960:269;36909:320;;;:::o;37235:281::-;37318:27;37340:4;37318:27;:::i;:::-;37310:6;37306:40;37448:6;37436:10;37433:22;37412:18;37400:10;37397:34;37394:62;37391:88;;;37459:18;;:::i;:::-;37391:88;37499:10;37495:2;37488:22;37278:238;37235:281;;:::o;37522:233::-;37561:3;37584:24;37602:5;37584:24;:::i;:::-;37575:33;;37630:66;37623:5;37620:77;37617:103;;;37700:18;;:::i;:::-;37617:103;37747:1;37740:5;37736:13;37729:20;;37522:233;;;:::o;37761:100::-;37800:7;37829:26;37849:5;37829:26;:::i;:::-;37818:37;;37761:100;;;:::o;37867:94::-;37906:7;37935:20;37949:5;37935:20;:::i;:::-;37924:31;;37867:94;;;:::o;37967:176::-;37999:1;38016:20;38034:1;38016:20;:::i;:::-;38011:25;;38050:20;38068:1;38050:20;:::i;:::-;38045:25;;38089:1;38079:35;;38094:18;;:::i;:::-;38079:35;38135:1;38132;38128:9;38123:14;;37967:176;;;;:::o;38149:180::-;38197:77;38194:1;38187:88;38294:4;38291:1;38284:15;38318:4;38315:1;38308:15;38335:180;38383:77;38380:1;38373:88;38480:4;38477:1;38470:15;38504:4;38501:1;38494:15;38521:180;38569:77;38566:1;38559:88;38666:4;38663:1;38656:15;38690:4;38687:1;38680:15;38707:180;38755:77;38752:1;38745:88;38852:4;38849:1;38842:15;38876:4;38873:1;38866:15;38893:180;38941:77;38938:1;38931:88;39038:4;39035:1;39028:15;39062:4;39059:1;39052:15;39079:117;39188:1;39185;39178:12;39202:117;39311:1;39308;39301:12;39325:117;39434:1;39431;39424:12;39448:117;39557:1;39554;39547:12;39571:117;39680:1;39677;39670:12;39694:117;39803:1;39800;39793:12;39817:102;39858:6;39909:2;39905:7;39900:2;39893:5;39889:14;39885:28;39875:38;;39817:102;;;:::o;39925:94::-;39958:8;40006:5;40002:2;39998:14;39977:35;;39925:94;;;:::o;40025:225::-;40165:34;40161:1;40153:6;40149:14;40142:58;40234:8;40229:2;40221:6;40217:15;40210:33;40025:225;:::o;40256:169::-;40396:21;40392:1;40384:6;40380:14;40373:45;40256:169;:::o;40431:220::-;40571:34;40567:1;40559:6;40555:14;40548:58;40640:3;40635:2;40627:6;40623:15;40616:28;40431:220;:::o;40657:168::-;40797:20;40793:1;40785:6;40781:14;40774:44;40657:168;:::o;40831:170::-;40971:22;40967:1;40959:6;40955:14;40948:46;40831:170;:::o;41007:180::-;41147:32;41143:1;41135:6;41131:14;41124:56;41007:180;:::o;41193:168::-;41333:20;41329:1;41321:6;41317:14;41310:44;41193:168;:::o;41367:172::-;41507:24;41503:1;41495:6;41491:14;41484:48;41367:172;:::o;41545:155::-;41685:7;41681:1;41673:6;41669:14;41662:31;41545:155;:::o;41706:182::-;41846:34;41842:1;41834:6;41830:14;41823:58;41706:182;:::o;41894:225::-;42034:34;42030:1;42022:6;42018:14;42011:58;42103:8;42098:2;42090:6;42086:15;42079:33;41894:225;:::o;42125:234::-;42265:34;42261:1;42253:6;42249:14;42242:58;42334:17;42329:2;42321:6;42317:15;42310:42;42125:234;:::o;42365:114::-;;:::o;42485:166::-;42625:18;42621:1;42613:6;42609:14;42602:42;42485:166;:::o;42657:172::-;42797:24;42793:1;42785:6;42781:14;42774:48;42657:172;:::o;42835:::-;42975:24;42971:1;42963:6;42959:14;42952:48;42835:172;:::o;43013:178::-;43153:30;43149:1;43141:6;43137:14;43130:54;43013:178;:::o;43197:181::-;43337:33;43333:1;43325:6;43321:14;43314:57;43197:181;:::o;43384:151::-;43524:3;43520:1;43512:6;43508:14;43501:27;43384:151;:::o;43541:122::-;43614:24;43632:5;43614:24;:::i;:::-;43607:5;43604:35;43594:63;;43653:1;43650;43643:12;43594:63;43541:122;:::o;43669:116::-;43739:21;43754:5;43739:21;:::i;:::-;43732:5;43729:32;43719:60;;43775:1;43772;43765:12;43719:60;43669:116;:::o;43791:122::-;43864:24;43882:5;43864:24;:::i;:::-;43857:5;43854:35;43844:63;;43903:1;43900;43893:12;43844:63;43791:122;:::o;43919:120::-;43991:23;44008:5;43991:23;:::i;:::-;43984:5;43981:34;43971:62;;44029:1;44026;44019:12;43971:62;43919:120;:::o;44045:122::-;44118:24;44136:5;44118:24;:::i;:::-;44111:5;44108:35;44098:63;;44157:1;44154;44147:12;44098:63;44045:122;:::o

Swarm Source

ipfs://4af780be2e9932ac935db3f0fba645f14bd391381a2c4fc12cadae3ac357065e
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.