ETH Price: $3,486.87 (+2.11%)

Token

Non Fungible Tools Membership (NFTOOLS)
 

Overview

Max Total Supply

100 NFTOOLS

Holders

80

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
briannaa.eth
Balance
1 NFTOOLS
0x5034a9a16ca49dfa07885c52a803b3a4cd0779e9
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

As one of the 100 Founding Members you gain access to all [SuperSea](https://www.nonfungible.tools/supersea) membership features as long as you hold the NFT. You will also get a special role on our [Discord](https://discord.com/invite/MR2Cn929wQ) with access to exclusive chann...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NonFungibleMembership

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 3 of 15: contract.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./Pausable.sol";
import "./Ownable.sol";
import "./Counters.sol";

contract NonFungibleMembership is ERC721, ERC721Enumerable, Pausable, Ownable {
    using Counters for Counters.Counter;
    using Strings for uint256;

    string _baseTokenURI = 'https://nonfungible.tools/api/metadata/';
    uint256 private _price = 0.75 ether;

    uint256 RESERVED_FOUNDING_MEMBERS = 10;
    uint256 FOUNDING_MEMBERS_SUPPLY = 100;

    Counters.Counter private _tokenIdCounter;
    Counters.Counter private _subscriptionCounter;

    struct SubscriptionPlan {
        uint256 price;
        uint256 duration;
    }

    mapping (uint => SubscriptionPlan) subscriptionPlans;

    // Address -> Date in time
    mapping (address => uint256) subscriptionExpiration;

    event Mint(address indexed _address, uint256 tokenId);
    event Subscription(address _address, SubscriptionPlan plan, uint256 timestamp, uint256 expiresAt, uint256 subscriptionCounter);

    constructor() ERC721("Non Fungible Tools Membership", "NFTOOLS") {
        subscriptionPlans[0] = SubscriptionPlan(0.1 ether, 30 days);
        subscriptionPlans[1] = SubscriptionPlan(0.5 ether, 365 days); 

        for (uint i = 0; i < RESERVED_FOUNDING_MEMBERS; i++) {
            _safeMint(msg.sender);
        }
    }

    function updateSubscriptionPlan(uint index, SubscriptionPlan memory plan) public onlyOwner {
        subscriptionPlans[index] = plan;
    }

    function _getSubscriptionPlan(uint index) private view returns (SubscriptionPlan memory) {
        SubscriptionPlan memory plan = subscriptionPlans[index];

        require(plan.duration > 0, "Subscription plan does not exist");

        return plan;
    }

    function getSubscriptionPlan(uint index) external view returns (SubscriptionPlan memory) {
        return _getSubscriptionPlan(index);
    }

    function subscribe(address _to, uint planIndex) whenNotPaused public payable {
        SubscriptionPlan memory plan = _getSubscriptionPlan(planIndex);

        require(plan.price == msg.value, "Wrong amount sent");
        require(plan.duration > 0, "Subscription plan does not exist");

        uint256 startingDate = block.timestamp;

        // Add to existing current subscription if it exists.
        if(_hasActiveSubscription(_to)) {
            startingDate = subscriptionExpiration[_to];
        }   

        uint256 expiresAt = startingDate + plan.duration;

        subscriptionExpiration[_to] = expiresAt;
        _subscriptionCounter.increment();

        emit Subscription(_to, plan, block.timestamp, expiresAt, _subscriptionCounter.current());
    }

    function _hasActiveSubscription(address _address) private view returns (bool) {
        // subscriptionExpiration[_address] will be 0 if that address never had a subscription.  
        return subscriptionExpiration[_address] > block.timestamp;    
    }

    function hasActiveSubscription(address _address) external view returns (bool) {
        return _hasActiveSubscription(_address);
    }

    function getSubscription(address _address) external view returns (uint256) {
        return subscriptionExpiration[_address];
    }

     function mint(address _to) whenNotPaused public payable  {
        require(msg.value == _price, "Wrong amount sent");
        require(_tokenIdCounter.current() < FOUNDING_MEMBERS_SUPPLY, "Can't mint over supply limit");
        require(balanceOf(_to) == 0, "Can only mint one founding membership");

        _tokenIdCounter.increment();
    
        _safeMint(_to, _tokenIdCounter.current());
        emit Mint(_to, _tokenIdCounter.current());
    }

    function getBalance() external view returns(uint) {
        return address(this).balance;
    }

    function getPrice() external view returns (uint256) {
        return _price;
    }

    function setPrice(uint256 price) public onlyOwner {
        _price = price;
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

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

    function pause() public onlyOwner whenNotPaused {
        _pause();
    }

    function unpause()  public onlyOwner whenPaused {
        _unpause();
    }

    function _safeMint(address to) public onlyOwner {
        _tokenIdCounter.increment();

        _safeMint(to, _tokenIdCounter.current());
    }

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

    function hasFoundingMemberToken(address wallet) public view returns (bool) {
       return balanceOf(wallet) > 0;
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        whenNotPaused
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    // The following functions are overrides required by Solidity.
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

File 1 of 15: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    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);
    }

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

File 2 of 15: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 4 of 15: Counters.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

File 5 of 15: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 6 of 15: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        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 {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 7 of 15: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 15: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 9 of 15: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 10 of 15: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 11 of 15: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 12 of 15: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 13 of 15: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 14 of 15: Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 15 of 15: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"indexed":false,"internalType":"struct NonFungibleMembership.SubscriptionPlan","name":"plan","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expiresAt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"subscriptionCounter","type":"uint256"}],"name":"Subscription","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"_safeMint","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":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getSubscription","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getSubscriptionPlan","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"internalType":"struct NonFungibleMembership.SubscriptionPlan","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"hasActiveSubscription","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"hasFoundingMemberToken","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":"_to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"planIndex","type":"uint256"}],"name":"subscribe","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"internalType":"struct NonFungibleMembership.SubscriptionPlan","name":"plan","type":"tuple"}],"name":"updateSubscriptionPlan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180606001604052806027815260200162005eb960279139600b90805190602001906200003592919062000ecf565b50670a688906bd8b0000600c55600a600d556064600e553480156200005957600080fd5b506040518060400160405280601d81526020017f4e6f6e2046756e6769626c6520546f6f6c73204d656d626572736869700000008152506040518060400160405280600781526020017f4e46544f4f4c53000000000000000000000000000000000000000000000000008152508160009080519060200190620000de92919062000ecf565b508060019080519060200190620000f792919062000ecf565b5050506000600a60006101000a81548160ff02191690831515021790555062000135620001296200020760201b60201c565b6200020f60201b60201c565b604051806040016040528067016345785d8a0000815260200162278d0081525060116000808152602001908152602001600020600082015181600001556020820151816001015590505060405180604001604052806706f05b59d3b2000081526020016301e133808152506011600060018152602001908152602001600020600082015181600001556020820151816001015590505060005b600d548110156200020057620001ea33620002d560201b60201c565b8080620001f790620013ca565b915050620001ce565b50620015e3565b600033905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002e56200020760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200030b620003a660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000364576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200035b906200120d565b60405180910390fd5b6200037b600f620003d060201b62001c0b1760201c565b620003a38162000397600f620003e660201b62001c211760201c565b620003f460201b60201c565b50565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6001816000016000828254019250508190555050565b600081600001549050919050565b620004168282604051806020016040528060008152506200041a60201b60201c565b5050565b6200042c83836200048860201b60201c565b6200044160008484846200066e60201b60201c565b62000483576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200047a9062001163565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620004fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f290620011eb565b60405180910390fd5b6200050c816200082860201b60201c565b156200054f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005469062001185565b60405180910390fd5b62000563600083836200089460201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620005b591906200125c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006200069c8473ffffffffffffffffffffffffffffffffffffffff166200090460201b62001c2f1760201c565b156200081b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006ce6200020760201b60201c565b8786866040518563ffffffff1660e01b8152600401620006f294939291906200110f565b602060405180830381600087803b1580156200070d57600080fd5b505af19250505080156200074157506040513d601f19601f820116820180604052508101906200073e919062000f96565b60015b620007ca573d806000811462000774576040519150601f19603f3d011682016040523d82523d6000602084013e62000779565b606091505b50600081511415620007c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007b99062001163565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000820565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b620008a46200091760201b60201c565b15620008e7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008de90620011a7565b60405180910390fd5b620008ff8383836200092e60201b62001c421760201c565b505050565b600080823b905060008111915050919050565b6000600a60009054906101000a900460ff16905090565b6200094683838362000a7560201b62001d561760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000993576200098d8162000a7a60201b60201c565b620009db565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620009da57620009d9838262000ac360201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000a285762000a228162000c4060201b60201c565b62000a70565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000a6f5762000a6e828262000d8860201b60201c565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000add8462000e1460201b620011f01760201c565b62000ae99190620012b9565b905060006007600084815260200190815260200160002054905081811462000bcf576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000c569190620012b9565b905060006009600084815260200190815260200160002054905060006008838154811062000cad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811062000cf6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000d6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600062000da08362000e1460201b620011f01760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000e88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e7f90620011c9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000edd9062001394565b90600052602060002090601f01602090048101928262000f01576000855562000f4d565b82601f1062000f1c57805160ff191683800117855562000f4d565b8280016001018555821562000f4d579182015b8281111562000f4c57825182559160200191906001019062000f2f565b5b50905062000f5c919062000f60565b5090565b5b8082111562000f7b57600081600090555060010162000f61565b5090565b60008151905062000f9081620015c9565b92915050565b60006020828403121562000fa957600080fd5b600062000fb98482850162000f7f565b91505092915050565b62000fcd81620012f4565b82525050565b600062000fe0826200122f565b62000fec81856200123a565b935062000ffe8185602086016200135e565b620010098162001476565b840191505092915050565b6000620010236032836200124b565b9150620010308262001487565b604082019050919050565b60006200104a601c836200124b565b91506200105782620014d6565b602082019050919050565b6000620010716010836200124b565b91506200107e82620014ff565b602082019050919050565b600062001098602a836200124b565b9150620010a58262001528565b604082019050919050565b6000620010bf6020836200124b565b9150620010cc8262001577565b602082019050919050565b6000620010e66020836200124b565b9150620010f382620015a0565b602082019050919050565b620011098162001354565b82525050565b600060808201905062001126600083018762000fc2565b62001135602083018662000fc2565b620011446040830185620010fe565b818103606083015262001158818462000fd3565b905095945050505050565b600060208201905081810360008301526200117e8162001014565b9050919050565b60006020820190508181036000830152620011a0816200103b565b9050919050565b60006020820190508181036000830152620011c28162001062565b9050919050565b60006020820190508181036000830152620011e48162001089565b9050919050565b600060208201905081810360008301526200120681620010b0565b9050919050565b600060208201905081810360008301526200122881620010d7565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000620012698262001354565b9150620012768362001354565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620012ae57620012ad62001418565b5b828201905092915050565b6000620012c68262001354565b9150620012d38362001354565b925082821015620012e957620012e862001418565b5b828203905092915050565b6000620013018262001334565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200137e57808201518184015260208101905062001361565b838111156200138e576000848401525b50505050565b60006002820490506001821680620013ad57607f821691505b60208210811415620013c457620013c362001447565b5b50919050565b6000620013d78262001354565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200140d576200140c62001418565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620015d48162001308565b8114620015e057600080fd5b50565b6148c680620015f36000396000f3fe6080604052600436106102045760003560e01c80636352211e1161011857806398d5fdca116100a0578063bebe4a571161006f578063bebe4a5714610723578063c87b56dd14610760578063d4e4fe8e1461079d578063e985e9c5146107da578063f2fde38b1461081757610204565b806398d5fdca1461067d578063a031c832146106a8578063a22cb465146106d1578063b88d4fde146106fa57610204565b80638456cb59116100e75780638456cb59146105cb5780638da5cb5b146105e25780638de692841461060d57806391b7f5ed1461062957806395d89b411461065257610204565b80636352211e1461051e5780636a6278421461055b57806370a0823114610577578063715018a6146105b457610204565b80632f745c591161019b5780634898fe8a1161016a5780634898fe8a146104275780634f6ccce71461046457806355f804b3146104a15780635c975abb146104ca5780635d1fe471146104f557610204565b80632f745c59146103935780633ccfd60b146103d05780633f4ba83a146103e757806342842e0e146103fe57610204565b80630cbebc24116101d75780630cbebc24146102d757806312065fe01461031457806318160ddd1461033f57806323b872dd1461036a57610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061349e565b610840565b60405161023d9190613aca565b60405180910390f35b34801561025257600080fd5b5061025b610852565b6040516102689190613ae5565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613531565b6108e4565b6040516102a59190613a10565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613462565b610969565b005b3480156102e357600080fd5b506102fe60048036038101906102f991906132f7565b610a81565b60405161030b9190613e22565b60405180910390f35b34801561032057600080fd5b50610329610aca565b6040516103369190613e22565b60405180910390f35b34801561034b57600080fd5b50610354610ad2565b6040516103619190613e22565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c919061335c565b610adf565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190613462565b610b3f565b6040516103c79190613e22565b60405180910390f35b3480156103dc57600080fd5b506103e5610be4565b005b3480156103f357600080fd5b506103fc610caf565b005b34801561040a57600080fd5b506104256004803603810190610420919061335c565b610d7c565b005b34801561043357600080fd5b5061044e60048036038101906104499190613531565b610d9c565b60405161045b9190613e07565b60405180910390f35b34801561047057600080fd5b5061048b60048036038101906104869190613531565b610db4565b6040516104989190613e22565b60405180910390f35b3480156104ad57600080fd5b506104c860048036038101906104c391906134f0565b610e4b565b005b3480156104d657600080fd5b506104df610ee1565b6040516104ec9190613aca565b60405180910390f35b34801561050157600080fd5b5061051c6004803603810190610517919061355a565b610ef8565b005b34801561052a57600080fd5b5061054560048036038101906105409190613531565b610fa3565b6040516105529190613a10565b60405180910390f35b610575600480360381019061057091906132f7565b611055565b005b34801561058357600080fd5b5061059e600480360381019061059991906132f7565b6111f0565b6040516105ab9190613e22565b60405180910390f35b3480156105c057600080fd5b506105c96112a8565b005b3480156105d757600080fd5b506105e0611330565b005b3480156105ee57600080fd5b506105f76113fe565b6040516106049190613a10565b60405180910390f35b61062760048036038101906106229190613462565b611428565b005b34801561063557600080fd5b50610650600480360381019061064b9190613531565b611611565b005b34801561065e57600080fd5b50610667611697565b6040516106749190613ae5565b60405180910390f35b34801561068957600080fd5b50610692611729565b60405161069f9190613e22565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca91906132f7565b611733565b005b3480156106dd57600080fd5b506106f860048036038101906106f39190613426565b6117cf565b005b34801561070657600080fd5b50610721600480360381019061071c91906133ab565b611950565b005b34801561072f57600080fd5b5061074a600480360381019061074591906132f7565b6119b2565b6040516107579190613aca565b60405180910390f35b34801561076c57600080fd5b5061078760048036038101906107829190613531565b6119c4565b6040516107949190613ae5565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf91906132f7565b611a6b565b6040516107d19190613aca565b60405180910390f35b3480156107e657600080fd5b5061080160048036038101906107fc9190613320565b611a7f565b60405161080e9190613aca565b60405180910390f35b34801561082357600080fd5b5061083e600480360381019061083991906132f7565b611b13565b005b600061084b82611d5b565b9050919050565b60606000805461086190614078565b80601f016020809104026020016040519081016040528092919081815260200182805461088d90614078565b80156108da5780601f106108af576101008083540402835291602001916108da565b820191906000526020600020905b8154815290600101906020018083116108bd57829003601f168201915b5050505050905090565b60006108ef82611dd5565b61092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092590613cc7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061097482610fa3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109dc90613d67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a04611e41565b73ffffffffffffffffffffffffffffffffffffffff161480610a335750610a3281610a2d611e41565b611a7f565b5b610a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6990613c47565b60405180910390fd5b610a7c8383611e49565b505050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600047905090565b6000600880549050905090565b610af0610aea611e41565b82611f02565b610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690613da7565b60405180910390fd5b610b3a838383611fe0565b505050565b6000610b4a836111f0565b8210610b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8290613b47565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bec611e41565b73ffffffffffffffffffffffffffffffffffffffff16610c0a6113fe565b73ffffffffffffffffffffffffffffffffffffffff1614610c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5790613ce7565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610cab573d6000803e3d6000fd5b5050565b610cb7611e41565b73ffffffffffffffffffffffffffffffffffffffff16610cd56113fe565b73ffffffffffffffffffffffffffffffffffffffff1614610d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2290613ce7565b60405180910390fd5b610d33610ee1565b610d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6990613b07565b60405180910390fd5b610d7a61223c565b565b610d9783838360405180602001604052806000815250611950565b505050565b610da46130b5565b610dad826122de565b9050919050565b6000610dbe610ad2565b8210610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df690613dc7565b60405180910390fd5b60088281548110610e39577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610e53611e41565b73ffffffffffffffffffffffffffffffffffffffff16610e716113fe565b73ffffffffffffffffffffffffffffffffffffffff1614610ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebe90613ce7565b60405180910390fd5b80600b9080519060200190610edd9291906130cf565b5050565b6000600a60009054906101000a900460ff16905090565b610f00611e41565b73ffffffffffffffffffffffffffffffffffffffff16610f1e6113fe565b73ffffffffffffffffffffffffffffffffffffffff1614610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90613ce7565b60405180910390fd5b806011600084815260200190815260200160002060008201518160000155602082015181600101559050505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104390613c87565b60405180910390fd5b80915050919050565b61105d610ee1565b1561109d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109490613c27565b60405180910390fd5b600c5434146110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d890613d47565b60405180910390fd5b600e546110ee600f611c21565b1061112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590613b27565b60405180910390fd5b6000611139826111f0565b14611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090613d87565b60405180910390fd5b611183600f611c0b565b61119681611191600f611c21565b61236c565b8073ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968856111d8600f611c21565b6040516111e59190613e22565b60405180910390a250565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890613c67565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112b0611e41565b73ffffffffffffffffffffffffffffffffffffffff166112ce6113fe565b73ffffffffffffffffffffffffffffffffffffffff1614611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90613ce7565b60405180910390fd5b61132e600061238a565b565b611338611e41565b73ffffffffffffffffffffffffffffffffffffffff166113566113fe565b73ffffffffffffffffffffffffffffffffffffffff16146113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390613ce7565b60405180910390fd5b6113b4610ee1565b156113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb90613c27565b60405180910390fd5b6113fc612450565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611430610ee1565b15611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146790613c27565b60405180910390fd5b600061147b826122de565b9050348160000151146114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90613d47565b60405180910390fd5b600081602001511161150a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150190613de7565b60405180910390fd5b6000429050611518846124f3565b1561156057601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b60008260200151826115729190613f07565b905080601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115c26010611c0b565b7f40a6d745e140089bfd20bab1b21b92e11cf691c707d0837a9904f8dff08f60d6858442846115f16010611c21565b604051611602959493929190613a77565b60405180910390a15050505050565b611619611e41565b73ffffffffffffffffffffffffffffffffffffffff166116376113fe565b73ffffffffffffffffffffffffffffffffffffffff161461168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490613ce7565b60405180910390fd5b80600c8190555050565b6060600180546116a690614078565b80601f01602080910402602001604051908101604052809291908181526020018280546116d290614078565b801561171f5780601f106116f45761010080835404028352916020019161171f565b820191906000526020600020905b81548152906001019060200180831161170257829003601f168201915b5050505050905090565b6000600c54905090565b61173b611e41565b73ffffffffffffffffffffffffffffffffffffffff166117596113fe565b73ffffffffffffffffffffffffffffffffffffffff16146117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a690613ce7565b60405180910390fd5b6117b9600f611c0b565b6117cc816117c7600f611c21565b61236c565b50565b6117d7611e41565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183c90613be7565b60405180910390fd5b8060056000611852611e41565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118ff611e41565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119449190613aca565b60405180910390a35050565b61196161195b611e41565b83611f02565b6119a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199790613da7565b60405180910390fd5b6119ac8484848461253e565b50505050565b60006119bd826124f3565b9050919050565b60606119cf82611dd5565b611a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0590613d27565b60405180910390fd5b6000611a1861259a565b90506000815111611a385760405180602001604052806000815250611a63565b80611a428461262c565b604051602001611a539291906139ec565b6040516020818303038152906040525b915050919050565b600080611a77836111f0565b119050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b1b611e41565b73ffffffffffffffffffffffffffffffffffffffff16611b396113fe565b73ffffffffffffffffffffffffffffffffffffffff1614611b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8690613ce7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf690613b87565b60405180910390fd5b611c088161238a565b50565b6001816000016000828254019250508190555050565b600081600001549050919050565b600080823b905060008111915050919050565b611c4d838383611d56565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c9057611c8b816127d9565b611ccf565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611cce57611ccd8382612822565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d1257611d0d8161298f565b611d51565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611d5057611d4f8282612ad2565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611dce5750611dcd82612b51565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ebc83610fa3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f0d82611dd5565b611f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4390613c07565b60405180910390fd5b6000611f5783610fa3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fc657508373ffffffffffffffffffffffffffffffffffffffff16611fae846108e4565b73ffffffffffffffffffffffffffffffffffffffff16145b80611fd75750611fd68185611a7f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661200082610fa3565b73ffffffffffffffffffffffffffffffffffffffff1614612056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204d90613d07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bd90613bc7565b60405180910390fd5b6120d1838383612c33565b6120dc600082611e49565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461212c9190613f8e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121839190613f07565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612244610ee1565b612283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227a90613b07565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122c7611e41565b6040516122d49190613a10565b60405180910390a1565b6122e66130b5565b6000601160008481526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090506000816020015111612363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235a90613de7565b60405180910390fd5b80915050919050565b612386828260405180602001604052806000815250612c8b565b5050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612458610ee1565b15612498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248f90613c27565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586124dc611e41565b6040516124e99190613a10565b60405180910390a1565b600042601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054119050919050565b612549848484611fe0565b61255584848484612ce6565b612594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258b90613b67565b60405180910390fd5b50505050565b6060600b80546125a990614078565b80601f01602080910402602001604051908101604052809291908181526020018280546125d590614078565b80156126225780601f106125f757610100808354040283529160200191612622565b820191906000526020600020905b81548152906001019060200180831161260557829003601f168201915b5050505050905090565b60606000821415612674576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127d4565b600082905060005b600082146126a657808061268f906140db565b915050600a8261269f9190613f5d565b915061267c565b60008167ffffffffffffffff8111156126e8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561271a5781602001600182028036833780820191505090505b5090505b600085146127cd576001826127339190613f8e565b9150600a856127429190614124565b603061274e9190613f07565b60f81b81838151811061278a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127c69190613f5d565b945061271e565b8093505050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161282f846111f0565b6128399190613f8e565b905060006007600084815260200190815260200160002054905081811461291e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129a39190613f8e565b90506000600960008481526020019081526020016000205490506000600883815481106129f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612a41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ab6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612add836111f0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c1c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c2c5750612c2b82612e7d565b5b9050919050565b612c3b610ee1565b15612c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7290613c27565b60405180910390fd5b612c86838383611c42565b505050565b612c958383612ee7565b612ca26000848484612ce6565b612ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd890613b67565b60405180910390fd5b505050565b6000612d078473ffffffffffffffffffffffffffffffffffffffff16611c2f565b15612e70578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d30611e41565b8786866040518563ffffffff1660e01b8152600401612d529493929190613a2b565b602060405180830381600087803b158015612d6c57600080fd5b505af1925050508015612d9d57506040513d601f19601f82011682018060405250810190612d9a91906134c7565b60015b612e20573d8060008114612dcd576040519150601f19603f3d011682016040523d82523d6000602084013e612dd2565b606091505b50600081511415612e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0f90613b67565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e75565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4e90613ca7565b60405180910390fd5b612f6081611dd5565b15612fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9790613ba7565b60405180910390fd5b612fac60008383612c33565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ffc9190613f07565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b604051806040016040528060008152602001600081525090565b8280546130db90614078565b90600052602060002090601f0160209004810192826130fd5760008555613144565b82601f1061311657805160ff1916838001178555613144565b82800160010185558215613144579182015b82811115613143578251825591602001919060010190613128565b5b5090506131519190613155565b5090565b5b8082111561316e576000816000905550600101613156565b5090565b600061318561318084613e62565b613e3d565b90508281526020810184848401111561319d57600080fd5b6131a8848285614036565b509392505050565b60006131c36131be84613e93565b613e3d565b9050828152602081018484840111156131db57600080fd5b6131e6848285614036565b509392505050565b6000813590506131fd81614834565b92915050565b6000813590506132128161484b565b92915050565b60008135905061322781614862565b92915050565b60008151905061323c81614862565b92915050565b600082601f83011261325357600080fd5b8135613263848260208601613172565b91505092915050565b600082601f83011261327d57600080fd5b813561328d8482602086016131b0565b91505092915050565b6000604082840312156132a857600080fd5b6132b26040613e3d565b905060006132c2848285016132e2565b60008301525060206132d6848285016132e2565b60208301525092915050565b6000813590506132f181614879565b92915050565b60006020828403121561330957600080fd5b6000613317848285016131ee565b91505092915050565b6000806040838503121561333357600080fd5b6000613341858286016131ee565b9250506020613352858286016131ee565b9150509250929050565b60008060006060848603121561337157600080fd5b600061337f868287016131ee565b9350506020613390868287016131ee565b92505060406133a1868287016132e2565b9150509250925092565b600080600080608085870312156133c157600080fd5b60006133cf878288016131ee565b94505060206133e0878288016131ee565b93505060406133f1878288016132e2565b925050606085013567ffffffffffffffff81111561340e57600080fd5b61341a87828801613242565b91505092959194509250565b6000806040838503121561343957600080fd5b6000613447858286016131ee565b925050602061345885828601613203565b9150509250929050565b6000806040838503121561347557600080fd5b6000613483858286016131ee565b9250506020613494858286016132e2565b9150509250929050565b6000602082840312156134b057600080fd5b60006134be84828501613218565b91505092915050565b6000602082840312156134d957600080fd5b60006134e78482850161322d565b91505092915050565b60006020828403121561350257600080fd5b600082013567ffffffffffffffff81111561351c57600080fd5b6135288482850161326c565b91505092915050565b60006020828403121561354357600080fd5b6000613551848285016132e2565b91505092915050565b6000806060838503121561356d57600080fd5b600061357b858286016132e2565b925050602061358c85828601613296565b9150509250929050565b61359f81613fc2565b82525050565b6135ae81613fd4565b82525050565b60006135bf82613ec4565b6135c98185613eda565b93506135d9818560208601614045565b6135e281614211565b840191505092915050565b60006135f882613ecf565b6136028185613eeb565b9350613612818560208601614045565b61361b81614211565b840191505092915050565b600061363182613ecf565b61363b8185613efc565b935061364b818560208601614045565b80840191505092915050565b6000613664601483613eeb565b915061366f82614222565b602082019050919050565b6000613687601c83613eeb565b91506136928261424b565b602082019050919050565b60006136aa602b83613eeb565b91506136b582614274565b604082019050919050565b60006136cd603283613eeb565b91506136d8826142c3565b604082019050919050565b60006136f0602683613eeb565b91506136fb82614312565b604082019050919050565b6000613713601c83613eeb565b915061371e82614361565b602082019050919050565b6000613736602483613eeb565b91506137418261438a565b604082019050919050565b6000613759601983613eeb565b9150613764826143d9565b602082019050919050565b600061377c602c83613eeb565b915061378782614402565b604082019050919050565b600061379f601083613eeb565b91506137aa82614451565b602082019050919050565b60006137c2603883613eeb565b91506137cd8261447a565b604082019050919050565b60006137e5602a83613eeb565b91506137f0826144c9565b604082019050919050565b6000613808602983613eeb565b915061381382614518565b604082019050919050565b600061382b602083613eeb565b915061383682614567565b602082019050919050565b600061384e602c83613eeb565b915061385982614590565b604082019050919050565b6000613871602083613eeb565b915061387c826145df565b602082019050919050565b6000613894602983613eeb565b915061389f82614608565b604082019050919050565b60006138b7602f83613eeb565b91506138c282614657565b604082019050919050565b60006138da601183613eeb565b91506138e5826146a6565b602082019050919050565b60006138fd602183613eeb565b9150613908826146cf565b604082019050919050565b6000613920602583613eeb565b915061392b8261471e565b604082019050919050565b6000613943603183613eeb565b915061394e8261476d565b604082019050919050565b6000613966602c83613eeb565b9150613971826147bc565b604082019050919050565b6000613989602083613eeb565b91506139948261480b565b602082019050919050565b6040820160008201516139b560008501826139ce565b5060208201516139c860208501826139ce565b50505050565b6139d78161402c565b82525050565b6139e68161402c565b82525050565b60006139f88285613626565b9150613a048284613626565b91508190509392505050565b6000602082019050613a256000830184613596565b92915050565b6000608082019050613a406000830187613596565b613a4d6020830186613596565b613a5a60408301856139dd565b8181036060830152613a6c81846135b4565b905095945050505050565b600060c082019050613a8c6000830188613596565b613a99602083018761399f565b613aa660608301866139dd565b613ab360808301856139dd565b613ac060a08301846139dd565b9695505050505050565b6000602082019050613adf60008301846135a5565b92915050565b60006020820190508181036000830152613aff81846135ed565b905092915050565b60006020820190508181036000830152613b2081613657565b9050919050565b60006020820190508181036000830152613b408161367a565b9050919050565b60006020820190508181036000830152613b608161369d565b9050919050565b60006020820190508181036000830152613b80816136c0565b9050919050565b60006020820190508181036000830152613ba0816136e3565b9050919050565b60006020820190508181036000830152613bc081613706565b9050919050565b60006020820190508181036000830152613be081613729565b9050919050565b60006020820190508181036000830152613c008161374c565b9050919050565b60006020820190508181036000830152613c208161376f565b9050919050565b60006020820190508181036000830152613c4081613792565b9050919050565b60006020820190508181036000830152613c60816137b5565b9050919050565b60006020820190508181036000830152613c80816137d8565b9050919050565b60006020820190508181036000830152613ca0816137fb565b9050919050565b60006020820190508181036000830152613cc08161381e565b9050919050565b60006020820190508181036000830152613ce081613841565b9050919050565b60006020820190508181036000830152613d0081613864565b9050919050565b60006020820190508181036000830152613d2081613887565b9050919050565b60006020820190508181036000830152613d40816138aa565b9050919050565b60006020820190508181036000830152613d60816138cd565b9050919050565b60006020820190508181036000830152613d80816138f0565b9050919050565b60006020820190508181036000830152613da081613913565b9050919050565b60006020820190508181036000830152613dc081613936565b9050919050565b60006020820190508181036000830152613de081613959565b9050919050565b60006020820190508181036000830152613e008161397c565b9050919050565b6000604082019050613e1c600083018461399f565b92915050565b6000602082019050613e3760008301846139dd565b92915050565b6000613e47613e58565b9050613e5382826140aa565b919050565b6000604051905090565b600067ffffffffffffffff821115613e7d57613e7c6141e2565b5b613e8682614211565b9050602081019050919050565b600067ffffffffffffffff821115613eae57613ead6141e2565b5b613eb782614211565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f128261402c565b9150613f1d8361402c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f5257613f51614155565b5b828201905092915050565b6000613f688261402c565b9150613f738361402c565b925082613f8357613f82614184565b5b828204905092915050565b6000613f998261402c565b9150613fa48361402c565b925082821015613fb757613fb6614155565b5b828203905092915050565b6000613fcd8261400c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614063578082015181840152602081019050614048565b83811115614072576000848401525b50505050565b6000600282049050600182168061409057607f821691505b602082108114156140a4576140a36141b3565b5b50919050565b6140b382614211565b810181811067ffffffffffffffff821117156140d2576140d16141e2565b5b80604052505050565b60006140e68261402c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561411957614118614155565b5b600182019050919050565b600061412f8261402c565b915061413a8361402c565b92508261414a57614149614184565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f43616e2774206d696e74206f76657220737570706c79206c696d697400000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f57726f6e6720616d6f756e742073656e74000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e74206f6e6520666f756e64696e67206d656d626560008201527f7273686970000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f537562736372697074696f6e20706c616e20646f6573206e6f74206578697374600082015250565b61483d81613fc2565b811461484857600080fd5b50565b61485481613fd4565b811461485f57600080fd5b50565b61486b81613fe0565b811461487657600080fd5b50565b6148828161402c565b811461488d57600080fd5b5056fea26469706673582212204ce18c8fd56b3099f438e75fdbd1d633c695473a41053f8016092ec4e1352e9e64736f6c6343000804003368747470733a2f2f6e6f6e66756e6769626c652e746f6f6c732f6170692f6d657461646174612f

Deployed Bytecode

0x6080604052600436106102045760003560e01c80636352211e1161011857806398d5fdca116100a0578063bebe4a571161006f578063bebe4a5714610723578063c87b56dd14610760578063d4e4fe8e1461079d578063e985e9c5146107da578063f2fde38b1461081757610204565b806398d5fdca1461067d578063a031c832146106a8578063a22cb465146106d1578063b88d4fde146106fa57610204565b80638456cb59116100e75780638456cb59146105cb5780638da5cb5b146105e25780638de692841461060d57806391b7f5ed1461062957806395d89b411461065257610204565b80636352211e1461051e5780636a6278421461055b57806370a0823114610577578063715018a6146105b457610204565b80632f745c591161019b5780634898fe8a1161016a5780634898fe8a146104275780634f6ccce71461046457806355f804b3146104a15780635c975abb146104ca5780635d1fe471146104f557610204565b80632f745c59146103935780633ccfd60b146103d05780633f4ba83a146103e757806342842e0e146103fe57610204565b80630cbebc24116101d75780630cbebc24146102d757806312065fe01461031457806318160ddd1461033f57806323b872dd1461036a57610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061349e565b610840565b60405161023d9190613aca565b60405180910390f35b34801561025257600080fd5b5061025b610852565b6040516102689190613ae5565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613531565b6108e4565b6040516102a59190613a10565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613462565b610969565b005b3480156102e357600080fd5b506102fe60048036038101906102f991906132f7565b610a81565b60405161030b9190613e22565b60405180910390f35b34801561032057600080fd5b50610329610aca565b6040516103369190613e22565b60405180910390f35b34801561034b57600080fd5b50610354610ad2565b6040516103619190613e22565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c919061335c565b610adf565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190613462565b610b3f565b6040516103c79190613e22565b60405180910390f35b3480156103dc57600080fd5b506103e5610be4565b005b3480156103f357600080fd5b506103fc610caf565b005b34801561040a57600080fd5b506104256004803603810190610420919061335c565b610d7c565b005b34801561043357600080fd5b5061044e60048036038101906104499190613531565b610d9c565b60405161045b9190613e07565b60405180910390f35b34801561047057600080fd5b5061048b60048036038101906104869190613531565b610db4565b6040516104989190613e22565b60405180910390f35b3480156104ad57600080fd5b506104c860048036038101906104c391906134f0565b610e4b565b005b3480156104d657600080fd5b506104df610ee1565b6040516104ec9190613aca565b60405180910390f35b34801561050157600080fd5b5061051c6004803603810190610517919061355a565b610ef8565b005b34801561052a57600080fd5b5061054560048036038101906105409190613531565b610fa3565b6040516105529190613a10565b60405180910390f35b610575600480360381019061057091906132f7565b611055565b005b34801561058357600080fd5b5061059e600480360381019061059991906132f7565b6111f0565b6040516105ab9190613e22565b60405180910390f35b3480156105c057600080fd5b506105c96112a8565b005b3480156105d757600080fd5b506105e0611330565b005b3480156105ee57600080fd5b506105f76113fe565b6040516106049190613a10565b60405180910390f35b61062760048036038101906106229190613462565b611428565b005b34801561063557600080fd5b50610650600480360381019061064b9190613531565b611611565b005b34801561065e57600080fd5b50610667611697565b6040516106749190613ae5565b60405180910390f35b34801561068957600080fd5b50610692611729565b60405161069f9190613e22565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca91906132f7565b611733565b005b3480156106dd57600080fd5b506106f860048036038101906106f39190613426565b6117cf565b005b34801561070657600080fd5b50610721600480360381019061071c91906133ab565b611950565b005b34801561072f57600080fd5b5061074a600480360381019061074591906132f7565b6119b2565b6040516107579190613aca565b60405180910390f35b34801561076c57600080fd5b5061078760048036038101906107829190613531565b6119c4565b6040516107949190613ae5565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf91906132f7565b611a6b565b6040516107d19190613aca565b60405180910390f35b3480156107e657600080fd5b5061080160048036038101906107fc9190613320565b611a7f565b60405161080e9190613aca565b60405180910390f35b34801561082357600080fd5b5061083e600480360381019061083991906132f7565b611b13565b005b600061084b82611d5b565b9050919050565b60606000805461086190614078565b80601f016020809104026020016040519081016040528092919081815260200182805461088d90614078565b80156108da5780601f106108af576101008083540402835291602001916108da565b820191906000526020600020905b8154815290600101906020018083116108bd57829003601f168201915b5050505050905090565b60006108ef82611dd5565b61092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092590613cc7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061097482610fa3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109dc90613d67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a04611e41565b73ffffffffffffffffffffffffffffffffffffffff161480610a335750610a3281610a2d611e41565b611a7f565b5b610a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6990613c47565b60405180910390fd5b610a7c8383611e49565b505050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600047905090565b6000600880549050905090565b610af0610aea611e41565b82611f02565b610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690613da7565b60405180910390fd5b610b3a838383611fe0565b505050565b6000610b4a836111f0565b8210610b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8290613b47565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bec611e41565b73ffffffffffffffffffffffffffffffffffffffff16610c0a6113fe565b73ffffffffffffffffffffffffffffffffffffffff1614610c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5790613ce7565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610cab573d6000803e3d6000fd5b5050565b610cb7611e41565b73ffffffffffffffffffffffffffffffffffffffff16610cd56113fe565b73ffffffffffffffffffffffffffffffffffffffff1614610d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2290613ce7565b60405180910390fd5b610d33610ee1565b610d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6990613b07565b60405180910390fd5b610d7a61223c565b565b610d9783838360405180602001604052806000815250611950565b505050565b610da46130b5565b610dad826122de565b9050919050565b6000610dbe610ad2565b8210610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df690613dc7565b60405180910390fd5b60088281548110610e39577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610e53611e41565b73ffffffffffffffffffffffffffffffffffffffff16610e716113fe565b73ffffffffffffffffffffffffffffffffffffffff1614610ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebe90613ce7565b60405180910390fd5b80600b9080519060200190610edd9291906130cf565b5050565b6000600a60009054906101000a900460ff16905090565b610f00611e41565b73ffffffffffffffffffffffffffffffffffffffff16610f1e6113fe565b73ffffffffffffffffffffffffffffffffffffffff1614610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90613ce7565b60405180910390fd5b806011600084815260200190815260200160002060008201518160000155602082015181600101559050505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104390613c87565b60405180910390fd5b80915050919050565b61105d610ee1565b1561109d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109490613c27565b60405180910390fd5b600c5434146110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d890613d47565b60405180910390fd5b600e546110ee600f611c21565b1061112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590613b27565b60405180910390fd5b6000611139826111f0565b14611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090613d87565b60405180910390fd5b611183600f611c0b565b61119681611191600f611c21565b61236c565b8073ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968856111d8600f611c21565b6040516111e59190613e22565b60405180910390a250565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890613c67565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112b0611e41565b73ffffffffffffffffffffffffffffffffffffffff166112ce6113fe565b73ffffffffffffffffffffffffffffffffffffffff1614611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90613ce7565b60405180910390fd5b61132e600061238a565b565b611338611e41565b73ffffffffffffffffffffffffffffffffffffffff166113566113fe565b73ffffffffffffffffffffffffffffffffffffffff16146113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390613ce7565b60405180910390fd5b6113b4610ee1565b156113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb90613c27565b60405180910390fd5b6113fc612450565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611430610ee1565b15611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146790613c27565b60405180910390fd5b600061147b826122de565b9050348160000151146114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90613d47565b60405180910390fd5b600081602001511161150a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150190613de7565b60405180910390fd5b6000429050611518846124f3565b1561156057601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b60008260200151826115729190613f07565b905080601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115c26010611c0b565b7f40a6d745e140089bfd20bab1b21b92e11cf691c707d0837a9904f8dff08f60d6858442846115f16010611c21565b604051611602959493929190613a77565b60405180910390a15050505050565b611619611e41565b73ffffffffffffffffffffffffffffffffffffffff166116376113fe565b73ffffffffffffffffffffffffffffffffffffffff161461168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490613ce7565b60405180910390fd5b80600c8190555050565b6060600180546116a690614078565b80601f01602080910402602001604051908101604052809291908181526020018280546116d290614078565b801561171f5780601f106116f45761010080835404028352916020019161171f565b820191906000526020600020905b81548152906001019060200180831161170257829003601f168201915b5050505050905090565b6000600c54905090565b61173b611e41565b73ffffffffffffffffffffffffffffffffffffffff166117596113fe565b73ffffffffffffffffffffffffffffffffffffffff16146117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a690613ce7565b60405180910390fd5b6117b9600f611c0b565b6117cc816117c7600f611c21565b61236c565b50565b6117d7611e41565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183c90613be7565b60405180910390fd5b8060056000611852611e41565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118ff611e41565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119449190613aca565b60405180910390a35050565b61196161195b611e41565b83611f02565b6119a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199790613da7565b60405180910390fd5b6119ac8484848461253e565b50505050565b60006119bd826124f3565b9050919050565b60606119cf82611dd5565b611a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0590613d27565b60405180910390fd5b6000611a1861259a565b90506000815111611a385760405180602001604052806000815250611a63565b80611a428461262c565b604051602001611a539291906139ec565b6040516020818303038152906040525b915050919050565b600080611a77836111f0565b119050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b1b611e41565b73ffffffffffffffffffffffffffffffffffffffff16611b396113fe565b73ffffffffffffffffffffffffffffffffffffffff1614611b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8690613ce7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf690613b87565b60405180910390fd5b611c088161238a565b50565b6001816000016000828254019250508190555050565b600081600001549050919050565b600080823b905060008111915050919050565b611c4d838383611d56565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c9057611c8b816127d9565b611ccf565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611cce57611ccd8382612822565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d1257611d0d8161298f565b611d51565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611d5057611d4f8282612ad2565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611dce5750611dcd82612b51565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ebc83610fa3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f0d82611dd5565b611f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4390613c07565b60405180910390fd5b6000611f5783610fa3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fc657508373ffffffffffffffffffffffffffffffffffffffff16611fae846108e4565b73ffffffffffffffffffffffffffffffffffffffff16145b80611fd75750611fd68185611a7f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661200082610fa3565b73ffffffffffffffffffffffffffffffffffffffff1614612056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204d90613d07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bd90613bc7565b60405180910390fd5b6120d1838383612c33565b6120dc600082611e49565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461212c9190613f8e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121839190613f07565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612244610ee1565b612283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227a90613b07565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122c7611e41565b6040516122d49190613a10565b60405180910390a1565b6122e66130b5565b6000601160008481526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090506000816020015111612363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235a90613de7565b60405180910390fd5b80915050919050565b612386828260405180602001604052806000815250612c8b565b5050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612458610ee1565b15612498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248f90613c27565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586124dc611e41565b6040516124e99190613a10565b60405180910390a1565b600042601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054119050919050565b612549848484611fe0565b61255584848484612ce6565b612594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258b90613b67565b60405180910390fd5b50505050565b6060600b80546125a990614078565b80601f01602080910402602001604051908101604052809291908181526020018280546125d590614078565b80156126225780601f106125f757610100808354040283529160200191612622565b820191906000526020600020905b81548152906001019060200180831161260557829003601f168201915b5050505050905090565b60606000821415612674576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127d4565b600082905060005b600082146126a657808061268f906140db565b915050600a8261269f9190613f5d565b915061267c565b60008167ffffffffffffffff8111156126e8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561271a5781602001600182028036833780820191505090505b5090505b600085146127cd576001826127339190613f8e565b9150600a856127429190614124565b603061274e9190613f07565b60f81b81838151811061278a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127c69190613f5d565b945061271e565b8093505050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161282f846111f0565b6128399190613f8e565b905060006007600084815260200190815260200160002054905081811461291e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129a39190613f8e565b90506000600960008481526020019081526020016000205490506000600883815481106129f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612a41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ab6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612add836111f0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c1c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c2c5750612c2b82612e7d565b5b9050919050565b612c3b610ee1565b15612c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7290613c27565b60405180910390fd5b612c86838383611c42565b505050565b612c958383612ee7565b612ca26000848484612ce6565b612ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd890613b67565b60405180910390fd5b505050565b6000612d078473ffffffffffffffffffffffffffffffffffffffff16611c2f565b15612e70578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d30611e41565b8786866040518563ffffffff1660e01b8152600401612d529493929190613a2b565b602060405180830381600087803b158015612d6c57600080fd5b505af1925050508015612d9d57506040513d601f19601f82011682018060405250810190612d9a91906134c7565b60015b612e20573d8060008114612dcd576040519150601f19603f3d011682016040523d82523d6000602084013e612dd2565b606091505b50600081511415612e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0f90613b67565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e75565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4e90613ca7565b60405180910390fd5b612f6081611dd5565b15612fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9790613ba7565b60405180910390fd5b612fac60008383612c33565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ffc9190613f07565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b604051806040016040528060008152602001600081525090565b8280546130db90614078565b90600052602060002090601f0160209004810192826130fd5760008555613144565b82601f1061311657805160ff1916838001178555613144565b82800160010185558215613144579182015b82811115613143578251825591602001919060010190613128565b5b5090506131519190613155565b5090565b5b8082111561316e576000816000905550600101613156565b5090565b600061318561318084613e62565b613e3d565b90508281526020810184848401111561319d57600080fd5b6131a8848285614036565b509392505050565b60006131c36131be84613e93565b613e3d565b9050828152602081018484840111156131db57600080fd5b6131e6848285614036565b509392505050565b6000813590506131fd81614834565b92915050565b6000813590506132128161484b565b92915050565b60008135905061322781614862565b92915050565b60008151905061323c81614862565b92915050565b600082601f83011261325357600080fd5b8135613263848260208601613172565b91505092915050565b600082601f83011261327d57600080fd5b813561328d8482602086016131b0565b91505092915050565b6000604082840312156132a857600080fd5b6132b26040613e3d565b905060006132c2848285016132e2565b60008301525060206132d6848285016132e2565b60208301525092915050565b6000813590506132f181614879565b92915050565b60006020828403121561330957600080fd5b6000613317848285016131ee565b91505092915050565b6000806040838503121561333357600080fd5b6000613341858286016131ee565b9250506020613352858286016131ee565b9150509250929050565b60008060006060848603121561337157600080fd5b600061337f868287016131ee565b9350506020613390868287016131ee565b92505060406133a1868287016132e2565b9150509250925092565b600080600080608085870312156133c157600080fd5b60006133cf878288016131ee565b94505060206133e0878288016131ee565b93505060406133f1878288016132e2565b925050606085013567ffffffffffffffff81111561340e57600080fd5b61341a87828801613242565b91505092959194509250565b6000806040838503121561343957600080fd5b6000613447858286016131ee565b925050602061345885828601613203565b9150509250929050565b6000806040838503121561347557600080fd5b6000613483858286016131ee565b9250506020613494858286016132e2565b9150509250929050565b6000602082840312156134b057600080fd5b60006134be84828501613218565b91505092915050565b6000602082840312156134d957600080fd5b60006134e78482850161322d565b91505092915050565b60006020828403121561350257600080fd5b600082013567ffffffffffffffff81111561351c57600080fd5b6135288482850161326c565b91505092915050565b60006020828403121561354357600080fd5b6000613551848285016132e2565b91505092915050565b6000806060838503121561356d57600080fd5b600061357b858286016132e2565b925050602061358c85828601613296565b9150509250929050565b61359f81613fc2565b82525050565b6135ae81613fd4565b82525050565b60006135bf82613ec4565b6135c98185613eda565b93506135d9818560208601614045565b6135e281614211565b840191505092915050565b60006135f882613ecf565b6136028185613eeb565b9350613612818560208601614045565b61361b81614211565b840191505092915050565b600061363182613ecf565b61363b8185613efc565b935061364b818560208601614045565b80840191505092915050565b6000613664601483613eeb565b915061366f82614222565b602082019050919050565b6000613687601c83613eeb565b91506136928261424b565b602082019050919050565b60006136aa602b83613eeb565b91506136b582614274565b604082019050919050565b60006136cd603283613eeb565b91506136d8826142c3565b604082019050919050565b60006136f0602683613eeb565b91506136fb82614312565b604082019050919050565b6000613713601c83613eeb565b915061371e82614361565b602082019050919050565b6000613736602483613eeb565b91506137418261438a565b604082019050919050565b6000613759601983613eeb565b9150613764826143d9565b602082019050919050565b600061377c602c83613eeb565b915061378782614402565b604082019050919050565b600061379f601083613eeb565b91506137aa82614451565b602082019050919050565b60006137c2603883613eeb565b91506137cd8261447a565b604082019050919050565b60006137e5602a83613eeb565b91506137f0826144c9565b604082019050919050565b6000613808602983613eeb565b915061381382614518565b604082019050919050565b600061382b602083613eeb565b915061383682614567565b602082019050919050565b600061384e602c83613eeb565b915061385982614590565b604082019050919050565b6000613871602083613eeb565b915061387c826145df565b602082019050919050565b6000613894602983613eeb565b915061389f82614608565b604082019050919050565b60006138b7602f83613eeb565b91506138c282614657565b604082019050919050565b60006138da601183613eeb565b91506138e5826146a6565b602082019050919050565b60006138fd602183613eeb565b9150613908826146cf565b604082019050919050565b6000613920602583613eeb565b915061392b8261471e565b604082019050919050565b6000613943603183613eeb565b915061394e8261476d565b604082019050919050565b6000613966602c83613eeb565b9150613971826147bc565b604082019050919050565b6000613989602083613eeb565b91506139948261480b565b602082019050919050565b6040820160008201516139b560008501826139ce565b5060208201516139c860208501826139ce565b50505050565b6139d78161402c565b82525050565b6139e68161402c565b82525050565b60006139f88285613626565b9150613a048284613626565b91508190509392505050565b6000602082019050613a256000830184613596565b92915050565b6000608082019050613a406000830187613596565b613a4d6020830186613596565b613a5a60408301856139dd565b8181036060830152613a6c81846135b4565b905095945050505050565b600060c082019050613a8c6000830188613596565b613a99602083018761399f565b613aa660608301866139dd565b613ab360808301856139dd565b613ac060a08301846139dd565b9695505050505050565b6000602082019050613adf60008301846135a5565b92915050565b60006020820190508181036000830152613aff81846135ed565b905092915050565b60006020820190508181036000830152613b2081613657565b9050919050565b60006020820190508181036000830152613b408161367a565b9050919050565b60006020820190508181036000830152613b608161369d565b9050919050565b60006020820190508181036000830152613b80816136c0565b9050919050565b60006020820190508181036000830152613ba0816136e3565b9050919050565b60006020820190508181036000830152613bc081613706565b9050919050565b60006020820190508181036000830152613be081613729565b9050919050565b60006020820190508181036000830152613c008161374c565b9050919050565b60006020820190508181036000830152613c208161376f565b9050919050565b60006020820190508181036000830152613c4081613792565b9050919050565b60006020820190508181036000830152613c60816137b5565b9050919050565b60006020820190508181036000830152613c80816137d8565b9050919050565b60006020820190508181036000830152613ca0816137fb565b9050919050565b60006020820190508181036000830152613cc08161381e565b9050919050565b60006020820190508181036000830152613ce081613841565b9050919050565b60006020820190508181036000830152613d0081613864565b9050919050565b60006020820190508181036000830152613d2081613887565b9050919050565b60006020820190508181036000830152613d40816138aa565b9050919050565b60006020820190508181036000830152613d60816138cd565b9050919050565b60006020820190508181036000830152613d80816138f0565b9050919050565b60006020820190508181036000830152613da081613913565b9050919050565b60006020820190508181036000830152613dc081613936565b9050919050565b60006020820190508181036000830152613de081613959565b9050919050565b60006020820190508181036000830152613e008161397c565b9050919050565b6000604082019050613e1c600083018461399f565b92915050565b6000602082019050613e3760008301846139dd565b92915050565b6000613e47613e58565b9050613e5382826140aa565b919050565b6000604051905090565b600067ffffffffffffffff821115613e7d57613e7c6141e2565b5b613e8682614211565b9050602081019050919050565b600067ffffffffffffffff821115613eae57613ead6141e2565b5b613eb782614211565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f128261402c565b9150613f1d8361402c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f5257613f51614155565b5b828201905092915050565b6000613f688261402c565b9150613f738361402c565b925082613f8357613f82614184565b5b828204905092915050565b6000613f998261402c565b9150613fa48361402c565b925082821015613fb757613fb6614155565b5b828203905092915050565b6000613fcd8261400c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614063578082015181840152602081019050614048565b83811115614072576000848401525b50505050565b6000600282049050600182168061409057607f821691505b602082108114156140a4576140a36141b3565b5b50919050565b6140b382614211565b810181811067ffffffffffffffff821117156140d2576140d16141e2565b5b80604052505050565b60006140e68261402c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561411957614118614155565b5b600182019050919050565b600061412f8261402c565b915061413a8361402c565b92508261414a57614149614184565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f43616e2774206d696e74206f76657220737570706c79206c696d697400000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f57726f6e6720616d6f756e742073656e74000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e74206f6e6520666f756e64696e67206d656d626560008201527f7273686970000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f537562736372697074696f6e20706c616e20646f6573206e6f74206578697374600082015250565b61483d81613fc2565b811461484857600080fd5b50565b61485481613fd4565b811461485f57600080fd5b50565b61486b81613fe0565b811461487657600080fd5b50565b6148828161402c565b811461488d57600080fd5b5056fea26469706673582212204ce18c8fd56b3099f438e75fdbd1d633c695473a41053f8016092ec4e1352e9e64736f6c63430008040033

Deployed Bytecode Sourcemap

188:5095:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5076:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2349:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3860:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3398:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3120:131:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3713:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1534:111:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4724:330:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1210:253:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3989:137:14;;;;;;;;;;;;;:::i;:::-;;4321:75;;;;;;;;;;;;;:::i;:::-;;5120:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1803:140:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1717:230:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4551:100:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1034:84:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1396:139:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2052:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3258:449:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1790:205:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1598:92:11;;;;;;;;;;;;;:::i;:::-;;4242:73:14;;;;;;;;;;;;;:::i;:::-;;966:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1949:765:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3902:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2511:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3814:82:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4402:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4144:290:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5365:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2980:134:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2679:329:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4657:119:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4500:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1839:189:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5076:205:14;5211:4;5238:36;5262:11;5238:23;:36::i;:::-;5231:43;;5076:205;;;:::o;2349:98:4:-;2403:13;2435:5;2428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2349:98;:::o;3860:217::-;3936:7;3963:16;3971:7;3963;:16::i;:::-;3955:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4046:15;:24;4062:7;4046:24;;;;;;;;;;;;;;;;;;;;;4039:31;;3860:217;;;:::o;3398:401::-;3478:13;3494:23;3509:7;3494:14;:23::i;:::-;3478:39;;3541:5;3535:11;;:2;:11;;;;3527:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3632:5;3616:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3641:37;3658:5;3665:12;:10;:12::i;:::-;3641:16;:37::i;:::-;3616:62;3595:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3771:21;3780:2;3784:7;3771:8;:21::i;:::-;3398:401;;;:::o;3120:131:14:-;3186:7;3212:22;:32;3235:8;3212:32;;;;;;;;;;;;;;;;3205:39;;3120:131;;;:::o;3713:95::-;3757:4;3780:21;3773:28;;3713:95;:::o;1534:111:5:-;1595:7;1621:10;:17;;;;1614:24;;1534:111;:::o;4724:330:4:-;4913:41;4932:12;:10;:12::i;:::-;4946:7;4913:18;:41::i;:::-;4905:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5019:28;5029:4;5035:2;5039:7;5019:9;:28::i;:::-;4724:330;;;:::o;1210:253:5:-;1307:7;1342:23;1359:5;1342:16;:23::i;:::-;1334:5;:31;1326:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1430:12;:19;1443:5;1430:19;;;;;;;;;;;;;;;:26;1450:5;1430:26;;;;;;;;;;;;1423:33;;1210:253;;;;:::o;3989:137:14:-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4036:12:14::1;4051:21;4036:36;;4090:10;4082:28;;:37;4111:7;4082:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1248:1:11;3989:137:14:o:0;4321:75::-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1613:8:12::1;:6;:8::i;:::-;1605:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;4379:10:14::2;:8;:10::i;:::-;4321:75::o:0;5120:179:4:-;5253:39;5270:4;5276:2;5280:7;5253:39;;;;;;;;;;;;:16;:39::i;:::-;5120:179;;;:::o;1803:140:14:-;1867:23;;:::i;:::-;1909:27;1930:5;1909:20;:27::i;:::-;1902:34;;1803:140;;;:::o;1717:230:5:-;1792:7;1827:30;:28;:30::i;:::-;1819:5;:38;1811:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1923:10;1934:5;1923:17;;;;;;;;;;;;;;;;;;;;;;;;1916:24;;1717:230;;;:::o;4551:100:14:-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4637:7:14::1;4621:13;:23;;;;;;;;;;;;:::i;:::-;;4551:100:::0;:::o;1034:84:12:-;1081:4;1104:7;;;;;;;;;;;1097:14;;1034:84;:::o;1396:139:14:-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1524:4:14::1;1497:17;:24;1515:5;1497:24;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;;1396:139:::0;;:::o;2052:235:4:-;2124:7;2143:13;2159:7;:16;2167:7;2159:16;;;;;;;;;;;;;;;;;;;;;2143:32;;2210:1;2193:19;;:5;:19;;;;2185:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2275:5;2268:12;;;2052:235;;;:::o;3258:449:14:-;1348:8:12;:6;:8::i;:::-;1347:9;1339:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;3346:6:14::1;;3333:9;:19;3325:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;3420:23;;3392:25;:15;:23;:25::i;:::-;:51;3384:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;3512:1;3494:14;3504:3;3494:9;:14::i;:::-;:19;3486:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;3566:27;:15;:25;:27::i;:::-;3608:41;3618:3;3623:25;:15;:23;:25::i;:::-;3608:9;:41::i;:::-;3669:3;3664:36;;;3674:25;:15;:23;:25::i;:::-;3664:36;;;;;;:::i;:::-;;;;;;;;3258:449:::0;:::o;1790:205:4:-;1862:7;1906:1;1889:19;;:5;:19;;;;1881:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1972:9;:16;1982:5;1972:16;;;;;;;;;;;;;;;;1965:23;;1790:205;;;:::o;1598:92:11:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;4242:73:14:-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1348:8:12::1;:6;:8::i;:::-;1347:9;1339:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;4300:8:14::2;:6;:8::i;:::-;4242:73::o:0;966:85:11:-;1012:7;1038:6;;;;;;;;;;;1031:13;;966:85;:::o;1949:765:14:-;1348:8:12;:6;:8::i;:::-;1347:9;1339:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;2036:28:14::1;2067:31;2088:9;2067:20;:31::i;:::-;2036:62;;2131:9;2117:4;:10;;;:23;2109:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;2196:1;2180:4;:13;;;:17;2172:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2245:20;2268:15;2245:38;;2359:27;2382:3;2359:22;:27::i;:::-;2356:99;;;2417:22;:27;2440:3;2417:27;;;;;;;;;;;;;;;;2402:42;;2356:99;2468:17;2503:4;:13;;;2488:12;:28;;;;:::i;:::-;2468:48;;2557:9;2527:22;:27;2550:3;2527:27;;;;;;;;;;;;;;;:39;;;;2576:32;:20;:30;:32::i;:::-;2624:83;2637:3;2642:4;2648:15;2665:9;2676:30;:20;:28;:30::i;:::-;2624:83;;;;;;;;;;:::i;:::-;;;;;;;;1387:1:12;;;1949:765:14::0;;:::o;3902:81::-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3971:5:14::1;3962:6;:14;;;;3902:81:::0;:::o;2511:102:4:-;2567:13;2599:7;2592:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2511:102;:::o;3814:82:14:-;3857:7;3883:6;;3876:13;;3814:82;:::o;4402:143::-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4460:27:14::1;:15;:25;:27::i;:::-;4498:40;4508:2;4512:25;:15;:23;:25::i;:::-;4498:9;:40::i;:::-;4402:143:::0;:::o;4144:290:4:-;4258:12;:10;:12::i;:::-;4246:24;;:8;:24;;;;4238:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4356:8;4311:18;:32;4330:12;:10;:12::i;:::-;4311:32;;;;;;;;;;;;;;;:42;4344:8;4311:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4408:8;4379:48;;4394:12;:10;:12::i;:::-;4379:48;;;4418:8;4379:48;;;;;;:::i;:::-;;;;;;;;4144:290;;:::o;5365:320::-;5534:41;5553:12;:10;:12::i;:::-;5567:7;5534:18;:41::i;:::-;5526:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5639:39;5653:4;5659:2;5663:7;5672:5;5639:13;:39::i;:::-;5365:320;;;;:::o;2980:134:14:-;3052:4;3075:32;3098:8;3075:22;:32::i;:::-;3068:39;;2980:134;;;:::o;2679:329:4:-;2752:13;2785:16;2793:7;2785;:16::i;:::-;2777:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2864:21;2888:10;:8;:10::i;:::-;2864:34;;2939:1;2921:7;2915:21;:25;:86;;;;;;;;;;;;;;;;;2967:7;2976:18;:7;:16;:18::i;:::-;2950:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2915:86;2908:93;;;2679:329;;;:::o;4657:119:14:-;4726:4;4768:1;4748:17;4758:6;4748:9;:17::i;:::-;:21;4741:28;;4657:119;;;:::o;4500:162:4:-;4597:4;4620:18;:25;4639:5;4620:25;;;;;;;;;;;;;;;:35;4646:8;4620:35;;;;;;;;;;;;;;;;;;;;;;;;;4613:42;;4500:162;;;;:::o;1839:189:11:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1947:1:::1;1927:22;;:8;:22;;;;1919:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2002:19;2012:8;2002:9;:19::i;:::-;1839:189:::0;:::o;891:123:2:-;996:1;978:7;:14;;;:19;;;;;;;;;;;891:123;:::o;773:112::-;838:7;864;:14;;;857:21;;773:112;;;:::o;718:377:0:-;778:4;981:12;1046:7;1034:20;1026:28;;1087:1;1080:4;:8;1073:15;;;718:377;;;:::o;2543:572:5:-;2682:45;2709:4;2715:2;2719:7;2682:26;:45::i;:::-;2758:1;2742:18;;:4;:18;;;2738:183;;;2776:40;2808:7;2776:31;:40::i;:::-;2738:183;;;2845:2;2837:10;;:4;:10;;;2833:88;;2863:47;2896:4;2902:7;2863:32;:47::i;:::-;2833:88;2738:183;2948:1;2934:16;;:2;:16;;;2930:179;;;2966:45;3003:7;2966:36;:45::i;:::-;2930:179;;;3038:4;3032:10;;:2;:10;;;3028:81;;3058:40;3086:2;3090:7;3058:27;:40::i;:::-;3028:81;2930:179;2543:572;;;:::o;13066:122:4:-;;;;:::o;909:222:5:-;1011:4;1049:35;1034:50;;;:11;:50;;;;:90;;;;1088:36;1112:11;1088:23;:36::i;:::-;1034:90;1027:97;;909:222;;;:::o;7157:125:4:-;7222:4;7273:1;7245:30;;:7;:16;7253:7;7245:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7238:37;;7157:125;;;:::o;587:96:1:-;640:7;666:10;659:17;;587:96;:::o;11008:171:4:-;11109:2;11082:15;:24;11098:7;11082:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11164:7;11160:2;11126:46;;11135:23;11150:7;11135:14;:23::i;:::-;11126:46;;;;;;;;;;;;11008:171;;:::o;7440:344::-;7533:4;7557:16;7565:7;7557;:16::i;:::-;7549:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7632:13;7648:23;7663:7;7648:14;:23::i;:::-;7632:39;;7700:5;7689:16;;:7;:16;;;:51;;;;7733:7;7709:31;;:20;7721:7;7709:11;:20::i;:::-;:31;;;7689:51;:87;;;;7744:32;7761:5;7768:7;7744:16;:32::i;:::-;7689:87;7681:96;;;7440:344;;;;:::o;10337:560::-;10491:4;10464:31;;:23;10479:7;10464:14;:23::i;:::-;:31;;;10456:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10573:1;10559:16;;:2;:16;;;;10551:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10627:39;10648:4;10654:2;10658:7;10627:20;:39::i;:::-;10728:29;10745:1;10749:7;10728:8;:29::i;:::-;10787:1;10768:9;:15;10778:4;10768:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10815:1;10798:9;:13;10808:2;10798:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10845:2;10826:7;:16;10834:7;10826:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10882:7;10878:2;10863:27;;10872:4;10863:27;;;;;;;;;;;;10337:560;;;:::o;2046:117:12:-;1613:8;:6;:8::i;:::-;1605:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2114:5:::1;2104:7;;:15;;;;;;;;;;;;;;;;;;2134:22;2143:12;:10;:12::i;:::-;2134:22;;;;;;:::i;:::-;;;;;;;;2046:117::o:0;1541:256:14:-;1605:23;;:::i;:::-;1640:28;1671:17;:24;1689:5;1671:24;;;;;;;;;;;1640:55;;;;;;;;;;;;;;;;;;;;;;;;;;;1730:1;1714:4;:13;;;:17;1706:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;1786:4;1779:11;;;1541:256;;;:::o;8114:108:4:-;8189:26;8199:2;8203:7;8189:26;;;;;;;;;;;;:9;:26::i;:::-;8114:108;;:::o;2034:169:11:-;2089:16;2108:6;;;;;;;;;;;2089:25;;2133:8;2124:6;;:17;;;;;;;;;;;;;;;;;;2187:8;2156:40;;2177:8;2156:40;;;;;;;;;;;;2034:169;;:::o;1799:115:12:-;1348:8;:6;:8::i;:::-;1347:9;1339:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1868:4:::1;1858:7;;:14;;;;;;;;;;;;;;;;;;1887:20;1894:12;:10;:12::i;:::-;1887:20;;;;;;:::i;:::-;;;;;;;;1799:115::o:0;2720:254:14:-;2792:4;2948:15;2913:22;:32;2936:8;2913:32;;;;;;;;;;;;;;;;:50;2906:57;;2720:254;;;:::o;6547:307:4:-;6698:28;6708:4;6714:2;6718:7;6698:9;:28::i;:::-;6744:48;6767:4;6773:2;6777:7;6786:5;6744:22;:48::i;:::-;6736:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6547:307;;;;:::o;4132:104:14:-;4184:13;4216;4209:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4132:104;:::o;275:703:13:-;331:13;557:1;548:5;:10;544:51;;;574:10;;;;;;;;;;;;;;;;;;;;;544:51;604:12;619:5;604:20;;634:14;658:75;673:1;665:4;:9;658:75;;690:8;;;;;:::i;:::-;;;;720:2;712:10;;;;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:39;;791:150;807:1;798:5;:10;791:150;;834:1;824:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;3821:161:5:-;3924:10;:17;;;;3897:15;:24;3913:7;3897:24;;;;;;;;;;;:44;;;;3951:10;3967:7;3951:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3821:161;:::o;4599:970::-;4861:22;4911:1;4886:22;4903:4;4886:16;:22::i;:::-;:26;;;;:::i;:::-;4861:51;;4922:18;4943:17;:26;4961:7;4943:26;;;;;;;;;;;;4922:47;;5087:14;5073:10;:28;5069:323;;5117:19;5139:12;:18;5152:4;5139:18;;;;;;;;;;;;;;;:34;5158:14;5139:34;;;;;;;;;;;;5117:56;;5221:11;5188:12;:18;5201:4;5188:18;;;;;;;;;;;;;;;:30;5207:10;5188:30;;;;;;;;;;;:44;;;;5337:10;5304:17;:30;5322:11;5304:30;;;;;;;;;;;:43;;;;5069:323;;5485:17;:26;5503:7;5485:26;;;;;;;;;;;5478:33;;;5528:12;:18;5541:4;5528:18;;;;;;;;;;;;;;;:34;5547:14;5528:34;;;;;;;;;;;5521:41;;;4599:970;;;;:::o;5857:1061::-;6106:22;6151:1;6131:10;:17;;;;:21;;;;:::i;:::-;6106:46;;6162:18;6183:15;:24;6199:7;6183:24;;;;;;;;;;;;6162:45;;6529:19;6551:10;6562:14;6551:26;;;;;;;;;;;;;;;;;;;;;;;;6529:48;;6613:11;6588:10;6599;6588:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6723:10;6692:15;:28;6708:11;6692:28;;;;;;;;;;;:41;;;;6861:15;:24;6877:7;6861:24;;;;;;;;;;;6854:31;;;6895:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5857:1061;;;;:::o;3409:217::-;3493:14;3510:20;3527:2;3510:16;:20::i;:::-;3493:37;;3567:7;3540:12;:16;3553:2;3540:16;;;;;;;;;;;;;;;:24;3557:6;3540:24;;;;;;;;;;;:34;;;;3613:6;3584:17;:26;3602:7;3584:26;;;;;;;;;;;:35;;;;3409:217;;;:::o;1431:300:4:-;1533:4;1583:25;1568:40;;;:11;:40;;;;:104;;;;1639:33;1624:48;;;:11;:48;;;;1568:104;:156;;;;1688:36;1712:11;1688:23;:36::i;:::-;1568:156;1549:175;;1431:300;;;:::o;4782:221:14:-;1348:8:12;:6;:8::i;:::-;1347:9;1339:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;4951:45:14::1;4978:4;4984:2;4988:7;4951:26;:45::i;:::-;4782:221:::0;;;:::o;8443:311:4:-;8568:18;8574:2;8578:7;8568:5;:18::i;:::-;8617:54;8648:1;8652:2;8656:7;8665:5;8617:22;:54::i;:::-;8596:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8443:311;;;:::o;11732:778::-;11882:4;11902:15;:2;:13;;;:15::i;:::-;11898:606;;;11953:2;11937:36;;;11974:12;:10;:12::i;:::-;11988:4;11994:7;12003:5;11937:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11933:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12193:1;12176:6;:13;:18;12172:266;;;12218:60;;;;;;;;;;:::i;:::-;;;;;;;;12172:266;12390:6;12384:13;12375:6;12371:2;12367:15;12360:38;11933:519;12069:41;;;12059:51;;;:6;:51;;;;12052:58;;;;;11898:606;12489:4;12482:11;;11732:778;;;;;;;:::o;763:155:3:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;9076:372:4:-;9169:1;9155:16;;:2;:16;;;;9147:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9227:16;9235:7;9227;:16::i;:::-;9226:17;9218:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9287:45;9316:1;9320:2;9324:7;9287:20;:45::i;:::-;9360:1;9343:9;:13;9353:2;9343:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9390:2;9371:7;:16;9379:7;9371:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9433:7;9429:2;9408:33;;9425:1;9408:33;;;;;;;;;;;;9076:372;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:15:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1917:521::-;2000:5;2044:4;2032:9;2027:3;2023:19;2019:30;2016:2;;;2062:1;2059;2052:12;2016:2;2084:21;2100:4;2084:21;:::i;:::-;2075:30;;2165:1;2205:49;2250:3;2241:6;2230:9;2226:22;2205:49;:::i;:::-;2198:4;2191:5;2187:16;2180:75;2115:151;2329:2;2370:49;2415:3;2406:6;2395:9;2391:22;2370:49;:::i;:::-;2363:4;2356:5;2352:16;2345:75;2276:155;2006:432;;;;:::o;2444:139::-;2490:5;2528:6;2515:20;2506:29;;2544:33;2571:5;2544:33;:::i;:::-;2496:87;;;;:::o;2589:262::-;2648:6;2697:2;2685:9;2676:7;2672:23;2668:32;2665:2;;;2713:1;2710;2703:12;2665:2;2756:1;2781:53;2826:7;2817:6;2806:9;2802:22;2781:53;:::i;:::-;2771:63;;2727:117;2655:196;;;;:::o;2857:407::-;2925:6;2933;2982:2;2970:9;2961:7;2957:23;2953:32;2950:2;;;2998:1;2995;2988:12;2950:2;3041:1;3066:53;3111:7;3102:6;3091:9;3087:22;3066:53;:::i;:::-;3056:63;;3012:117;3168:2;3194:53;3239:7;3230:6;3219:9;3215:22;3194:53;:::i;:::-;3184:63;;3139:118;2940:324;;;;;:::o;3270:552::-;3347:6;3355;3363;3412:2;3400:9;3391:7;3387:23;3383:32;3380:2;;;3428:1;3425;3418:12;3380:2;3471:1;3496:53;3541:7;3532:6;3521:9;3517:22;3496:53;:::i;:::-;3486:63;;3442:117;3598:2;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3569:118;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3370:452;;;;;:::o;3828:809::-;3923:6;3931;3939;3947;3996:3;3984:9;3975:7;3971:23;3967:33;3964:2;;;4013:1;4010;4003:12;3964:2;4056:1;4081:53;4126:7;4117:6;4106:9;4102:22;4081:53;:::i;:::-;4071:63;;4027:117;4183:2;4209:53;4254:7;4245:6;4234:9;4230:22;4209:53;:::i;:::-;4199:63;;4154:118;4311:2;4337:53;4382:7;4373:6;4362:9;4358:22;4337:53;:::i;:::-;4327:63;;4282:118;4467:2;4456:9;4452:18;4439:32;4498:18;4490:6;4487:30;4484:2;;;4530:1;4527;4520:12;4484:2;4558:62;4612:7;4603:6;4592:9;4588:22;4558:62;:::i;:::-;4548:72;;4410:220;3954:683;;;;;;;:::o;4643:401::-;4708:6;4716;4765:2;4753:9;4744:7;4740:23;4736:32;4733:2;;;4781:1;4778;4771:12;4733:2;4824:1;4849:53;4894:7;4885:6;4874:9;4870:22;4849:53;:::i;:::-;4839:63;;4795:117;4951:2;4977:50;5019:7;5010:6;4999:9;4995:22;4977:50;:::i;:::-;4967:60;;4922:115;4723:321;;;;;:::o;5050:407::-;5118:6;5126;5175:2;5163:9;5154:7;5150:23;5146:32;5143:2;;;5191:1;5188;5181:12;5143:2;5234:1;5259:53;5304:7;5295:6;5284:9;5280:22;5259:53;:::i;:::-;5249:63;;5205:117;5361:2;5387:53;5432:7;5423:6;5412:9;5408:22;5387:53;:::i;:::-;5377:63;;5332:118;5133:324;;;;;:::o;5463:260::-;5521:6;5570:2;5558:9;5549:7;5545:23;5541:32;5538:2;;;5586:1;5583;5576:12;5538:2;5629:1;5654:52;5698:7;5689:6;5678:9;5674:22;5654:52;:::i;:::-;5644:62;;5600:116;5528:195;;;;:::o;5729:282::-;5798:6;5847:2;5835:9;5826:7;5822:23;5818:32;5815:2;;;5863:1;5860;5853:12;5815:2;5906:1;5931:63;5986:7;5977:6;5966:9;5962:22;5931:63;:::i;:::-;5921:73;;5877:127;5805:206;;;;:::o;6017:375::-;6086:6;6135:2;6123:9;6114:7;6110:23;6106:32;6103:2;;;6151:1;6148;6141:12;6103:2;6222:1;6211:9;6207:17;6194:31;6252:18;6244:6;6241:30;6238:2;;;6284:1;6281;6274:12;6238:2;6312:63;6367:7;6358:6;6347:9;6343:22;6312:63;:::i;:::-;6302:73;;6165:220;6093:299;;;;:::o;6398:262::-;6457:6;6506:2;6494:9;6485:7;6481:23;6477:32;6474:2;;;6522:1;6519;6512:12;6474:2;6565:1;6590:53;6635:7;6626:6;6615:9;6611:22;6590:53;:::i;:::-;6580:63;;6536:117;6464:196;;;;:::o;6666:475::-;6768:6;6776;6825:2;6813:9;6804:7;6800:23;6796:32;6793:2;;;6841:1;6838;6831:12;6793:2;6884:1;6909:53;6954:7;6945:6;6934:9;6930:22;6909:53;:::i;:::-;6899:63;;6855:117;7011:2;7037:87;7116:7;7107:6;7096:9;7092:22;7037:87;:::i;:::-;7027:97;;6982:152;6783:358;;;;;:::o;7147:118::-;7234:24;7252:5;7234:24;:::i;:::-;7229:3;7222:37;7212:53;;:::o;7271:109::-;7352:21;7367:5;7352:21;:::i;:::-;7347:3;7340:34;7330:50;;:::o;7386:360::-;7472:3;7500:38;7532:5;7500:38;:::i;:::-;7554:70;7617:6;7612:3;7554:70;:::i;:::-;7547:77;;7633:52;7678:6;7673:3;7666:4;7659:5;7655:16;7633:52;:::i;:::-;7710:29;7732:6;7710:29;:::i;:::-;7705:3;7701:39;7694:46;;7476:270;;;;;:::o;7752:364::-;7840:3;7868:39;7901:5;7868:39;:::i;:::-;7923:71;7987:6;7982:3;7923:71;:::i;:::-;7916:78;;8003:52;8048:6;8043:3;8036:4;8029:5;8025:16;8003:52;:::i;:::-;8080:29;8102:6;8080:29;:::i;:::-;8075:3;8071:39;8064:46;;7844:272;;;;;:::o;8122:377::-;8228:3;8256:39;8289:5;8256:39;:::i;:::-;8311:89;8393:6;8388:3;8311:89;:::i;:::-;8304:96;;8409:52;8454:6;8449:3;8442:4;8435:5;8431:16;8409:52;:::i;:::-;8486:6;8481:3;8477:16;8470:23;;8232:267;;;;;:::o;8505:366::-;8647:3;8668:67;8732:2;8727:3;8668:67;:::i;:::-;8661:74;;8744:93;8833:3;8744:93;:::i;:::-;8862:2;8857:3;8853:12;8846:19;;8651:220;;;:::o;8877:366::-;9019:3;9040:67;9104:2;9099:3;9040:67;:::i;:::-;9033:74;;9116:93;9205:3;9116:93;:::i;:::-;9234:2;9229:3;9225:12;9218:19;;9023:220;;;:::o;9249:366::-;9391:3;9412:67;9476:2;9471:3;9412:67;:::i;:::-;9405:74;;9488:93;9577:3;9488:93;:::i;:::-;9606:2;9601:3;9597:12;9590:19;;9395:220;;;:::o;9621:366::-;9763:3;9784:67;9848:2;9843:3;9784:67;:::i;:::-;9777:74;;9860:93;9949:3;9860:93;:::i;:::-;9978:2;9973:3;9969:12;9962:19;;9767:220;;;:::o;9993:366::-;10135:3;10156:67;10220:2;10215:3;10156:67;:::i;:::-;10149:74;;10232:93;10321:3;10232:93;:::i;:::-;10350:2;10345:3;10341:12;10334:19;;10139:220;;;:::o;10365:366::-;10507:3;10528:67;10592:2;10587:3;10528:67;:::i;:::-;10521:74;;10604:93;10693:3;10604:93;:::i;:::-;10722:2;10717:3;10713:12;10706:19;;10511:220;;;:::o;10737:366::-;10879:3;10900:67;10964:2;10959:3;10900:67;:::i;:::-;10893:74;;10976:93;11065:3;10976:93;:::i;:::-;11094:2;11089:3;11085:12;11078:19;;10883:220;;;:::o;11109:366::-;11251:3;11272:67;11336:2;11331:3;11272:67;:::i;:::-;11265:74;;11348:93;11437:3;11348:93;:::i;:::-;11466:2;11461:3;11457:12;11450:19;;11255:220;;;:::o;11481:366::-;11623:3;11644:67;11708:2;11703:3;11644:67;:::i;:::-;11637:74;;11720:93;11809:3;11720:93;:::i;:::-;11838:2;11833:3;11829:12;11822:19;;11627:220;;;:::o;11853:366::-;11995:3;12016:67;12080:2;12075:3;12016:67;:::i;:::-;12009:74;;12092:93;12181:3;12092:93;:::i;:::-;12210:2;12205:3;12201:12;12194:19;;11999:220;;;:::o;12225:366::-;12367:3;12388:67;12452:2;12447:3;12388:67;:::i;:::-;12381:74;;12464:93;12553:3;12464:93;:::i;:::-;12582:2;12577:3;12573:12;12566:19;;12371:220;;;:::o;12597:366::-;12739:3;12760:67;12824:2;12819:3;12760:67;:::i;:::-;12753:74;;12836:93;12925:3;12836:93;:::i;:::-;12954:2;12949:3;12945:12;12938:19;;12743:220;;;:::o;12969:366::-;13111:3;13132:67;13196:2;13191:3;13132:67;:::i;:::-;13125:74;;13208:93;13297:3;13208:93;:::i;:::-;13326:2;13321:3;13317:12;13310:19;;13115:220;;;:::o;13341:366::-;13483:3;13504:67;13568:2;13563:3;13504:67;:::i;:::-;13497:74;;13580:93;13669:3;13580:93;:::i;:::-;13698:2;13693:3;13689:12;13682:19;;13487:220;;;:::o;13713:366::-;13855:3;13876:67;13940:2;13935:3;13876:67;:::i;:::-;13869:74;;13952:93;14041:3;13952:93;:::i;:::-;14070:2;14065:3;14061:12;14054:19;;13859:220;;;:::o;14085:366::-;14227:3;14248:67;14312:2;14307:3;14248:67;:::i;:::-;14241:74;;14324:93;14413:3;14324:93;:::i;:::-;14442:2;14437:3;14433:12;14426:19;;14231:220;;;:::o;14457:366::-;14599:3;14620:67;14684:2;14679:3;14620:67;:::i;:::-;14613:74;;14696:93;14785:3;14696:93;:::i;:::-;14814:2;14809:3;14805:12;14798:19;;14603:220;;;:::o;14829:366::-;14971:3;14992:67;15056:2;15051:3;14992:67;:::i;:::-;14985:74;;15068:93;15157:3;15068:93;:::i;:::-;15186:2;15181:3;15177:12;15170:19;;14975:220;;;:::o;15201:366::-;15343:3;15364:67;15428:2;15423:3;15364:67;:::i;:::-;15357:74;;15440:93;15529:3;15440:93;:::i;:::-;15558:2;15553:3;15549:12;15542:19;;15347:220;;;:::o;15573:366::-;15715:3;15736:67;15800:2;15795:3;15736:67;:::i;:::-;15729:74;;15812:93;15901:3;15812:93;:::i;:::-;15930:2;15925:3;15921:12;15914:19;;15719:220;;;:::o;15945:366::-;16087:3;16108:67;16172:2;16167:3;16108:67;:::i;:::-;16101:74;;16184:93;16273:3;16184:93;:::i;:::-;16302:2;16297:3;16293:12;16286:19;;16091:220;;;:::o;16317:366::-;16459:3;16480:67;16544:2;16539:3;16480:67;:::i;:::-;16473:74;;16556:93;16645:3;16556:93;:::i;:::-;16674:2;16669:3;16665:12;16658:19;;16463:220;;;:::o;16689:366::-;16831:3;16852:67;16916:2;16911:3;16852:67;:::i;:::-;16845:74;;16928:93;17017:3;16928:93;:::i;:::-;17046:2;17041:3;17037:12;17030:19;;16835:220;;;:::o;17061:366::-;17203:3;17224:67;17288:2;17283:3;17224:67;:::i;:::-;17217:74;;17300:93;17389:3;17300:93;:::i;:::-;17418:2;17413:3;17409:12;17402:19;;17207:220;;;:::o;17535:530::-;17700:4;17695:3;17691:14;17788:4;17781:5;17777:16;17771:23;17807:63;17864:4;17859:3;17855:14;17841:12;17807:63;:::i;:::-;17715:165;17966:4;17959:5;17955:16;17949:23;17985:63;18042:4;18037:3;18033:14;18019:12;17985:63;:::i;:::-;17890:168;17669:396;;;:::o;18071:108::-;18148:24;18166:5;18148:24;:::i;:::-;18143:3;18136:37;18126:53;;:::o;18185:118::-;18272:24;18290:5;18272:24;:::i;:::-;18267:3;18260:37;18250:53;;:::o;18309:435::-;18489:3;18511:95;18602:3;18593:6;18511:95;:::i;:::-;18504:102;;18623:95;18714:3;18705:6;18623:95;:::i;:::-;18616:102;;18735:3;18728:10;;18493:251;;;;;:::o;18750:222::-;18843:4;18881:2;18870:9;18866:18;18858:26;;18894:71;18962:1;18951:9;18947:17;18938:6;18894:71;:::i;:::-;18848:124;;;;:::o;18978:640::-;19173:4;19211:3;19200:9;19196:19;19188:27;;19225:71;19293:1;19282:9;19278:17;19269:6;19225:71;:::i;:::-;19306:72;19374:2;19363:9;19359:18;19350:6;19306:72;:::i;:::-;19388;19456:2;19445:9;19441:18;19432:6;19388:72;:::i;:::-;19507:9;19501:4;19497:20;19492:2;19481:9;19477:18;19470:48;19535:76;19606:4;19597:6;19535:76;:::i;:::-;19527:84;;19178:440;;;;;;;:::o;19624:801::-;19897:4;19935:3;19924:9;19920:19;19912:27;;19949:71;20017:1;20006:9;20002:17;19993:6;19949:71;:::i;:::-;20030:140;20166:2;20155:9;20151:18;20142:6;20030:140;:::i;:::-;20180:72;20248:2;20237:9;20233:18;20224:6;20180:72;:::i;:::-;20262:73;20330:3;20319:9;20315:19;20306:6;20262:73;:::i;:::-;20345;20413:3;20402:9;20398:19;20389:6;20345:73;:::i;:::-;19902:523;;;;;;;;:::o;20431:210::-;20518:4;20556:2;20545:9;20541:18;20533:26;;20569:65;20631:1;20620:9;20616:17;20607:6;20569:65;:::i;:::-;20523:118;;;;:::o;20647:313::-;20760:4;20798:2;20787:9;20783:18;20775:26;;20847:9;20841:4;20837:20;20833:1;20822:9;20818:17;20811:47;20875:78;20948:4;20939:6;20875:78;:::i;:::-;20867:86;;20765:195;;;;:::o;20966:419::-;21132:4;21170:2;21159:9;21155:18;21147:26;;21219:9;21213:4;21209:20;21205:1;21194:9;21190:17;21183:47;21247:131;21373:4;21247:131;:::i;:::-;21239:139;;21137:248;;;:::o;21391:419::-;21557:4;21595:2;21584:9;21580:18;21572:26;;21644:9;21638:4;21634:20;21630:1;21619:9;21615:17;21608:47;21672:131;21798:4;21672:131;:::i;:::-;21664:139;;21562:248;;;:::o;21816:419::-;21982:4;22020:2;22009:9;22005:18;21997:26;;22069:9;22063:4;22059:20;22055:1;22044:9;22040:17;22033:47;22097:131;22223:4;22097:131;:::i;:::-;22089:139;;21987:248;;;:::o;22241:419::-;22407:4;22445:2;22434:9;22430:18;22422:26;;22494:9;22488:4;22484:20;22480:1;22469:9;22465:17;22458:47;22522:131;22648:4;22522:131;:::i;:::-;22514:139;;22412:248;;;:::o;22666:419::-;22832:4;22870:2;22859:9;22855:18;22847:26;;22919:9;22913:4;22909:20;22905:1;22894:9;22890:17;22883:47;22947:131;23073:4;22947:131;:::i;:::-;22939:139;;22837:248;;;:::o;23091:419::-;23257:4;23295:2;23284:9;23280:18;23272:26;;23344:9;23338:4;23334:20;23330:1;23319:9;23315:17;23308:47;23372:131;23498:4;23372:131;:::i;:::-;23364:139;;23262:248;;;:::o;23516:419::-;23682:4;23720:2;23709:9;23705:18;23697:26;;23769:9;23763:4;23759:20;23755:1;23744:9;23740:17;23733:47;23797:131;23923:4;23797:131;:::i;:::-;23789:139;;23687:248;;;:::o;23941:419::-;24107:4;24145:2;24134:9;24130:18;24122:26;;24194:9;24188:4;24184:20;24180:1;24169:9;24165:17;24158:47;24222:131;24348:4;24222:131;:::i;:::-;24214:139;;24112:248;;;:::o;24366:419::-;24532:4;24570:2;24559:9;24555:18;24547:26;;24619:9;24613:4;24609:20;24605:1;24594:9;24590:17;24583:47;24647:131;24773:4;24647:131;:::i;:::-;24639:139;;24537:248;;;:::o;24791:419::-;24957:4;24995:2;24984:9;24980:18;24972:26;;25044:9;25038:4;25034:20;25030:1;25019:9;25015:17;25008:47;25072:131;25198:4;25072:131;:::i;:::-;25064:139;;24962:248;;;:::o;25216:419::-;25382:4;25420:2;25409:9;25405:18;25397:26;;25469:9;25463:4;25459:20;25455:1;25444:9;25440:17;25433:47;25497:131;25623:4;25497:131;:::i;:::-;25489:139;;25387:248;;;:::o;25641:419::-;25807:4;25845:2;25834:9;25830:18;25822:26;;25894:9;25888:4;25884:20;25880:1;25869:9;25865:17;25858:47;25922:131;26048:4;25922:131;:::i;:::-;25914:139;;25812:248;;;:::o;26066:419::-;26232:4;26270:2;26259:9;26255:18;26247:26;;26319:9;26313:4;26309:20;26305:1;26294:9;26290:17;26283:47;26347:131;26473:4;26347:131;:::i;:::-;26339:139;;26237:248;;;:::o;26491:419::-;26657:4;26695:2;26684:9;26680:18;26672:26;;26744:9;26738:4;26734:20;26730:1;26719:9;26715:17;26708:47;26772:131;26898:4;26772:131;:::i;:::-;26764:139;;26662:248;;;:::o;26916:419::-;27082:4;27120:2;27109:9;27105:18;27097:26;;27169:9;27163:4;27159:20;27155:1;27144:9;27140:17;27133:47;27197:131;27323:4;27197:131;:::i;:::-;27189:139;;27087:248;;;:::o;27341:419::-;27507:4;27545:2;27534:9;27530:18;27522:26;;27594:9;27588:4;27584:20;27580:1;27569:9;27565:17;27558:47;27622:131;27748:4;27622:131;:::i;:::-;27614:139;;27512:248;;;:::o;27766:419::-;27932:4;27970:2;27959:9;27955:18;27947:26;;28019:9;28013:4;28009:20;28005:1;27994:9;27990:17;27983:47;28047:131;28173:4;28047:131;:::i;:::-;28039:139;;27937:248;;;:::o;28191:419::-;28357:4;28395:2;28384:9;28380:18;28372:26;;28444:9;28438:4;28434:20;28430:1;28419:9;28415:17;28408:47;28472:131;28598:4;28472:131;:::i;:::-;28464:139;;28362:248;;;:::o;28616:419::-;28782:4;28820:2;28809:9;28805:18;28797:26;;28869:9;28863:4;28859:20;28855:1;28844:9;28840:17;28833:47;28897:131;29023:4;28897:131;:::i;:::-;28889:139;;28787:248;;;:::o;29041:419::-;29207:4;29245:2;29234:9;29230:18;29222:26;;29294:9;29288:4;29284:20;29280:1;29269:9;29265:17;29258:47;29322:131;29448:4;29322:131;:::i;:::-;29314:139;;29212:248;;;:::o;29466:419::-;29632:4;29670:2;29659:9;29655:18;29647:26;;29719:9;29713:4;29709:20;29705:1;29694:9;29690:17;29683:47;29747:131;29873:4;29747:131;:::i;:::-;29739:139;;29637:248;;;:::o;29891:419::-;30057:4;30095:2;30084:9;30080:18;30072:26;;30144:9;30138:4;30134:20;30130:1;30119:9;30115:17;30108:47;30172:131;30298:4;30172:131;:::i;:::-;30164:139;;30062:248;;;:::o;30316:419::-;30482:4;30520:2;30509:9;30505:18;30497:26;;30569:9;30563:4;30559:20;30555:1;30544:9;30540:17;30533:47;30597:131;30723:4;30597:131;:::i;:::-;30589:139;;30487:248;;;:::o;30741:419::-;30907:4;30945:2;30934:9;30930:18;30922:26;;30994:9;30988:4;30984:20;30980:1;30969:9;30965:17;30958:47;31022:131;31148:4;31022:131;:::i;:::-;31014:139;;30912:248;;;:::o;31166:358::-;31327:4;31365:2;31354:9;31350:18;31342:26;;31378:139;31514:1;31503:9;31499:17;31490:6;31378:139;:::i;:::-;31332:192;;;;:::o;31530:222::-;31623:4;31661:2;31650:9;31646:18;31638:26;;31674:71;31742:1;31731:9;31727:17;31718:6;31674:71;:::i;:::-;31628:124;;;;:::o;31758:129::-;31792:6;31819:20;;:::i;:::-;31809:30;;31848:33;31876:4;31868:6;31848:33;:::i;:::-;31799:88;;;:::o;31893:75::-;31926:6;31959:2;31953:9;31943:19;;31933:35;:::o;31974:307::-;32035:4;32125:18;32117:6;32114:30;32111:2;;;32147:18;;:::i;:::-;32111:2;32185:29;32207:6;32185:29;:::i;:::-;32177:37;;32269:4;32263;32259:15;32251:23;;32040:241;;;:::o;32287:308::-;32349:4;32439:18;32431:6;32428:30;32425:2;;;32461:18;;:::i;:::-;32425:2;32499:29;32521:6;32499:29;:::i;:::-;32491:37;;32583:4;32577;32573:15;32565:23;;32354:241;;;:::o;32601:98::-;32652:6;32686:5;32680:12;32670:22;;32659:40;;;:::o;32705:99::-;32757:6;32791:5;32785:12;32775:22;;32764:40;;;:::o;32810:168::-;32893:11;32927:6;32922:3;32915:19;32967:4;32962:3;32958:14;32943:29;;32905:73;;;;:::o;32984:169::-;33068:11;33102:6;33097:3;33090:19;33142:4;33137:3;33133:14;33118:29;;33080:73;;;;:::o;33159:148::-;33261:11;33298:3;33283:18;;33273:34;;;;:::o;33313:305::-;33353:3;33372:20;33390:1;33372:20;:::i;:::-;33367:25;;33406:20;33424:1;33406:20;:::i;:::-;33401:25;;33560:1;33492:66;33488:74;33485:1;33482:81;33479:2;;;33566:18;;:::i;:::-;33479:2;33610:1;33607;33603:9;33596:16;;33357:261;;;;:::o;33624:185::-;33664:1;33681:20;33699:1;33681:20;:::i;:::-;33676:25;;33715:20;33733:1;33715:20;:::i;:::-;33710:25;;33754:1;33744:2;;33759:18;;:::i;:::-;33744:2;33801:1;33798;33794:9;33789:14;;33666:143;;;;:::o;33815:191::-;33855:4;33875:20;33893:1;33875:20;:::i;:::-;33870:25;;33909:20;33927:1;33909:20;:::i;:::-;33904:25;;33948:1;33945;33942:8;33939:2;;;33953:18;;:::i;:::-;33939:2;33998:1;33995;33991:9;33983:17;;33860:146;;;;:::o;34012:96::-;34049:7;34078:24;34096:5;34078:24;:::i;:::-;34067:35;;34057:51;;;:::o;34114:90::-;34148:7;34191:5;34184:13;34177:21;34166:32;;34156:48;;;:::o;34210:149::-;34246:7;34286:66;34279:5;34275:78;34264:89;;34254:105;;;:::o;34365:126::-;34402:7;34442:42;34435:5;34431:54;34420:65;;34410:81;;;:::o;34497:77::-;34534:7;34563:5;34552:16;;34542:32;;;:::o;34580:154::-;34664:6;34659:3;34654;34641:30;34726:1;34717:6;34712:3;34708:16;34701:27;34631:103;;;:::o;34740:307::-;34808:1;34818:113;34832:6;34829:1;34826:13;34818:113;;;34917:1;34912:3;34908:11;34902:18;34898:1;34893:3;34889:11;34882:39;34854:2;34851:1;34847:10;34842:15;;34818:113;;;34949:6;34946:1;34943:13;34940:2;;;35029:1;35020:6;35015:3;35011:16;35004:27;34940:2;34789:258;;;;:::o;35053:320::-;35097:6;35134:1;35128:4;35124:12;35114:22;;35181:1;35175:4;35171:12;35202:18;35192:2;;35258:4;35250:6;35246:17;35236:27;;35192:2;35320;35312:6;35309:14;35289:18;35286:38;35283:2;;;35339:18;;:::i;:::-;35283:2;35104:269;;;;:::o;35379:281::-;35462:27;35484:4;35462:27;:::i;:::-;35454:6;35450:40;35592:6;35580:10;35577:22;35556:18;35544:10;35541:34;35538:62;35535:2;;;35603:18;;:::i;:::-;35535:2;35643:10;35639:2;35632:22;35422:238;;;:::o;35666:233::-;35705:3;35728:24;35746:5;35728:24;:::i;:::-;35719:33;;35774:66;35767:5;35764:77;35761:2;;;35844:18;;:::i;:::-;35761:2;35891:1;35884:5;35880:13;35873:20;;35709:190;;;:::o;35905:176::-;35937:1;35954:20;35972:1;35954:20;:::i;:::-;35949:25;;35988:20;36006:1;35988:20;:::i;:::-;35983:25;;36027:1;36017:2;;36032:18;;:::i;:::-;36017:2;36073:1;36070;36066:9;36061:14;;35939:142;;;;:::o;36087:180::-;36135:77;36132:1;36125:88;36232:4;36229:1;36222:15;36256:4;36253:1;36246:15;36273:180;36321:77;36318:1;36311:88;36418:4;36415:1;36408:15;36442:4;36439:1;36432:15;36459:180;36507:77;36504:1;36497:88;36604:4;36601:1;36594:15;36628:4;36625:1;36618:15;36645:180;36693:77;36690:1;36683:88;36790:4;36787:1;36780:15;36814:4;36811:1;36804:15;36831:102;36872:6;36923:2;36919:7;36914:2;36907:5;36903:14;36899:28;36889:38;;36879:54;;;:::o;36939:170::-;37079:22;37075:1;37067:6;37063:14;37056:46;37045:64;:::o;37115:178::-;37255:30;37251:1;37243:6;37239:14;37232:54;37221:72;:::o;37299:230::-;37439:34;37435:1;37427:6;37423:14;37416:58;37508:13;37503:2;37495:6;37491:15;37484:38;37405:124;:::o;37535:237::-;37675:34;37671:1;37663:6;37659:14;37652:58;37744:20;37739:2;37731:6;37727:15;37720:45;37641:131;:::o;37778:225::-;37918:34;37914:1;37906:6;37902:14;37895:58;37987:8;37982:2;37974:6;37970:15;37963:33;37884:119;:::o;38009:178::-;38149:30;38145:1;38137:6;38133:14;38126:54;38115:72;:::o;38193:223::-;38333:34;38329:1;38321:6;38317:14;38310:58;38402:6;38397:2;38389:6;38385:15;38378:31;38299:117;:::o;38422:175::-;38562:27;38558:1;38550:6;38546:14;38539:51;38528:69;:::o;38603:231::-;38743:34;38739:1;38731:6;38727:14;38720:58;38812:14;38807:2;38799:6;38795:15;38788:39;38709:125;:::o;38840:166::-;38980:18;38976:1;38968:6;38964:14;38957:42;38946:60;:::o;39012:243::-;39152:34;39148:1;39140:6;39136:14;39129:58;39221:26;39216:2;39208:6;39204:15;39197:51;39118:137;:::o;39261:229::-;39401:34;39397:1;39389:6;39385:14;39378:58;39470:12;39465:2;39457:6;39453:15;39446:37;39367:123;:::o;39496:228::-;39636:34;39632:1;39624:6;39620:14;39613:58;39705:11;39700:2;39692:6;39688:15;39681:36;39602:122;:::o;39730:182::-;39870:34;39866:1;39858:6;39854:14;39847:58;39836:76;:::o;39918:231::-;40058:34;40054:1;40046:6;40042:14;40035:58;40127:14;40122:2;40114:6;40110:15;40103:39;40024:125;:::o;40155:182::-;40295:34;40291:1;40283:6;40279:14;40272:58;40261:76;:::o;40343:228::-;40483:34;40479:1;40471:6;40467:14;40460:58;40552:11;40547:2;40539:6;40535:15;40528:36;40449:122;:::o;40577:234::-;40717:34;40713:1;40705:6;40701:14;40694:58;40786:17;40781:2;40773:6;40769:15;40762:42;40683:128;:::o;40817:167::-;40957:19;40953:1;40945:6;40941:14;40934:43;40923:61;:::o;40990:220::-;41130:34;41126:1;41118:6;41114:14;41107:58;41199:3;41194:2;41186:6;41182:15;41175:28;41096:114;:::o;41216:224::-;41356:34;41352:1;41344:6;41340:14;41333:58;41425:7;41420:2;41412:6;41408:15;41401:32;41322:118;:::o;41446:236::-;41586:34;41582:1;41574:6;41570:14;41563:58;41655:19;41650:2;41642:6;41638:15;41631:44;41552:130;:::o;41688:231::-;41828:34;41824:1;41816:6;41812:14;41805:58;41897:14;41892:2;41884:6;41880:15;41873:39;41794:125;:::o;41925:182::-;42065:34;42061:1;42053:6;42049:14;42042:58;42031:76;:::o;42113:122::-;42186:24;42204:5;42186:24;:::i;:::-;42179:5;42176:35;42166:2;;42225:1;42222;42215:12;42166:2;42156:79;:::o;42241:116::-;42311:21;42326:5;42311:21;:::i;:::-;42304:5;42301:32;42291:2;;42347:1;42344;42337:12;42291:2;42281:76;:::o;42363:120::-;42435:23;42452:5;42435:23;:::i;:::-;42428:5;42425:34;42415:2;;42473:1;42470;42463:12;42415:2;42405:78;:::o;42489:122::-;42562:24;42580:5;42562:24;:::i;:::-;42555:5;42552:35;42542:2;;42601:1;42598;42591:12;42542:2;42532:79;:::o

Swarm Source

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