ETH Price: $2,420.53 (+3.53%)

Token

the_coin by Takens Theorem (TCTT0)
 

Overview

Max Total Supply

0 TCTT0

Holders

43

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
clarkpeters-vault.eth
Balance
1 TCTT0
0xD7D184Fec20A50aa7e522aa2f92971B5B1bb2A88
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

the_coin by Takens Theorem an idea, a history and a transformative economic contribution to human civilization – will propagate long into the future. Like a digital time capsule.” Visualizing the history of Bitcoin. Data-based NFTs carved carefully on Ethereum.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TCTT0

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 *
 *                                                               
 *    |        |                                          o         
 *    |---     |---.    ,---.           ,---.    ,---.    .    ,---.
 *    |        |   |    |---'           |        |   |    |    |   |
 *    `---'    `   '    `---'           `---'    `---'    `    `   '
 *                               ---                                 
 *     by Takens Theorem
 *
 *   Coded mostly by someone named 'OpenZeppelin' + some twists by Takens.
 *   Inspired by amazing things like Avastars, SquigglyWTF, Autoglyphs, etc.
 * 
 *   the_coin contains fully on-chain SVG data viz NFTs: data for display. 
 * 
 *   NFT mini-series about Bitcoin history via data viz. 
 *       4 originals, max 21 editions each (max issuance = 84)
 *   
 *   Features:
 *   - Owner address is stamped on SVG when token is transferred.
 *   - Owner can interact with contract via `changeStyleMode()`; restyle editions
 *   
 * 
 */

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

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

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


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

/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. 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;
        }
    }
}

/**
 * @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}. 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` 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 { }
}

/**
 * @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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


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


/**
 * @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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = "";
        buffer[1] = "";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
    
    // adapted from tkeber solution: https://ethereum.stackexchange.com/a/8447
    function toAsciiString(address x) internal pure returns (string memory) {
        bytes memory s = new bytes(40);
        for (uint i = 0; i < 20; i++) {
            bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i)))));
            bytes1 hi = bytes1(uint8(b) / 16);
            bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
            s[2*i] = char(hi);
            s[2*i+1] = char(lo);            
        }
        return string(s);
    }
    
    function char(bytes1 b) internal pure returns (bytes1 c) {
        if (uint8(b) < 10) return bytes1(uint8(b) + 0x30);
        else return bytes1(uint8(b) + 0x57);
    }    
    
    // adapted from t-nicci solution https://ethereum.stackexchange.com/a/31470
    function substring(string memory str, uint startIndex, uint endIndex) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex-startIndex);
        for(uint i = startIndex; i < endIndex; i++) {
            result[i-startIndex] = strBytes[i];
        }
        return string(result);
    }    
    
    function compareStrings(string memory a, string memory b) internal pure returns (bool) {
        return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b))));
    }
    
}

/**
 * @title TCTT0 contract
 * @dev Extends ERC721 Non-Fungible Token Standard basic implementation
 */
contract TCTT0 is ERC721, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    Counters.Counter private _tokenBases;

    mapping (uint256 => string) private _tokenURIs;
    mapping (uint256 => string) private _sources;
    mapping (uint256 => uint) private _editionMap;
    mapping (uint256 => string) private _nftName;
    mapping (uint256 => string) private _nftDescription;
    mapping (uint256 => string) private _nftAttributes;
    mapping (uint256 => string) private _nftStyleMode;
    
    string svg_start = "<?xml version='1.0' encoding='UTF-8'?><svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'  height='1000' width='1000' viewBox='-1150 -1150 2300 2300'><rect x='-1200' y='-1200' width='2400' height='2400' fill='#eee' />";

    function _getStyleMode(uint256 tokenId) private view returns (string memory) {
        if (Strings.compareStrings(_nftStyleMode[tokenId],'1')) { // light
            return('<style>line{stroke:#000;stroke-width:3pt;}path{fill:none;}circle{stroke-width:3pt;stroke:#000;}text{fill:#000;}rect{fill:#fff;}#fgfl{fill:#000;}#nbrdr{stroke:none;}#quote{fill:#555;}#sig{fill:#555;}</style>');
        } else if (Strings.compareStrings(_nftStyleMode[tokenId],'2')) { // dark
            return('<style>line{stroke:#fff;stroke-width:3pt;}path{fill:none;}circle{stroke-width:3pt;stroke:#fff;}text{fill:#fff;}rect{fill:#000;}#fgfl{fill:#fff;}#nbrdr{stroke:none;}#quote{fill:#aaa;}#sig{fill:#aaa;}</style>');
        } else { 
            return(string(abi.encodePacked('<style>',_nftStyleMode[tokenId],'</style>')));
        } 
    }
    
    function changeStyleMode(uint256 tokenId, string memory styleMode) public returns (string memory) {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not owner nor approved");
        if (bytes(styleMode).length>256) {
            revert('Style supplied cannot be more than 256 characters');
        }
        for (uint i = 0; i < bytes(styleMode).length; i++) {
            string memory theChar = string(abi.encodePacked(bytes(styleMode)[i]));
            if (Strings.compareStrings(theChar,'<') || Strings.compareStrings(theChar,'=') || Strings.compareStrings(theChar,'[')) {
                revert('No extra tags, scripts or data permitted');
            }
        }
        _nftStyleMode[tokenId] = styleMode;
        return('Style mode successfully changed');
    }
    
    function reveal(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
        bytes memory _img = abi.encodePacked(svg_start,_getStyleMode(tokenId),_sources[_editionMap[tokenId]],
                ' 0x',Strings.toAsciiString(ownerOf(tokenId)),'</textPath></text></svg>'
            );
        return(string(abi.encodePacked(_img)));
        
    }
    
    function _setSource(uint256 _tokenBase, string memory _source) private onlyOwner {
        _sources[_tokenBase] = _source;
    }

    function mintNFT_n(uint _tokenBase, uint n, string memory _name, string memory _description, string memory _attributes) public onlyOwner {
        for (uint i=0; i<n; i++) {
            if (_tokenIds.current()<84) {
                _tokenIds.increment();
                uint256 newItemId = _tokenIds.current();
                _mint(msg.sender, newItemId);
                _editionMap[newItemId] = _tokenBase;
                _nftName[newItemId] = _name;
                _nftDescription[newItemId] = _description;
                _nftAttributes[newItemId] = _attributes;
                _nftStyleMode[newItemId] = '1';
            }
        }
    }

    function mintSource(string memory _source) public onlyOwner {
        _tokenBases.increment();
        uint256 newTokenBase = _tokenBases.current();
        _setSource(newTokenBase,_source);
    }
    
    function makeAttributes(string memory _attributes) private pure returns (string memory) {
        return(string(
            abi.encodePacked('{"trait_type":"Editions","value":"',Strings.substring(_attributes,0,2),'"},',
                '{"trait_type":"Topic","value":"',Strings.substring(_attributes,3,18),'"},',
                '{"trait_type":"Main Data","value":"',Strings.substring(_attributes,19,40),'"},',
                '{"trait_type":"Owner Rights","value":"GPLv3"}')
        ));
    }
    
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        bytes memory json = abi.encodePacked('{"name":"',_nftName[tokenId],
                                            '", "description":"',_nftDescription[tokenId],
                                            '\\n", "attributes":[',makeAttributes(_nftAttributes[tokenId]),
                                            '], "created_by":"Takens Theorem", "image":"',
            reveal(tokenId),'"}');
        return string(abi.encodePacked('data:text/plain,',json));
    }
    
    constructor() ERC721("the_coin by Takens Theorem", "TCTT0") {}    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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"},{"internalType":"string","name":"styleMode","type":"string"}],"name":"changeStyleMode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"uint256","name":"_tokenBase","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_description","type":"string"},{"internalType":"string","name":"_attributes","type":"string"}],"name":"mintNFT_n","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_source","type":"string"}],"name":"mintSource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"reveal","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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"}]

608060405260405180610120016040528060f8815260200162004ad460f891396010908051906020019062000036929190620001a4565b503480156200004457600080fd5b506040518060400160405280601a81526020017f7468655f636f696e2062792054616b656e73205468656f72656d0000000000008152506040518060400160405280600581526020017f54435454300000000000000000000000000000000000000000000000000000008152508160009080519060200190620000c9929190620001a4565b508060019080519060200190620000e2929190620001a4565b5050506000620000f76200019c60201b60201c565b905080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002b9565b600033905090565b828054620001b29062000254565b90600052602060002090601f016020900481019282620001d6576000855562000222565b82601f10620001f157805160ff191683800117855562000222565b8280016001018555821562000222579182015b828111156200022157825182559160200191906001019062000204565b5b50905062000231919062000235565b5090565b5b808211156200025057600081600090555060010162000236565b5090565b600060028204905060018216806200026d57607f821691505b602082108114156200028457620002836200028a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61480b80620002c96000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80638c9be992116100ad578063b88d4fde11610071578063b88d4fde1461032d578063c2ca0ac514610349578063c87b56dd14610379578063e985e9c5146103a9578063f2fde38b146103d95761012c565b80638c9be992146102895780638da5cb5b146102a557806395d89b41146102c3578063a22cb465146102e1578063a57d3018146102fd5761012c565b806342842e0e116100f457806342842e0e146101e75780636352211e1461020357806370a0823114610233578063715018a6146102635780638b4fb5d31461026d5761012c565b806301ffc9a71461013157806306fdde0314610161578063081812fc1461017f578063095ea7b3146101af57806323b872dd146101cb575b600080fd5b61014b600480360381019061014691906129c9565b6103f5565b604051610158919061341b565b60405180910390f35b6101696104d7565b6040516101769190613436565b60405180910390f35b61019960048036038101906101949190612a5c565b610569565b6040516101a691906133b4565b60405180910390f35b6101c960048036038101906101c4919061298d565b6105ee565b005b6101e560048036038101906101e09190612887565b610706565b005b61020160048036038101906101fc9190612887565b610766565b005b61021d60048036038101906102189190612a5c565b610786565b60405161022a91906133b4565b60405180910390f35b61024d60048036038101906102489190612822565b610838565b60405161025a91906136b8565b60405180910390f35b61026b6108f0565b005b61028760048036038101906102829190612a1b565b610a2d565b005b6102a3600480360381019061029e9190612ad9565b610acf565b005b6102ad610c94565b6040516102ba91906133b4565b60405180910390f35b6102cb610cbe565b6040516102d89190613436565b60405180910390f35b6102fb60048036038101906102f69190612951565b610d50565b005b61031760048036038101906103129190612a85565b610ed1565b6040516103249190613436565b60405180910390f35b610347600480360381019061034291906128d6565b611162565b005b610363600480360381019061035e9190612a5c565b6111c4565b6040516103709190613436565b60405180910390f35b610393600480360381019061038e9190612a5c565b61129e565b6040516103a09190613436565b60405180910390f35b6103c360048036038101906103be919061284b565b6113c1565b6040516103d0919061341b565b60405180910390f35b6103f360048036038101906103ee9190612822565b611455565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104c057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104d057506104cf82611601565b5b9050919050565b6060600080546104e690613c09565b80601f016020809104026020016040519081016040528092919081815260200182805461051290613c09565b801561055f5780601f106105345761010080835404028352916020019161055f565b820191906000526020600020905b81548152906001019060200180831161054257829003601f168201915b5050505050905090565b60006105748261166b565b6105b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105aa906135d8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105f982610786565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561066a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066190613658565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106896116d7565b73ffffffffffffffffffffffffffffffffffffffff1614806106b857506106b7816106b26116d7565b6113c1565b5b6106f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ee90613518565b60405180910390fd5b61070183836116df565b505050565b6107176107116116d7565b82611798565b610756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074d90613678565b60405180910390fd5b610761838383611876565b505050565b61078183838360405180602001604052806000815250611162565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561082f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082690613558565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a090613538565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108f86116d7565b73ffffffffffffffffffffffffffffffffffffffff16610916610c94565b73ffffffffffffffffffffffffffffffffffffffff161461096c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610963906135f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610a356116d7565b73ffffffffffffffffffffffffffffffffffffffff16610a53610c94565b73ffffffffffffffffffffffffffffffffffffffff1614610aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa0906135f8565b60405180910390fd5b610ab36008611ad2565b6000610abf6008611ae8565b9050610acb8183611af6565b5050565b610ad76116d7565b73ffffffffffffffffffffffffffffffffffffffff16610af5610c94565b73ffffffffffffffffffffffffffffffffffffffff1614610b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b42906135f8565b60405180910390fd5b60005b84811015610c8c576054610b626007611ae8565b1015610c7957610b726007611ad2565b6000610b7e6007611ae8565b9050610b8a3382611b9e565b86600b60008381526020019081526020016000208190555084600c60008381526020019081526020016000209080519060200190610bc9929190612646565b5083600d60008381526020019081526020016000209080519060200190610bf1929190612646565b5082600e60008381526020019081526020016000209080519060200190610c19929190612646565b506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250600f60008381526020019081526020016000209080519060200190610c76929190612646565b50505b8080610c8490613c6c565b915050610b4e565b505050505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ccd90613c09565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf990613c09565b8015610d465780601f10610d1b57610100808354040283529160200191610d46565b820191906000526020600020905b815481529060010190602001808311610d2957829003601f168201915b5050505050905090565b610d586116d7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd906134d8565b60405180910390fd5b8060056000610dd36116d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610e806116d7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610ec5919061341b565b60405180910390a35050565b6060610ee4610ede6116d7565b84611798565b610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a906135b8565b60405180910390fd5b61010082511115610f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6090613698565b60405180910390fd5b60005b82518110156110fb576000838281518110610fb0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b604051602001610fcb91906131d5565b604051602081830303815290604052905061101b816040518060400160405280600181526020017f3c00000000000000000000000000000000000000000000000000000000000000815250611d6c565b806110615750611060816040518060400160405280600181526020017f3d00000000000000000000000000000000000000000000000000000000000000815250611d6c565b5b806110a757506110a6816040518060400160405280600181526020017f5b00000000000000000000000000000000000000000000000000000000000000815250611d6c565b5b156110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110de90613638565b60405180910390fd5b5080806110f390613c6c565b915050610f6c565b5081600f60008581526020019081526020016000209080519060200190611123929190612646565b506040518060400160405280601f81526020017f5374796c65206d6f6465207375636365737366756c6c79206368616e67656400815250905092915050565b61117361116d6116d7565b83611798565b6111b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a990613678565b60405180910390fd5b6111be84848484611dc5565b50505050565b60606111cf8261166b565b61120e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120590613598565b60405180910390fd5b6000601061121b84611e21565b600a6000600b600088815260200190815260200160002054815260200190815260200160002061125261124d87610786565b61205d565b604051602001611265949392919061321e565b60405160208183030381529060405290508060405160200161128791906131f0565b604051602081830303815290604052915050919050565b60606000600c6000848152602001908152602001600020600d600085815260200190815260200160002061136c600e600087815260200190815260200160002080546112e990613c09565b80601f016020809104026020016040519081016040528092919081815260200182805461131590613c09565b80156113625780601f1061133757610100808354040283529160200191611362565b820191906000526020600020905b81548152906001019060200180831161134557829003601f168201915b5050505050612292565b611375866111c4565b60405160200161138894939291906132f0565b6040516020818303038152906040529050806040516020016113aa9190613365565b604051602081830303815290604052915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61145d6116d7565b73ffffffffffffffffffffffffffffffffffffffff1661147b610c94565b73ffffffffffffffffffffffffffffffffffffffff16146114d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c8906135f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153890613478565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661175283610786565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117a38261166b565b6117e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d9906134f8565b60405180910390fd5b60006117ed83610786565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061185c57508373ffffffffffffffffffffffffffffffffffffffff1661184484610569565b73ffffffffffffffffffffffffffffffffffffffff16145b8061186d575061186c81856113c1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661189682610786565b73ffffffffffffffffffffffffffffffffffffffff16146118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e390613618565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561195c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611953906134b8565b60405180910390fd5b6119678383836122e3565b6119726000826116df565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119c29190613ab2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a1991906137bd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b611afe6116d7565b73ffffffffffffffffffffffffffffffffffffffff16611b1c610c94565b73ffffffffffffffffffffffffffffffffffffffff1614611b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b69906135f8565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190611b99929190612646565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0590613578565b60405180910390fd5b611c178161166b565b15611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e90613498565b60405180910390fd5b611c63600083836122e3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cb391906137bd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600081604051602001611d7f9190613207565b6040516020818303038152906040528051906020012083604051602001611da69190613207565b6040516020818303038152906040528051906020012014905092915050565b611dd0848484611876565b611ddc848484846122e8565b611e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1290613458565b60405180910390fd5b50505050565b6060611efd600f60008481526020019081526020016000208054611e4490613c09565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7090613c09565b8015611ebd5780601f10611e9257610100808354040283529160200191611ebd565b820191906000526020600020905b815481529060010190602001808311611ea057829003601f168201915b50505050506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611d6c565b15611f235760405180610100016040528060ce815260200161463a60ce91399050612058565b611ffd600f60008481526020019081526020016000208054611f4490613c09565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7090613c09565b8015611fbd5780601f10611f9257610100808354040283529160200191611fbd565b820191906000526020600020905b815481529060010190602001808311611fa057829003601f168201915b50505050506040518060400160405280600181526020017f3200000000000000000000000000000000000000000000000000000000000000815250611d6c565b156120235760405180610100016040528060ce815260200161470860ce91399050612058565b600f60008381526020019081526020016000206040516020016120469190613387565b60405160208183030381529060405290505b919050565b60606000602867ffffffffffffffff8111156120a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120d45781602001600182028036833780820191505090505b50905060005b60148110156122885760008160136120f29190613ab2565b60086120fe9190613a1d565b600261210a91906138ff565b8573ffffffffffffffffffffffffffffffffffffffff1661212b919061384a565b60f81b9050600060108260f81c612142919061387b565b60f81b905060008160f81c60106121599190613a77565b8360f81c6121679190613ae6565b60f81b90506121758261247f565b858560026121839190613a1d565b815181106121ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506121f28161247f565b8560018660026122029190613a1d565b61220c91906137bd565b81518110612243577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350505050808061228090613c6c565b9150506120da565b5080915050919050565b60606122a182600060026124c5565b6122ae83600360126124c5565b6122bb84601360286124c5565b6040516020016122cd93929190613272565b6040516020818303038152906040529050919050565b505050565b60006123098473ffffffffffffffffffffffffffffffffffffffff16612633565b15612472578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123326116d7565b8786866040518563ffffffff1660e01b815260040161235494939291906133cf565b602060405180830381600087803b15801561236e57600080fd5b505af192505050801561239f57506040513d601f19601f8201168201806040525081019061239c91906129f2565b60015b612422573d80600081146123cf576040519150601f19603f3d011682016040523d82523d6000602084013e6123d4565b606091505b5060008151141561241a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241190613458565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612477565b600190505b949350505050565b6000600a8260f81c60ff1610156124aa5760308260f81c6124a09190613813565b60f81b90506124c0565b60578260f81c6124ba9190613813565b60f81b90505b919050565b60606000849050600084846124da9190613ab2565b67ffffffffffffffff811115612519577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561254b5781602001600182028036833780820191505090505b50905060008590505b8481101561262657828181518110612595577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b8287836125ad9190613ab2565b815181106125e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061261e90613c6c565b915050612554565b5080925050509392505050565b600080823b905060008111915050919050565b82805461265290613c09565b90600052602060002090601f01602090048101928261267457600085556126bb565b82601f1061268d57805160ff19168380011785556126bb565b828001600101855582156126bb579182015b828111156126ba57825182559160200191906001019061269f565b5b5090506126c891906126cc565b5090565b5b808211156126e55760008160009055506001016126cd565b5090565b60006126fc6126f7846136f8565b6136d3565b90508281526020810184848401111561271457600080fd5b61271f848285613bc7565b509392505050565b600061273a61273584613729565b6136d3565b90508281526020810184848401111561275257600080fd5b61275d848285613bc7565b509392505050565b600081359050612774816145dd565b92915050565b600081359050612789816145f4565b92915050565b60008135905061279e8161460b565b92915050565b6000815190506127b38161460b565b92915050565b600082601f8301126127ca57600080fd5b81356127da8482602086016126e9565b91505092915050565b600082601f8301126127f457600080fd5b8135612804848260208601612727565b91505092915050565b60008135905061281c81614622565b92915050565b60006020828403121561283457600080fd5b600061284284828501612765565b91505092915050565b6000806040838503121561285e57600080fd5b600061286c85828601612765565b925050602061287d85828601612765565b9150509250929050565b60008060006060848603121561289c57600080fd5b60006128aa86828701612765565b93505060206128bb86828701612765565b92505060406128cc8682870161280d565b9150509250925092565b600080600080608085870312156128ec57600080fd5b60006128fa87828801612765565b945050602061290b87828801612765565b935050604061291c8782880161280d565b925050606085013567ffffffffffffffff81111561293957600080fd5b612945878288016127b9565b91505092959194509250565b6000806040838503121561296457600080fd5b600061297285828601612765565b92505060206129838582860161277a565b9150509250929050565b600080604083850312156129a057600080fd5b60006129ae85828601612765565b92505060206129bf8582860161280d565b9150509250929050565b6000602082840312156129db57600080fd5b60006129e98482850161278f565b91505092915050565b600060208284031215612a0457600080fd5b6000612a12848285016127a4565b91505092915050565b600060208284031215612a2d57600080fd5b600082013567ffffffffffffffff811115612a4757600080fd5b612a53848285016127e3565b91505092915050565b600060208284031215612a6e57600080fd5b6000612a7c8482850161280d565b91505092915050565b60008060408385031215612a9857600080fd5b6000612aa68582860161280d565b925050602083013567ffffffffffffffff811115612ac357600080fd5b612acf858286016127e3565b9150509250929050565b600080600080600060a08688031215612af157600080fd5b6000612aff8882890161280d565b9550506020612b108882890161280d565b945050604086013567ffffffffffffffff811115612b2d57600080fd5b612b39888289016127e3565b935050606086013567ffffffffffffffff811115612b5657600080fd5b612b62888289016127e3565b925050608086013567ffffffffffffffff811115612b7f57600080fd5b612b8b888289016127e3565b9150509295509295909350565b612ba181613b1a565b82525050565b612bb081613b2c565b82525050565b612bc7612bc282613b38565b613cb5565b82525050565b6000612bd88261376f565b612be28185613785565b9350612bf2818560208601613bd6565b612bfb81613d7b565b840191505092915050565b6000612c118261376f565b612c1b8185613796565b9350612c2b818560208601613bd6565b80840191505092915050565b6000612c428261377a565b612c4c81856137a1565b9350612c5c818560208601613bd6565b612c6581613d7b565b840191505092915050565b6000612c7b8261377a565b612c8581856137b2565b9350612c95818560208601613bd6565b80840191505092915050565b60008154612cae81613c09565b612cb881866137b2565b94506001821660008114612cd35760018114612ce457612d17565b60ff19831686528186019350612d17565b612ced8561375a565b60005b83811015612d0f57815481890152600182019150602081019050612cf0565b838801955050505b50505092915050565b6000612d2d6022836137b2565b9150612d3882613d99565b602282019050919050565b6000612d506009836137b2565b9150612d5b82613de8565b600982019050919050565b6000612d736032836137a1565b9150612d7e82613e11565b604082019050919050565b6000612d966026836137a1565b9150612da182613e60565b604082019050919050565b6000612db9601c836137a1565b9150612dc482613eaf565b602082019050919050565b6000612ddc6008836137b2565b9150612de782613ed8565b600882019050919050565b6000612dff602b836137b2565b9150612e0a82613f01565b602b82019050919050565b6000612e226003836137b2565b9150612e2d82613f50565b600382019050919050565b6000612e456024836137a1565b9150612e5082613f79565b604082019050919050565b6000612e686019836137a1565b9150612e7382613fc8565b602082019050919050565b6000612e8b602c836137a1565b9150612e9682613ff1565b604082019050919050565b6000612eae6038836137a1565b9150612eb982614040565b604082019050919050565b6000612ed1602a836137a1565b9150612edc8261408f565b604082019050919050565b6000612ef46029836137a1565b9150612eff826140de565b604082019050919050565b6000612f176010836137b2565b9150612f228261412d565b601082019050919050565b6000612f3a6002836137b2565b9150612f4582614156565b600282019050919050565b6000612f5d6020836137a1565b9150612f688261417f565b602082019050919050565b6000612f806023836137b2565b9150612f8b826141a8565b602382019050919050565b6000612fa36031836137a1565b9150612fae826141f7565b604082019050919050565b6000612fc66028836137a1565b9150612fd182614246565b604082019050919050565b6000612fe9602c836137a1565b9150612ff482614295565b604082019050919050565b600061300c6012836137b2565b9150613017826142e4565b601282019050919050565b600061302f6020836137a1565b915061303a8261430d565b602082019050919050565b60006130526029836137a1565b915061305d82614336565b604082019050919050565b60006130756028836137a1565b915061308082614385565b604082019050919050565b60006130986021836137a1565b91506130a3826143d4565b604082019050919050565b60006130bb6031836137a1565b91506130c682614423565b604082019050919050565b60006130de601f836137b2565b91506130e982614472565b601f82019050919050565b6000613101602d836137b2565b915061310c8261449b565b602d82019050919050565b60006131246003836137b2565b915061312f826144ea565b600382019050919050565b60006131476031836137a1565b915061315282614513565b604082019050919050565b600061316a6018836137b2565b915061317582614562565b601882019050919050565b600061318d6013836137b2565b91506131988261458b565b601382019050919050565b60006131b06007836137b2565b91506131bb826145b4565b600782019050919050565b6131cf81613bb0565b82525050565b60006131e18284612bb6565b60018201915081905092915050565b60006131fc8284612c06565b915081905092915050565b60006132138284612c70565b915081905092915050565b600061322a8287612ca1565b91506132368286612c70565b91506132428285612ca1565b915061324d82613117565b91506132598284612c70565b91506132648261315d565b915081905095945050505050565b600061327d82612d20565b91506132898286612c70565b915061329482612e15565b915061329f826130d1565b91506132ab8285612c70565b91506132b682612e15565b91506132c182612f73565b91506132cd8284612c70565b91506132d882612e15565b91506132e3826130f4565b9150819050949350505050565b60006132fb82612d43565b91506133078287612ca1565b915061331282612fff565b915061331e8286612ca1565b915061332982613180565b91506133358285612c70565b915061334082612df2565b915061334c8284612c70565b915061335782612f2d565b915081905095945050505050565b600061337082612f0a565b915061337c8284612c06565b915081905092915050565b6000613392826131a3565b915061339e8284612ca1565b91506133a982612dcf565b915081905092915050565b60006020820190506133c96000830184612b98565b92915050565b60006080820190506133e46000830187612b98565b6133f16020830186612b98565b6133fe60408301856131c6565b81810360608301526134108184612bcd565b905095945050505050565b60006020820190506134306000830184612ba7565b92915050565b600060208201905081810360008301526134508184612c37565b905092915050565b6000602082019050818103600083015261347181612d66565b9050919050565b6000602082019050818103600083015261349181612d89565b9050919050565b600060208201905081810360008301526134b181612dac565b9050919050565b600060208201905081810360008301526134d181612e38565b9050919050565b600060208201905081810360008301526134f181612e5b565b9050919050565b6000602082019050818103600083015261351181612e7e565b9050919050565b6000602082019050818103600083015261353181612ea1565b9050919050565b6000602082019050818103600083015261355181612ec4565b9050919050565b6000602082019050818103600083015261357181612ee7565b9050919050565b6000602082019050818103600083015261359181612f50565b9050919050565b600060208201905081810360008301526135b181612f96565b9050919050565b600060208201905081810360008301526135d181612fb9565b9050919050565b600060208201905081810360008301526135f181612fdc565b9050919050565b6000602082019050818103600083015261361181613022565b9050919050565b6000602082019050818103600083015261363181613045565b9050919050565b6000602082019050818103600083015261365181613068565b9050919050565b600060208201905081810360008301526136718161308b565b9050919050565b60006020820190508181036000830152613691816130ae565b9050919050565b600060208201905081810360008301526136b18161313a565b9050919050565b60006020820190506136cd60008301846131c6565b92915050565b60006136dd6136ee565b90506136e98282613c3b565b919050565b6000604051905090565b600067ffffffffffffffff82111561371357613712613d4c565b5b61371c82613d7b565b9050602081019050919050565b600067ffffffffffffffff82111561374457613743613d4c565b5b61374d82613d7b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006137c882613bb0565b91506137d383613bb0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561380857613807613cbf565b5b828201905092915050565b600061381e82613bba565b915061382983613bba565b92508260ff0382111561383f5761383e613cbf565b5b828201905092915050565b600061385582613bb0565b915061386083613bb0565b9250826138705761386f613cee565b5b828204905092915050565b600061388682613bba565b915061389183613bba565b9250826138a1576138a0613cee565b5b828204905092915050565b6000808291508390505b60018511156138f6578086048111156138d2576138d1613cbf565b5b60018516156138e15780820291505b80810290506138ef85613d8c565b94506138b6565b94509492505050565b600061390a82613bb0565b915061391583613bb0565b92506139427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461394a565b905092915050565b60008261395a5760019050613a16565b816139685760009050613a16565b816001811461397e5760028114613988576139b7565b6001915050613a16565b60ff84111561399a57613999613cbf565b5b8360020a9150848211156139b1576139b0613cbf565b5b50613a16565b5060208310610133831016604e8410600b84101617156139ec5782820a9050838111156139e7576139e6613cbf565b5b613a16565b6139f984848460016138ac565b92509050818404811115613a1057613a0f613cbf565b5b81810290505b9392505050565b6000613a2882613bb0565b9150613a3383613bb0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a6c57613a6b613cbf565b5b828202905092915050565b6000613a8282613bba565b9150613a8d83613bba565b92508160ff0483118215151615613aa757613aa6613cbf565b5b828202905092915050565b6000613abd82613bb0565b9150613ac883613bb0565b925082821015613adb57613ada613cbf565b5b828203905092915050565b6000613af182613bba565b9150613afc83613bba565b925082821015613b0f57613b0e613cbf565b5b828203905092915050565b6000613b2582613b90565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613bf4578082015181840152602081019050613bd9565b83811115613c03576000848401525b50505050565b60006002820490506001821680613c2157607f821691505b60208210811415613c3557613c34613d1d565b5b50919050565b613c4482613d7b565b810181811067ffffffffffffffff82111715613c6357613c62613d4c565b5b80604052505050565b6000613c7782613bb0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613caa57613ca9613cbf565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f7b2274726169745f74797065223a2245646974696f6e73222c2276616c75652260008201527f3a22000000000000000000000000000000000000000000000000000000000000602082015250565b7f7b226e616d65223a220000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f3c2f7374796c653e000000000000000000000000000000000000000000000000600082015250565b7f5d2c2022637265617465645f6279223a2254616b656e73205468656f72656d2260008201527f2c2022696d616765223a22000000000000000000000000000000000000000000602082015250565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f646174613a746578742f706c61696e2c00000000000000000000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f7b2274726169745f74797065223a224d61696e2044617461222c2276616c756560008201527f223a220000000000000000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f74206f776e6572206e6f722060008201527f617070726f766564000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a220000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4e6f20657874726120746167732c2073637269707473206f722064617461207060008201527f65726d6974746564000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a22546f706963222c2276616c7565223a2200600082015250565b7f7b2274726169745f74797065223a224f776e657220526967687473222c22766160008201527f6c7565223a2247504c7633227d00000000000000000000000000000000000000602082015250565b7f2030780000000000000000000000000000000000000000000000000000000000600082015250565b7f5374796c6520737570706c6965642063616e6e6f74206265206d6f726520746860008201527f616e203235362063686172616374657273000000000000000000000000000000602082015250565b7f3c2f74657874506174683e3c2f746578743e3c2f7376673e0000000000000000600082015250565b7f5c6e222c202261747472696275746573223a5b00000000000000000000000000600082015250565b7f3c7374796c653e00000000000000000000000000000000000000000000000000600082015250565b6145e681613b1a565b81146145f157600080fd5b50565b6145fd81613b2c565b811461460857600080fd5b50565b61461481613b64565b811461461f57600080fd5b50565b61462b81613bb0565b811461463657600080fd5b5056fe3c7374796c653e6c696e657b7374726f6b653a233030303b7374726f6b652d77696474683a3370743b7d706174687b66696c6c3a6e6f6e653b7d636972636c657b7374726f6b652d77696474683a3370743b7374726f6b653a233030303b7d746578747b66696c6c3a233030303b7d726563747b66696c6c3a236666663b7d236667666c7b66696c6c3a233030303b7d236e627264727b7374726f6b653a6e6f6e653b7d2371756f74657b66696c6c3a233535353b7d237369677b66696c6c3a233535353b7d3c2f7374796c653e3c7374796c653e6c696e657b7374726f6b653a236666663b7374726f6b652d77696474683a3370743b7d706174687b66696c6c3a6e6f6e653b7d636972636c657b7374726f6b652d77696474683a3370743b7374726f6b653a236666663b7d746578747b66696c6c3a236666663b7d726563747b66696c6c3a233030303b7d236667666c7b66696c6c3a236666663b7d236e627264727b7374726f6b653a6e6f6e653b7d2371756f74657b66696c6c3a236161613b7d237369677b66696c6c3a236161613b7d3c2f7374796c653ea26469706673582212202f29b4026dc33b30547e8c761969c2d324497c2b7a1589a16ff9f42943649ba664736f6c634300080400333c3f786d6c2076657273696f6e3d27312e302720656e636f64696e673d275554462d38273f3e3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f7376672720786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b2720206865696768743d2731303030272077696474683d2731303030272076696577426f783d272d31313530202d3131353020323330302032333030273e3c7265637420783d272d313230302720793d272d31323030272077696474683d273234303027206865696768743d2732343030272066696c6c3d272365656527202f3e

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061012c5760003560e01c80638c9be992116100ad578063b88d4fde11610071578063b88d4fde1461032d578063c2ca0ac514610349578063c87b56dd14610379578063e985e9c5146103a9578063f2fde38b146103d95761012c565b80638c9be992146102895780638da5cb5b146102a557806395d89b41146102c3578063a22cb465146102e1578063a57d3018146102fd5761012c565b806342842e0e116100f457806342842e0e146101e75780636352211e1461020357806370a0823114610233578063715018a6146102635780638b4fb5d31461026d5761012c565b806301ffc9a71461013157806306fdde0314610161578063081812fc1461017f578063095ea7b3146101af57806323b872dd146101cb575b600080fd5b61014b600480360381019061014691906129c9565b6103f5565b604051610158919061341b565b60405180910390f35b6101696104d7565b6040516101769190613436565b60405180910390f35b61019960048036038101906101949190612a5c565b610569565b6040516101a691906133b4565b60405180910390f35b6101c960048036038101906101c4919061298d565b6105ee565b005b6101e560048036038101906101e09190612887565b610706565b005b61020160048036038101906101fc9190612887565b610766565b005b61021d60048036038101906102189190612a5c565b610786565b60405161022a91906133b4565b60405180910390f35b61024d60048036038101906102489190612822565b610838565b60405161025a91906136b8565b60405180910390f35b61026b6108f0565b005b61028760048036038101906102829190612a1b565b610a2d565b005b6102a3600480360381019061029e9190612ad9565b610acf565b005b6102ad610c94565b6040516102ba91906133b4565b60405180910390f35b6102cb610cbe565b6040516102d89190613436565b60405180910390f35b6102fb60048036038101906102f69190612951565b610d50565b005b61031760048036038101906103129190612a85565b610ed1565b6040516103249190613436565b60405180910390f35b610347600480360381019061034291906128d6565b611162565b005b610363600480360381019061035e9190612a5c565b6111c4565b6040516103709190613436565b60405180910390f35b610393600480360381019061038e9190612a5c565b61129e565b6040516103a09190613436565b60405180910390f35b6103c360048036038101906103be919061284b565b6113c1565b6040516103d0919061341b565b60405180910390f35b6103f360048036038101906103ee9190612822565b611455565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104c057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104d057506104cf82611601565b5b9050919050565b6060600080546104e690613c09565b80601f016020809104026020016040519081016040528092919081815260200182805461051290613c09565b801561055f5780601f106105345761010080835404028352916020019161055f565b820191906000526020600020905b81548152906001019060200180831161054257829003601f168201915b5050505050905090565b60006105748261166b565b6105b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105aa906135d8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105f982610786565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561066a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066190613658565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106896116d7565b73ffffffffffffffffffffffffffffffffffffffff1614806106b857506106b7816106b26116d7565b6113c1565b5b6106f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ee90613518565b60405180910390fd5b61070183836116df565b505050565b6107176107116116d7565b82611798565b610756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074d90613678565b60405180910390fd5b610761838383611876565b505050565b61078183838360405180602001604052806000815250611162565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561082f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082690613558565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a090613538565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108f86116d7565b73ffffffffffffffffffffffffffffffffffffffff16610916610c94565b73ffffffffffffffffffffffffffffffffffffffff161461096c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610963906135f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610a356116d7565b73ffffffffffffffffffffffffffffffffffffffff16610a53610c94565b73ffffffffffffffffffffffffffffffffffffffff1614610aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa0906135f8565b60405180910390fd5b610ab36008611ad2565b6000610abf6008611ae8565b9050610acb8183611af6565b5050565b610ad76116d7565b73ffffffffffffffffffffffffffffffffffffffff16610af5610c94565b73ffffffffffffffffffffffffffffffffffffffff1614610b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b42906135f8565b60405180910390fd5b60005b84811015610c8c576054610b626007611ae8565b1015610c7957610b726007611ad2565b6000610b7e6007611ae8565b9050610b8a3382611b9e565b86600b60008381526020019081526020016000208190555084600c60008381526020019081526020016000209080519060200190610bc9929190612646565b5083600d60008381526020019081526020016000209080519060200190610bf1929190612646565b5082600e60008381526020019081526020016000209080519060200190610c19929190612646565b506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250600f60008381526020019081526020016000209080519060200190610c76929190612646565b50505b8080610c8490613c6c565b915050610b4e565b505050505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ccd90613c09565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf990613c09565b8015610d465780601f10610d1b57610100808354040283529160200191610d46565b820191906000526020600020905b815481529060010190602001808311610d2957829003601f168201915b5050505050905090565b610d586116d7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd906134d8565b60405180910390fd5b8060056000610dd36116d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610e806116d7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610ec5919061341b565b60405180910390a35050565b6060610ee4610ede6116d7565b84611798565b610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a906135b8565b60405180910390fd5b61010082511115610f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6090613698565b60405180910390fd5b60005b82518110156110fb576000838281518110610fb0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b604051602001610fcb91906131d5565b604051602081830303815290604052905061101b816040518060400160405280600181526020017f3c00000000000000000000000000000000000000000000000000000000000000815250611d6c565b806110615750611060816040518060400160405280600181526020017f3d00000000000000000000000000000000000000000000000000000000000000815250611d6c565b5b806110a757506110a6816040518060400160405280600181526020017f5b00000000000000000000000000000000000000000000000000000000000000815250611d6c565b5b156110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110de90613638565b60405180910390fd5b5080806110f390613c6c565b915050610f6c565b5081600f60008581526020019081526020016000209080519060200190611123929190612646565b506040518060400160405280601f81526020017f5374796c65206d6f6465207375636365737366756c6c79206368616e67656400815250905092915050565b61117361116d6116d7565b83611798565b6111b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a990613678565b60405180910390fd5b6111be84848484611dc5565b50505050565b60606111cf8261166b565b61120e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120590613598565b60405180910390fd5b6000601061121b84611e21565b600a6000600b600088815260200190815260200160002054815260200190815260200160002061125261124d87610786565b61205d565b604051602001611265949392919061321e565b60405160208183030381529060405290508060405160200161128791906131f0565b604051602081830303815290604052915050919050565b60606000600c6000848152602001908152602001600020600d600085815260200190815260200160002061136c600e600087815260200190815260200160002080546112e990613c09565b80601f016020809104026020016040519081016040528092919081815260200182805461131590613c09565b80156113625780601f1061133757610100808354040283529160200191611362565b820191906000526020600020905b81548152906001019060200180831161134557829003601f168201915b5050505050612292565b611375866111c4565b60405160200161138894939291906132f0565b6040516020818303038152906040529050806040516020016113aa9190613365565b604051602081830303815290604052915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61145d6116d7565b73ffffffffffffffffffffffffffffffffffffffff1661147b610c94565b73ffffffffffffffffffffffffffffffffffffffff16146114d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c8906135f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153890613478565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661175283610786565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117a38261166b565b6117e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d9906134f8565b60405180910390fd5b60006117ed83610786565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061185c57508373ffffffffffffffffffffffffffffffffffffffff1661184484610569565b73ffffffffffffffffffffffffffffffffffffffff16145b8061186d575061186c81856113c1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661189682610786565b73ffffffffffffffffffffffffffffffffffffffff16146118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e390613618565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561195c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611953906134b8565b60405180910390fd5b6119678383836122e3565b6119726000826116df565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119c29190613ab2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a1991906137bd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b611afe6116d7565b73ffffffffffffffffffffffffffffffffffffffff16611b1c610c94565b73ffffffffffffffffffffffffffffffffffffffff1614611b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b69906135f8565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190611b99929190612646565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0590613578565b60405180910390fd5b611c178161166b565b15611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e90613498565b60405180910390fd5b611c63600083836122e3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cb391906137bd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600081604051602001611d7f9190613207565b6040516020818303038152906040528051906020012083604051602001611da69190613207565b6040516020818303038152906040528051906020012014905092915050565b611dd0848484611876565b611ddc848484846122e8565b611e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1290613458565b60405180910390fd5b50505050565b6060611efd600f60008481526020019081526020016000208054611e4490613c09565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7090613c09565b8015611ebd5780601f10611e9257610100808354040283529160200191611ebd565b820191906000526020600020905b815481529060010190602001808311611ea057829003601f168201915b50505050506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611d6c565b15611f235760405180610100016040528060ce815260200161463a60ce91399050612058565b611ffd600f60008481526020019081526020016000208054611f4490613c09565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7090613c09565b8015611fbd5780601f10611f9257610100808354040283529160200191611fbd565b820191906000526020600020905b815481529060010190602001808311611fa057829003601f168201915b50505050506040518060400160405280600181526020017f3200000000000000000000000000000000000000000000000000000000000000815250611d6c565b156120235760405180610100016040528060ce815260200161470860ce91399050612058565b600f60008381526020019081526020016000206040516020016120469190613387565b60405160208183030381529060405290505b919050565b60606000602867ffffffffffffffff8111156120a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120d45781602001600182028036833780820191505090505b50905060005b60148110156122885760008160136120f29190613ab2565b60086120fe9190613a1d565b600261210a91906138ff565b8573ffffffffffffffffffffffffffffffffffffffff1661212b919061384a565b60f81b9050600060108260f81c612142919061387b565b60f81b905060008160f81c60106121599190613a77565b8360f81c6121679190613ae6565b60f81b90506121758261247f565b858560026121839190613a1d565b815181106121ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506121f28161247f565b8560018660026122029190613a1d565b61220c91906137bd565b81518110612243577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350505050808061228090613c6c565b9150506120da565b5080915050919050565b60606122a182600060026124c5565b6122ae83600360126124c5565b6122bb84601360286124c5565b6040516020016122cd93929190613272565b6040516020818303038152906040529050919050565b505050565b60006123098473ffffffffffffffffffffffffffffffffffffffff16612633565b15612472578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123326116d7565b8786866040518563ffffffff1660e01b815260040161235494939291906133cf565b602060405180830381600087803b15801561236e57600080fd5b505af192505050801561239f57506040513d601f19601f8201168201806040525081019061239c91906129f2565b60015b612422573d80600081146123cf576040519150601f19603f3d011682016040523d82523d6000602084013e6123d4565b606091505b5060008151141561241a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241190613458565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612477565b600190505b949350505050565b6000600a8260f81c60ff1610156124aa5760308260f81c6124a09190613813565b60f81b90506124c0565b60578260f81c6124ba9190613813565b60f81b90505b919050565b60606000849050600084846124da9190613ab2565b67ffffffffffffffff811115612519577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561254b5781602001600182028036833780820191505090505b50905060008590505b8481101561262657828181518110612595577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b8287836125ad9190613ab2565b815181106125e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061261e90613c6c565b915050612554565b5080925050509392505050565b600080823b905060008111915050919050565b82805461265290613c09565b90600052602060002090601f01602090048101928261267457600085556126bb565b82601f1061268d57805160ff19168380011785556126bb565b828001600101855582156126bb579182015b828111156126ba57825182559160200191906001019061269f565b5b5090506126c891906126cc565b5090565b5b808211156126e55760008160009055506001016126cd565b5090565b60006126fc6126f7846136f8565b6136d3565b90508281526020810184848401111561271457600080fd5b61271f848285613bc7565b509392505050565b600061273a61273584613729565b6136d3565b90508281526020810184848401111561275257600080fd5b61275d848285613bc7565b509392505050565b600081359050612774816145dd565b92915050565b600081359050612789816145f4565b92915050565b60008135905061279e8161460b565b92915050565b6000815190506127b38161460b565b92915050565b600082601f8301126127ca57600080fd5b81356127da8482602086016126e9565b91505092915050565b600082601f8301126127f457600080fd5b8135612804848260208601612727565b91505092915050565b60008135905061281c81614622565b92915050565b60006020828403121561283457600080fd5b600061284284828501612765565b91505092915050565b6000806040838503121561285e57600080fd5b600061286c85828601612765565b925050602061287d85828601612765565b9150509250929050565b60008060006060848603121561289c57600080fd5b60006128aa86828701612765565b93505060206128bb86828701612765565b92505060406128cc8682870161280d565b9150509250925092565b600080600080608085870312156128ec57600080fd5b60006128fa87828801612765565b945050602061290b87828801612765565b935050604061291c8782880161280d565b925050606085013567ffffffffffffffff81111561293957600080fd5b612945878288016127b9565b91505092959194509250565b6000806040838503121561296457600080fd5b600061297285828601612765565b92505060206129838582860161277a565b9150509250929050565b600080604083850312156129a057600080fd5b60006129ae85828601612765565b92505060206129bf8582860161280d565b9150509250929050565b6000602082840312156129db57600080fd5b60006129e98482850161278f565b91505092915050565b600060208284031215612a0457600080fd5b6000612a12848285016127a4565b91505092915050565b600060208284031215612a2d57600080fd5b600082013567ffffffffffffffff811115612a4757600080fd5b612a53848285016127e3565b91505092915050565b600060208284031215612a6e57600080fd5b6000612a7c8482850161280d565b91505092915050565b60008060408385031215612a9857600080fd5b6000612aa68582860161280d565b925050602083013567ffffffffffffffff811115612ac357600080fd5b612acf858286016127e3565b9150509250929050565b600080600080600060a08688031215612af157600080fd5b6000612aff8882890161280d565b9550506020612b108882890161280d565b945050604086013567ffffffffffffffff811115612b2d57600080fd5b612b39888289016127e3565b935050606086013567ffffffffffffffff811115612b5657600080fd5b612b62888289016127e3565b925050608086013567ffffffffffffffff811115612b7f57600080fd5b612b8b888289016127e3565b9150509295509295909350565b612ba181613b1a565b82525050565b612bb081613b2c565b82525050565b612bc7612bc282613b38565b613cb5565b82525050565b6000612bd88261376f565b612be28185613785565b9350612bf2818560208601613bd6565b612bfb81613d7b565b840191505092915050565b6000612c118261376f565b612c1b8185613796565b9350612c2b818560208601613bd6565b80840191505092915050565b6000612c428261377a565b612c4c81856137a1565b9350612c5c818560208601613bd6565b612c6581613d7b565b840191505092915050565b6000612c7b8261377a565b612c8581856137b2565b9350612c95818560208601613bd6565b80840191505092915050565b60008154612cae81613c09565b612cb881866137b2565b94506001821660008114612cd35760018114612ce457612d17565b60ff19831686528186019350612d17565b612ced8561375a565b60005b83811015612d0f57815481890152600182019150602081019050612cf0565b838801955050505b50505092915050565b6000612d2d6022836137b2565b9150612d3882613d99565b602282019050919050565b6000612d506009836137b2565b9150612d5b82613de8565b600982019050919050565b6000612d736032836137a1565b9150612d7e82613e11565b604082019050919050565b6000612d966026836137a1565b9150612da182613e60565b604082019050919050565b6000612db9601c836137a1565b9150612dc482613eaf565b602082019050919050565b6000612ddc6008836137b2565b9150612de782613ed8565b600882019050919050565b6000612dff602b836137b2565b9150612e0a82613f01565b602b82019050919050565b6000612e226003836137b2565b9150612e2d82613f50565b600382019050919050565b6000612e456024836137a1565b9150612e5082613f79565b604082019050919050565b6000612e686019836137a1565b9150612e7382613fc8565b602082019050919050565b6000612e8b602c836137a1565b9150612e9682613ff1565b604082019050919050565b6000612eae6038836137a1565b9150612eb982614040565b604082019050919050565b6000612ed1602a836137a1565b9150612edc8261408f565b604082019050919050565b6000612ef46029836137a1565b9150612eff826140de565b604082019050919050565b6000612f176010836137b2565b9150612f228261412d565b601082019050919050565b6000612f3a6002836137b2565b9150612f4582614156565b600282019050919050565b6000612f5d6020836137a1565b9150612f688261417f565b602082019050919050565b6000612f806023836137b2565b9150612f8b826141a8565b602382019050919050565b6000612fa36031836137a1565b9150612fae826141f7565b604082019050919050565b6000612fc66028836137a1565b9150612fd182614246565b604082019050919050565b6000612fe9602c836137a1565b9150612ff482614295565b604082019050919050565b600061300c6012836137b2565b9150613017826142e4565b601282019050919050565b600061302f6020836137a1565b915061303a8261430d565b602082019050919050565b60006130526029836137a1565b915061305d82614336565b604082019050919050565b60006130756028836137a1565b915061308082614385565b604082019050919050565b60006130986021836137a1565b91506130a3826143d4565b604082019050919050565b60006130bb6031836137a1565b91506130c682614423565b604082019050919050565b60006130de601f836137b2565b91506130e982614472565b601f82019050919050565b6000613101602d836137b2565b915061310c8261449b565b602d82019050919050565b60006131246003836137b2565b915061312f826144ea565b600382019050919050565b60006131476031836137a1565b915061315282614513565b604082019050919050565b600061316a6018836137b2565b915061317582614562565b601882019050919050565b600061318d6013836137b2565b91506131988261458b565b601382019050919050565b60006131b06007836137b2565b91506131bb826145b4565b600782019050919050565b6131cf81613bb0565b82525050565b60006131e18284612bb6565b60018201915081905092915050565b60006131fc8284612c06565b915081905092915050565b60006132138284612c70565b915081905092915050565b600061322a8287612ca1565b91506132368286612c70565b91506132428285612ca1565b915061324d82613117565b91506132598284612c70565b91506132648261315d565b915081905095945050505050565b600061327d82612d20565b91506132898286612c70565b915061329482612e15565b915061329f826130d1565b91506132ab8285612c70565b91506132b682612e15565b91506132c182612f73565b91506132cd8284612c70565b91506132d882612e15565b91506132e3826130f4565b9150819050949350505050565b60006132fb82612d43565b91506133078287612ca1565b915061331282612fff565b915061331e8286612ca1565b915061332982613180565b91506133358285612c70565b915061334082612df2565b915061334c8284612c70565b915061335782612f2d565b915081905095945050505050565b600061337082612f0a565b915061337c8284612c06565b915081905092915050565b6000613392826131a3565b915061339e8284612ca1565b91506133a982612dcf565b915081905092915050565b60006020820190506133c96000830184612b98565b92915050565b60006080820190506133e46000830187612b98565b6133f16020830186612b98565b6133fe60408301856131c6565b81810360608301526134108184612bcd565b905095945050505050565b60006020820190506134306000830184612ba7565b92915050565b600060208201905081810360008301526134508184612c37565b905092915050565b6000602082019050818103600083015261347181612d66565b9050919050565b6000602082019050818103600083015261349181612d89565b9050919050565b600060208201905081810360008301526134b181612dac565b9050919050565b600060208201905081810360008301526134d181612e38565b9050919050565b600060208201905081810360008301526134f181612e5b565b9050919050565b6000602082019050818103600083015261351181612e7e565b9050919050565b6000602082019050818103600083015261353181612ea1565b9050919050565b6000602082019050818103600083015261355181612ec4565b9050919050565b6000602082019050818103600083015261357181612ee7565b9050919050565b6000602082019050818103600083015261359181612f50565b9050919050565b600060208201905081810360008301526135b181612f96565b9050919050565b600060208201905081810360008301526135d181612fb9565b9050919050565b600060208201905081810360008301526135f181612fdc565b9050919050565b6000602082019050818103600083015261361181613022565b9050919050565b6000602082019050818103600083015261363181613045565b9050919050565b6000602082019050818103600083015261365181613068565b9050919050565b600060208201905081810360008301526136718161308b565b9050919050565b60006020820190508181036000830152613691816130ae565b9050919050565b600060208201905081810360008301526136b18161313a565b9050919050565b60006020820190506136cd60008301846131c6565b92915050565b60006136dd6136ee565b90506136e98282613c3b565b919050565b6000604051905090565b600067ffffffffffffffff82111561371357613712613d4c565b5b61371c82613d7b565b9050602081019050919050565b600067ffffffffffffffff82111561374457613743613d4c565b5b61374d82613d7b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006137c882613bb0565b91506137d383613bb0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561380857613807613cbf565b5b828201905092915050565b600061381e82613bba565b915061382983613bba565b92508260ff0382111561383f5761383e613cbf565b5b828201905092915050565b600061385582613bb0565b915061386083613bb0565b9250826138705761386f613cee565b5b828204905092915050565b600061388682613bba565b915061389183613bba565b9250826138a1576138a0613cee565b5b828204905092915050565b6000808291508390505b60018511156138f6578086048111156138d2576138d1613cbf565b5b60018516156138e15780820291505b80810290506138ef85613d8c565b94506138b6565b94509492505050565b600061390a82613bb0565b915061391583613bb0565b92506139427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461394a565b905092915050565b60008261395a5760019050613a16565b816139685760009050613a16565b816001811461397e5760028114613988576139b7565b6001915050613a16565b60ff84111561399a57613999613cbf565b5b8360020a9150848211156139b1576139b0613cbf565b5b50613a16565b5060208310610133831016604e8410600b84101617156139ec5782820a9050838111156139e7576139e6613cbf565b5b613a16565b6139f984848460016138ac565b92509050818404811115613a1057613a0f613cbf565b5b81810290505b9392505050565b6000613a2882613bb0565b9150613a3383613bb0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a6c57613a6b613cbf565b5b828202905092915050565b6000613a8282613bba565b9150613a8d83613bba565b92508160ff0483118215151615613aa757613aa6613cbf565b5b828202905092915050565b6000613abd82613bb0565b9150613ac883613bb0565b925082821015613adb57613ada613cbf565b5b828203905092915050565b6000613af182613bba565b9150613afc83613bba565b925082821015613b0f57613b0e613cbf565b5b828203905092915050565b6000613b2582613b90565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613bf4578082015181840152602081019050613bd9565b83811115613c03576000848401525b50505050565b60006002820490506001821680613c2157607f821691505b60208210811415613c3557613c34613d1d565b5b50919050565b613c4482613d7b565b810181811067ffffffffffffffff82111715613c6357613c62613d4c565b5b80604052505050565b6000613c7782613bb0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613caa57613ca9613cbf565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f7b2274726169745f74797065223a2245646974696f6e73222c2276616c75652260008201527f3a22000000000000000000000000000000000000000000000000000000000000602082015250565b7f7b226e616d65223a220000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f3c2f7374796c653e000000000000000000000000000000000000000000000000600082015250565b7f5d2c2022637265617465645f6279223a2254616b656e73205468656f72656d2260008201527f2c2022696d616765223a22000000000000000000000000000000000000000000602082015250565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f646174613a746578742f706c61696e2c00000000000000000000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f7b2274726169745f74797065223a224d61696e2044617461222c2276616c756560008201527f223a220000000000000000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f74206f776e6572206e6f722060008201527f617070726f766564000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a220000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4e6f20657874726120746167732c2073637269707473206f722064617461207060008201527f65726d6974746564000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a22546f706963222c2276616c7565223a2200600082015250565b7f7b2274726169745f74797065223a224f776e657220526967687473222c22766160008201527f6c7565223a2247504c7633227d00000000000000000000000000000000000000602082015250565b7f2030780000000000000000000000000000000000000000000000000000000000600082015250565b7f5374796c6520737570706c6965642063616e6e6f74206265206d6f726520746860008201527f616e203235362063686172616374657273000000000000000000000000000000602082015250565b7f3c2f74657874506174683e3c2f746578743e3c2f7376673e0000000000000000600082015250565b7f5c6e222c202261747472696275746573223a5b00000000000000000000000000600082015250565b7f3c7374796c653e00000000000000000000000000000000000000000000000000600082015250565b6145e681613b1a565b81146145f157600080fd5b50565b6145fd81613b2c565b811461460857600080fd5b50565b61461481613b64565b811461461f57600080fd5b50565b61462b81613bb0565b811461463657600080fd5b5056fe3c7374796c653e6c696e657b7374726f6b653a233030303b7374726f6b652d77696474683a3370743b7d706174687b66696c6c3a6e6f6e653b7d636972636c657b7374726f6b652d77696474683a3370743b7374726f6b653a233030303b7d746578747b66696c6c3a233030303b7d726563747b66696c6c3a236666663b7d236667666c7b66696c6c3a233030303b7d236e627264727b7374726f6b653a6e6f6e653b7d2371756f74657b66696c6c3a233535353b7d237369677b66696c6c3a233535353b7d3c2f7374796c653e3c7374796c653e6c696e657b7374726f6b653a236666663b7374726f6b652d77696474683a3370743b7d706174687b66696c6c3a6e6f6e653b7d636972636c657b7374726f6b652d77696474683a3370743b7374726f6b653a236666663b7d746578747b66696c6c3a236666663b7d726563747b66696c6c3a233030303b7d236667666c7b66696c6c3a236666663b7d236e627264727b7374726f6b653a6e6f6e653b7d2371756f74657b66696c6c3a236161613b7d237369677b66696c6c3a236161613b7d3c2f7374796c653ea26469706673582212202f29b4026dc33b30547e8c761969c2d324497c2b7a1589a16ff9f42943649ba664736f6c63430008040033

Deployed Bytecode Sourcemap

37550:5124:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11267:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12199:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13659:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13196:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14549:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14925:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11893:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11623:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24738:148;;;:::i;:::-;;41307:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40637:662;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24087:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12368:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13952:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39221:812;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15147:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40045:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42032:561;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14318:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25041:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11267:292;11369:4;11408:25;11393:40;;;:11;:40;;;;:105;;;;11465:33;11450:48;;;:11;:48;;;;11393:105;:158;;;;11515:36;11539:11;11515:23;:36::i;:::-;11393:158;11386:165;;11267:292;;;:::o;12199:100::-;12253:13;12286:5;12279:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12199:100;:::o;13659:221::-;13735:7;13763:16;13771:7;13763;:16::i;:::-;13755:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13848:15;:24;13864:7;13848:24;;;;;;;;;;;;;;;;;;;;;13841:31;;13659:221;;;:::o;13196:397::-;13277:13;13293:23;13308:7;13293:14;:23::i;:::-;13277:39;;13341:5;13335:11;;:2;:11;;;;13327:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;13421:5;13405:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;13430:37;13447:5;13454:12;:10;:12::i;:::-;13430:16;:37::i;:::-;13405:62;13397:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;13564:21;13573:2;13577:7;13564:8;:21::i;:::-;13196:397;;;:::o;14549:305::-;14710:41;14729:12;:10;:12::i;:::-;14743:7;14710:18;:41::i;:::-;14702:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;14818:28;14828:4;14834:2;14838:7;14818:9;:28::i;:::-;14549:305;;;:::o;14925:151::-;15029:39;15046:4;15052:2;15056:7;15029:39;;;;;;;;;;;;:16;:39::i;:::-;14925:151;;;:::o;11893:239::-;11965:7;11985:13;12001:7;:16;12009:7;12001:16;;;;;;;;;;;;;;;;;;;;;11985:32;;12053:1;12036:19;;:5;:19;;;;12028:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12119:5;12112:12;;;11893:239;;;:::o;11623:208::-;11695:7;11740:1;11723:19;;:5;:19;;;;11715:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;11807:9;:16;11817:5;11807:16;;;;;;;;;;;;;;;;11800:23;;11623:208;;;:::o;24738:148::-;24318:12;:10;:12::i;:::-;24307:23;;:7;:5;:7::i;:::-;:23;;;24299:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24845:1:::1;24808:40;;24829:6;;;;;;;;;;;24808:40;;;;;;;;;;;;24876:1;24859:6;;:19;;;;;;;;;;;;;;;;;;24738:148::o:0;41307:200::-;24318:12;:10;:12::i;:::-;24307:23;;:7;:5;:7::i;:::-;:23;;;24299:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41378:23:::1;:11;:21;:23::i;:::-;41412:20;41435:21;:11;:19;:21::i;:::-;41412:44;;41467:32;41478:12;41491:7;41467:10;:32::i;:::-;24378:1;41307:200:::0;:::o;40637:662::-;24318:12;:10;:12::i;:::-;24307:23;;:7;:5;:7::i;:::-;:23;;;24299:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40790:6:::1;40785:507;40802:1;40800;:3;40785:507;;;40849:2;40829:19;:9;:17;:19::i;:::-;:22;40825:456;;;40872:21;:9;:19;:21::i;:::-;40912:17;40932:19;:9;:17;:19::i;:::-;40912:39;;40970:28;40976:10;40988:9;40970:5;:28::i;:::-;41042:10;41017:11;:22;41029:9;41017:22;;;;;;;;;;;:35;;;;41093:5;41071:8;:19;41080:9;41071:19;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;41146:12;41117:15;:26;41133:9;41117:26;;;;;;;;;;;:41;;;;;;;;;;;;:::i;:::-;;41205:11;41177:14;:25;41192:9;41177:25;;;;;;;;;;;:39;;;;;;;;;;;;:::i;:::-;;41235:30;;;;;;;;;;;;;;;;::::0;:13:::1;:24;41249:9;41235:24;;;;;;;;;;;:30;;;;;;;;;;;;:::i;:::-;;40825:456;;40805:3;;;;;:::i;:::-;;;;40785:507;;;;40637:662:::0;;;;;:::o;24087:87::-;24133:7;24160:6;;;;;;;;;;;24153:13;;24087:87;:::o;12368:104::-;12424:13;12457:7;12450:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12368:104;:::o;13952:295::-;14067:12;:10;:12::i;:::-;14055:24;;:8;:24;;;;14047:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;14167:8;14122:18;:32;14141:12;:10;:12::i;:::-;14122:32;;;;;;;;;;;;;;;:42;14155:8;14122:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;14220:8;14191:48;;14206:12;:10;:12::i;:::-;14191:48;;;14230:8;14191:48;;;;;;:::i;:::-;;;;;;;;13952:295;;:::o;39221:812::-;39304:13;39338:41;39357:12;:10;:12::i;:::-;39371:7;39338:18;:41::i;:::-;39330:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;39463:3;39445:9;39439:23;:27;39435:119;;;39483:59;;;;;;;;;;:::i;:::-;;;;;;;;39435:119;39569:6;39564:365;39591:9;39585:23;39581:1;:27;39564:365;;;39630:21;39684:9;39695:1;39678:19;;;;;;;;;;;;;;;;;;;;;;;;39661:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;39630:69;;39718:35;39741:7;39718:35;;;;;;;;;;;;;;;;;:22;:35::i;:::-;:74;;;;39757:35;39780:7;39757:35;;;;;;;;;;;;;;;;;:22;:35::i;:::-;39718:74;:113;;;;39796:35;39819:7;39796:35;;;;;;;;;;;;;;;;;:22;:35::i;:::-;39718:113;39714:204;;;39852:50;;;;;;;;;;:::i;:::-;;;;;;;;39714:204;39564:365;39610:3;;;;;:::i;:::-;;;;39564:365;;;;39964:9;39939:13;:22;39953:7;39939:22;;;;;;;;;;;:34;;;;;;;;;;;;:::i;:::-;;39984:41;;;;;;;;;;;;;;;;;;;39221:812;;;;:::o;15147:285::-;15279:41;15298:12;:10;:12::i;:::-;15312:7;15279:18;:41::i;:::-;15271:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;15385:39;15399:4;15405:2;15409:7;15418:5;15385:13;:39::i;:::-;15147:285;;;;:::o;40045:442::-;40099:13;40133:16;40141:7;40133;:16::i;:::-;40125:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;40214:17;40251:9;40261:22;40275:7;40261:13;:22::i;:::-;40284:8;:30;40293:11;:20;40305:7;40293:20;;;;;;;;;;;;40284:30;;;;;;;;;;;40339:39;40361:16;40369:7;40361;:16::i;:::-;40339:21;:39::i;:::-;40234:186;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40214:206;;40462:4;40445:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;40431:38;;;40045:442;;;:::o;42032:561::-;42097:13;42123:17;42172:8;:17;42181:7;42172:17;;;;;;;;;;;42257:15;:24;42273:7;42257:24;;;;;;;;;;;42351:39;42366:14;:23;42381:7;42366:23;;;;;;;;;;;42351:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;:39::i;:::-;42497:15;42504:7;42497:6;:15::i;:::-;42143:375;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42123:395;;42579:4;42543:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;42529:56;;;42032:561;;;:::o;14318:164::-;14415:4;14439:18;:25;14458:5;14439:25;;;;;;;;;;;;;;;:35;14465:8;14439:35;;;;;;;;;;;;;;;;;;;;;;;;;14432:42;;14318:164;;;;:::o;25041:244::-;24318:12;:10;:12::i;:::-;24307:23;;:7;:5;:7::i;:::-;:23;;;24299:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25150:1:::1;25130:22;;:8;:22;;;;25122:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25240:8;25211:38;;25232:6;;;;;;;;;;;25211:38;;;;;;;;;;;;25269:8;25260:6;;:17;;;;;;;;;;;;;;;;;;25041:244:::0;:::o;7753:157::-;7838:4;7877:25;7862:40;;;:11;:40;;;;7855:47;;7753:157;;;:::o;16899:127::-;16964:4;17016:1;16988:30;;:7;:16;16996:7;16988:16;;;;;;;;;;;;;;;;;;;;;:30;;;;16981:37;;16899:127;;;:::o;8456:98::-;8509:7;8536:10;8529:17;;8456:98;:::o;20784:174::-;20886:2;20859:15;:24;20875:7;20859:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20942:7;20938:2;20904:46;;20913:23;20928:7;20913:14;:23::i;:::-;20904:46;;;;;;;;;;;;20784:174;;:::o;17193:348::-;17286:4;17311:16;17319:7;17311;:16::i;:::-;17303:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17387:13;17403:23;17418:7;17403:14;:23::i;:::-;17387:39;;17456:5;17445:16;;:7;:16;;;:51;;;;17489:7;17465:31;;:20;17477:7;17465:11;:20::i;:::-;:31;;;17445:51;:87;;;;17500:32;17517:5;17524:7;17500:16;:32::i;:::-;17445:87;17437:96;;;17193:348;;;;:::o;20122:544::-;20247:4;20220:31;;:23;20235:7;20220:14;:23::i;:::-;:31;;;20212:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;20330:1;20316:16;;:2;:16;;;;20308:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;20386:39;20407:4;20413:2;20417:7;20386:20;:39::i;:::-;20490:29;20507:1;20511:7;20490:8;:29::i;:::-;20551:1;20532:9;:15;20542:4;20532:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;20580:1;20563:9;:13;20573:2;20563:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;20611:2;20592:7;:16;20600:7;20592:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;20650:7;20646:2;20631:27;;20640:4;20631:27;;;;;;;;;;;;20122:544;;;:::o;9657:127::-;9764:1;9746:7;:14;;;:19;;;;;;;;;;;9657:127;:::o;9535:114::-;9600:7;9627;:14;;;9620:21;;9535:114;;;:::o;40499:130::-;24318:12;:10;:12::i;:::-;24307:23;;:7;:5;:7::i;:::-;:23;;;24299:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40614:7:::1;40591:8;:20;40600:10;40591:20;;;;;;;;;;;:30;;;;;;;;;;;;:::i;:::-;;40499:130:::0;;:::o;18814:382::-;18908:1;18894:16;;:2;:16;;;;18886:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;18967:16;18975:7;18967;:16::i;:::-;18966:17;18958:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;19029:45;19058:1;19062:2;19066:7;19029:20;:45::i;:::-;19104:1;19087:9;:13;19097:2;19087:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;19135:2;19116:7;:16;19124:7;19116:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;19180:7;19176:2;19155:33;;19172:1;19155:33;;;;;;;;;;;;18814:382;;:::o;37245:183::-;37326:4;37415:1;37397:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;37387:32;;;;;;37379:1;37361:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;37351:32;;;;;;:68;37343:77;;37245:183;;;;:::o;16314:272::-;16428:28;16438:4;16444:2;16448:7;16428:9;:28::i;:::-;16475:48;16498:4;16504:2;16508:7;16517:5;16475:22;:48::i;:::-;16467:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;16314:272;;;;:::o;38381:828::-;38443:13;38473:50;38496:13;:22;38510:7;38496:22;;;;;;;;;;;38473:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22;:50::i;:::-;38469:732;;;38549:216;;;;;;;;;;;;;;;;;;;;;38469:732;38787:50;38810:13;:22;38824:7;38810:22;;;;;;;;;;;38787:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22;:50::i;:::-;38783:418;;;38862:216;;;;;;;;;;;;;;;;;;;;;38783:418;39153:13;:22;39167:7;39153:22;;;;;;;;;;;39126:61;;;;;;;;:::i;:::-;;;;;;;;;;;;;39112:77;;38381:828;;;;:::o;36115:463::-;36172:13;36198:14;36225:2;36215:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36198:30;;36244:6;36239:305;36260:2;36256:1;:6;36239:305;;;36284:8;36340:1;36335:2;:6;;;;:::i;:::-;36332:1;:10;;;;:::i;:::-;36328:1;:15;;;;:::i;:::-;36321:1;36308:16;;:36;;;;:::i;:::-;36295:51;;36284:62;;36361:9;36391:2;36386:1;36380:8;;:13;;;;:::i;:::-;36373:21;;36361:33;;36409:9;36450:2;36444:9;;36439:2;:14;;;;:::i;:::-;36434:1;36428:8;;:25;;;;:::i;:::-;36421:33;;36409:45;;36478:8;36483:2;36478:4;:8::i;:::-;36469:1;36473;36471;:3;;;;:::i;:::-;36469:6;;;;;;;;;;;;;;;;;;;:17;;;;;;;;;;;36512:8;36517:2;36512:4;:8::i;:::-;36501:1;36507;36505;36503;:3;;;;:::i;:::-;:5;;;;:::i;:::-;36501:8;;;;;;;;;;;;;;;;;;;:19;;;;;;;;;;;36239:305;;;36264:3;;;;;:::i;:::-;;;;36239:305;;;;36568:1;36554:16;;;36115:463;;;:::o;41519:501::-;41592:13;41700:34;41718:11;41730:1;41732;41700:17;:34::i;:::-;41793:35;41811:11;41823:1;41825:2;41793:17;:35::i;:::-;41891:36;41909:11;41921:2;41924;41891:17;:36::i;:::-;41646:354;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41618:394;;41519:501;;;:::o;22979:93::-;;;;:::o;21523:843::-;21644:4;21670:15;:2;:13;;;:15::i;:::-;21666:693;;;21722:2;21706:36;;;21743:12;:10;:12::i;:::-;21757:4;21763:7;21772:5;21706:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;21702:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21969:1;21952:6;:13;:18;21948:341;;;21995:60;;;;;;;;;;:::i;:::-;;;;;;;;21948:341;22239:6;22233:13;22224:6;22220:2;22216:15;22209:38;21702:602;21839:45;;;21829:55;;;:6;:55;;;;21822:62;;;;;21666:693;22343:4;22336:11;;21523:843;;;;;;;:::o;36590:171::-;36637:8;36673:2;36668:1;36662:8;;:13;;;36658:95;;;36702:4;36697:1;36691:8;;:15;;;;:::i;:::-;36684:23;;36677:30;;;;36658:95;36748:4;36743:1;36737:8;;:15;;;;:::i;:::-;36730:23;;36723:30;;36590:171;;;;:::o;36858:371::-;36951:13;36977:21;37007:3;36977:34;;37022:19;37063:10;37054:8;:19;;;;:::i;:::-;37044:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37022:52;;37089:6;37098:10;37089:19;;37085:105;37114:8;37110:1;:12;37085:105;;;37167:8;37176:1;37167:11;;;;;;;;;;;;;;;;;;;;;;;;37144:6;37153:10;37151:1;:12;;;;:::i;:::-;37144:20;;;;;;;;;;;;;;;;;;;:34;;;;;;;;;;;37124:3;;;;;:::i;:::-;;;;37085:105;;;;37214:6;37200:21;;;;36858:371;;;;;:::o;26796:422::-;26856:4;27064:12;27175:7;27163:20;27155:28;;27209:1;27202:4;:8;27195:15;;;26796:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;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;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:520::-;6164:6;6172;6221:2;6209:9;6200:7;6196:23;6192:32;6189:2;;;6237:1;6234;6227:12;6189:2;6280:1;6305:53;6350:7;6341:6;6330:9;6326:22;6305:53;:::i;:::-;6295:63;;6251:117;6435:2;6424:9;6420:18;6407:32;6466:18;6458:6;6455:30;6452:2;;;6498:1;6495;6488:12;6452:2;6526:63;6581:7;6572:6;6561:9;6557:22;6526:63;:::i;:::-;6516:73;;6378:221;6179:427;;;;;:::o;6612:1183::-;6737:6;6745;6753;6761;6769;6818:3;6806:9;6797:7;6793:23;6789:33;6786:2;;;6835:1;6832;6825:12;6786:2;6878:1;6903:53;6948:7;6939:6;6928:9;6924:22;6903:53;:::i;:::-;6893:63;;6849:117;7005:2;7031:53;7076:7;7067:6;7056:9;7052:22;7031:53;:::i;:::-;7021:63;;6976:118;7161:2;7150:9;7146:18;7133:32;7192:18;7184:6;7181:30;7178:2;;;7224:1;7221;7214:12;7178:2;7252:63;7307:7;7298:6;7287:9;7283:22;7252:63;:::i;:::-;7242:73;;7104:221;7392:2;7381:9;7377:18;7364:32;7423:18;7415:6;7412:30;7409:2;;;7455:1;7452;7445:12;7409:2;7483:63;7538:7;7529:6;7518:9;7514:22;7483:63;:::i;:::-;7473:73;;7335:221;7623:3;7612:9;7608:19;7595:33;7655:18;7647:6;7644:30;7641:2;;;7687:1;7684;7677:12;7641:2;7715:63;7770:7;7761:6;7750:9;7746:22;7715:63;:::i;:::-;7705:73;;7566:222;6776:1019;;;;;;;;:::o;7801:118::-;7888:24;7906:5;7888:24;:::i;:::-;7883:3;7876:37;7866:53;;:::o;7925:109::-;8006:21;8021:5;8006:21;:::i;:::-;8001:3;7994:34;7984:50;;:::o;8040:153::-;8143:43;8162:23;8179:5;8162:23;:::i;:::-;8143:43;:::i;:::-;8138:3;8131:56;8121:72;;:::o;8199:360::-;8285:3;8313:38;8345:5;8313:38;:::i;:::-;8367:70;8430:6;8425:3;8367:70;:::i;:::-;8360:77;;8446:52;8491:6;8486:3;8479:4;8472:5;8468:16;8446:52;:::i;:::-;8523:29;8545:6;8523:29;:::i;:::-;8518:3;8514:39;8507:46;;8289:270;;;;;:::o;8565:373::-;8669:3;8697:38;8729:5;8697:38;:::i;:::-;8751:88;8832:6;8827:3;8751:88;:::i;:::-;8744:95;;8848:52;8893:6;8888:3;8881:4;8874:5;8870:16;8848:52;:::i;:::-;8925:6;8920:3;8916:16;8909:23;;8673:265;;;;;:::o;8944:364::-;9032:3;9060:39;9093:5;9060:39;:::i;:::-;9115:71;9179:6;9174:3;9115:71;:::i;:::-;9108:78;;9195:52;9240:6;9235:3;9228:4;9221:5;9217:16;9195:52;:::i;:::-;9272:29;9294:6;9272:29;:::i;:::-;9267:3;9263:39;9256:46;;9036:272;;;;;:::o;9314:377::-;9420:3;9448:39;9481:5;9448:39;:::i;:::-;9503:89;9585:6;9580:3;9503:89;:::i;:::-;9496:96;;9601:52;9646:6;9641:3;9634:4;9627:5;9623:16;9601:52;:::i;:::-;9678:6;9673:3;9669:16;9662:23;;9424:267;;;;;:::o;9721:845::-;9824:3;9861:5;9855:12;9890:36;9916:9;9890:36;:::i;:::-;9942:89;10024:6;10019:3;9942:89;:::i;:::-;9935:96;;10062:1;10051:9;10047:17;10078:1;10073:137;;;;10224:1;10219:341;;;;10040:520;;10073:137;10157:4;10153:9;10142;10138:25;10133:3;10126:38;10193:6;10188:3;10184:16;10177:23;;10073:137;;10219:341;10286:38;10318:5;10286:38;:::i;:::-;10346:1;10360:154;10374:6;10371:1;10368:13;10360:154;;;10448:7;10442:14;10438:1;10433:3;10429:11;10422:35;10498:1;10489:7;10485:15;10474:26;;10396:4;10393:1;10389:12;10384:17;;10360:154;;;10543:6;10538:3;10534:16;10527:23;;10226:334;;10040:520;;9828:738;;;;;;:::o;10572:402::-;10732:3;10753:85;10835:2;10830:3;10753:85;:::i;:::-;10746:92;;10847:93;10936:3;10847:93;:::i;:::-;10965:2;10960:3;10956:12;10949:19;;10736:238;;;:::o;10980:400::-;11140:3;11161:84;11243:1;11238:3;11161:84;:::i;:::-;11154:91;;11254:93;11343:3;11254:93;:::i;:::-;11372:1;11367:3;11363:11;11356:18;;11144:236;;;:::o;11386:366::-;11528:3;11549:67;11613:2;11608:3;11549:67;:::i;:::-;11542:74;;11625:93;11714:3;11625:93;:::i;:::-;11743:2;11738:3;11734:12;11727:19;;11532:220;;;:::o;11758:366::-;11900:3;11921:67;11985:2;11980:3;11921:67;:::i;:::-;11914:74;;11997:93;12086:3;11997:93;:::i;:::-;12115:2;12110:3;12106:12;12099:19;;11904:220;;;:::o;12130:366::-;12272:3;12293:67;12357:2;12352:3;12293:67;:::i;:::-;12286:74;;12369:93;12458:3;12369:93;:::i;:::-;12487:2;12482:3;12478:12;12471:19;;12276:220;;;:::o;12502:400::-;12662:3;12683:84;12765:1;12760:3;12683:84;:::i;:::-;12676:91;;12776:93;12865:3;12776:93;:::i;:::-;12894:1;12889:3;12885:11;12878:18;;12666:236;;;:::o;12908:402::-;13068:3;13089:85;13171:2;13166:3;13089:85;:::i;:::-;13082:92;;13183:93;13272:3;13183:93;:::i;:::-;13301:2;13296:3;13292:12;13285:19;;13072:238;;;:::o;13316:400::-;13476:3;13497:84;13579:1;13574:3;13497:84;:::i;:::-;13490:91;;13590:93;13679:3;13590:93;:::i;:::-;13708:1;13703:3;13699:11;13692:18;;13480:236;;;:::o;13722:366::-;13864:3;13885:67;13949:2;13944:3;13885:67;:::i;:::-;13878:74;;13961:93;14050:3;13961:93;:::i;:::-;14079:2;14074:3;14070:12;14063:19;;13868:220;;;:::o;14094:366::-;14236:3;14257:67;14321:2;14316:3;14257:67;:::i;:::-;14250:74;;14333:93;14422:3;14333:93;:::i;:::-;14451:2;14446:3;14442:12;14435:19;;14240:220;;;:::o;14466:366::-;14608:3;14629:67;14693:2;14688:3;14629:67;:::i;:::-;14622:74;;14705:93;14794:3;14705:93;:::i;:::-;14823:2;14818:3;14814:12;14807:19;;14612:220;;;:::o;14838:366::-;14980:3;15001:67;15065:2;15060:3;15001:67;:::i;:::-;14994:74;;15077:93;15166:3;15077:93;:::i;:::-;15195:2;15190:3;15186:12;15179:19;;14984:220;;;:::o;15210:366::-;15352:3;15373:67;15437:2;15432:3;15373:67;:::i;:::-;15366:74;;15449:93;15538:3;15449:93;:::i;:::-;15567:2;15562:3;15558:12;15551:19;;15356:220;;;:::o;15582:366::-;15724:3;15745:67;15809:2;15804:3;15745:67;:::i;:::-;15738:74;;15821:93;15910:3;15821:93;:::i;:::-;15939:2;15934:3;15930:12;15923:19;;15728:220;;;:::o;15954:402::-;16114:3;16135:85;16217:2;16212:3;16135:85;:::i;:::-;16128:92;;16229:93;16318:3;16229:93;:::i;:::-;16347:2;16342:3;16338:12;16331:19;;16118:238;;;:::o;16362:400::-;16522:3;16543:84;16625:1;16620:3;16543:84;:::i;:::-;16536:91;;16636:93;16725:3;16636:93;:::i;:::-;16754:1;16749:3;16745:11;16738:18;;16526:236;;;:::o;16768:366::-;16910:3;16931:67;16995:2;16990:3;16931:67;:::i;:::-;16924:74;;17007:93;17096:3;17007:93;:::i;:::-;17125:2;17120:3;17116:12;17109:19;;16914:220;;;:::o;17140:402::-;17300:3;17321:85;17403:2;17398:3;17321:85;:::i;:::-;17314:92;;17415:93;17504:3;17415:93;:::i;:::-;17533:2;17528:3;17524:12;17517:19;;17304:238;;;:::o;17548:366::-;17690:3;17711:67;17775:2;17770:3;17711:67;:::i;:::-;17704:74;;17787:93;17876:3;17787:93;:::i;:::-;17905:2;17900:3;17896:12;17889:19;;17694:220;;;:::o;17920:366::-;18062:3;18083:67;18147:2;18142:3;18083:67;:::i;:::-;18076:74;;18159:93;18248:3;18159:93;:::i;:::-;18277:2;18272:3;18268:12;18261:19;;18066:220;;;:::o;18292:366::-;18434:3;18455:67;18519:2;18514:3;18455:67;:::i;:::-;18448:74;;18531:93;18620:3;18531:93;:::i;:::-;18649:2;18644:3;18640:12;18633:19;;18438:220;;;:::o;18664:402::-;18824:3;18845:85;18927:2;18922:3;18845:85;:::i;:::-;18838:92;;18939:93;19028:3;18939:93;:::i;:::-;19057:2;19052:3;19048:12;19041:19;;18828:238;;;:::o;19072:366::-;19214:3;19235:67;19299:2;19294:3;19235:67;:::i;:::-;19228:74;;19311:93;19400:3;19311:93;:::i;:::-;19429:2;19424:3;19420:12;19413:19;;19218:220;;;:::o;19444:366::-;19586:3;19607:67;19671:2;19666:3;19607:67;:::i;:::-;19600:74;;19683:93;19772:3;19683:93;:::i;:::-;19801:2;19796:3;19792:12;19785:19;;19590:220;;;:::o;19816:366::-;19958:3;19979:67;20043:2;20038:3;19979:67;:::i;:::-;19972:74;;20055:93;20144:3;20055:93;:::i;:::-;20173:2;20168:3;20164:12;20157:19;;19962:220;;;:::o;20188:366::-;20330:3;20351:67;20415:2;20410:3;20351:67;:::i;:::-;20344:74;;20427:93;20516:3;20427:93;:::i;:::-;20545:2;20540:3;20536:12;20529:19;;20334:220;;;:::o;20560:366::-;20702:3;20723:67;20787:2;20782:3;20723:67;:::i;:::-;20716:74;;20799:93;20888:3;20799:93;:::i;:::-;20917:2;20912:3;20908:12;20901:19;;20706:220;;;:::o;20932:402::-;21092:3;21113:85;21195:2;21190:3;21113:85;:::i;:::-;21106:92;;21207:93;21296:3;21207:93;:::i;:::-;21325:2;21320:3;21316:12;21309:19;;21096:238;;;:::o;21340:402::-;21500:3;21521:85;21603:2;21598:3;21521:85;:::i;:::-;21514:92;;21615:93;21704:3;21615:93;:::i;:::-;21733:2;21728:3;21724:12;21717:19;;21504:238;;;:::o;21748:400::-;21908:3;21929:84;22011:1;22006:3;21929:84;:::i;:::-;21922:91;;22022:93;22111:3;22022:93;:::i;:::-;22140:1;22135:3;22131:11;22124:18;;21912:236;;;:::o;22154:366::-;22296:3;22317:67;22381:2;22376:3;22317:67;:::i;:::-;22310:74;;22393:93;22482:3;22393:93;:::i;:::-;22511:2;22506:3;22502:12;22495:19;;22300:220;;;:::o;22526:402::-;22686:3;22707:85;22789:2;22784:3;22707:85;:::i;:::-;22700:92;;22801:93;22890:3;22801:93;:::i;:::-;22919:2;22914:3;22910:12;22903:19;;22690:238;;;:::o;22934:402::-;23094:3;23115:85;23197:2;23192:3;23115:85;:::i;:::-;23108:92;;23209:93;23298:3;23209:93;:::i;:::-;23327:2;23322:3;23318:12;23311:19;;23098:238;;;:::o;23342:400::-;23502:3;23523:84;23605:1;23600:3;23523:84;:::i;:::-;23516:91;;23616:93;23705:3;23616:93;:::i;:::-;23734:1;23729:3;23725:11;23718:18;;23506:236;;;:::o;23748:118::-;23835:24;23853:5;23835:24;:::i;:::-;23830:3;23823:37;23813:53;;:::o;23872:251::-;23982:3;23997:73;24066:3;24057:6;23997:73;:::i;:::-;24095:1;24090:3;24086:11;24079:18;;24114:3;24107:10;;23986:137;;;;:::o;24129:271::-;24259:3;24281:93;24370:3;24361:6;24281:93;:::i;:::-;24274:100;;24391:3;24384:10;;24263:137;;;;:::o;24406:275::-;24538:3;24560:95;24651:3;24642:6;24560:95;:::i;:::-;24553:102;;24672:3;24665:10;;24542:139;;;;:::o;24687:1275::-;25159:3;25181:92;25269:3;25260:6;25181:92;:::i;:::-;25174:99;;25290:95;25381:3;25372:6;25290:95;:::i;:::-;25283:102;;25402:92;25490:3;25481:6;25402:92;:::i;:::-;25395:99;;25511:148;25655:3;25511:148;:::i;:::-;25504:155;;25676:95;25767:3;25758:6;25676:95;:::i;:::-;25669:102;;25788:148;25932:3;25788:148;:::i;:::-;25781:155;;25953:3;25946:10;;25163:799;;;;;;;:::o;25968:2457::-;26903:3;26925:148;27069:3;26925:148;:::i;:::-;26918:155;;27090:95;27181:3;27172:6;27090:95;:::i;:::-;27083:102;;27202:148;27346:3;27202:148;:::i;:::-;27195:155;;27367:148;27511:3;27367:148;:::i;:::-;27360:155;;27532:95;27623:3;27614:6;27532:95;:::i;:::-;27525:102;;27644:148;27788:3;27644:148;:::i;:::-;27637:155;;27809:148;27953:3;27809:148;:::i;:::-;27802:155;;27974:95;28065:3;28056:6;27974:95;:::i;:::-;27967:102;;28086:148;28230:3;28086:148;:::i;:::-;28079:155;;28251:148;28395:3;28251:148;:::i;:::-;28244:155;;28416:3;28409:10;;26907:1518;;;;;;:::o;28431:2073::-;29206:3;29228:148;29372:3;29228:148;:::i;:::-;29221:155;;29393:92;29481:3;29472:6;29393:92;:::i;:::-;29386:99;;29502:148;29646:3;29502:148;:::i;:::-;29495:155;;29667:92;29755:3;29746:6;29667:92;:::i;:::-;29660:99;;29776:148;29920:3;29776:148;:::i;:::-;29769:155;;29941:95;30032:3;30023:6;29941:95;:::i;:::-;29934:102;;30053:148;30197:3;30053:148;:::i;:::-;30046:155;;30218:95;30309:3;30300:6;30218:95;:::i;:::-;30211:102;;30330:148;30474:3;30330:148;:::i;:::-;30323:155;;30495:3;30488:10;;29210:1294;;;;;;;:::o;30510:537::-;30741:3;30763:148;30907:3;30763:148;:::i;:::-;30756:155;;30928:93;31017:3;31008:6;30928:93;:::i;:::-;30921:100;;31038:3;31031:10;;30745:302;;;;:::o;31053:801::-;31384:3;31406:148;31550:3;31406:148;:::i;:::-;31399:155;;31571:92;31659:3;31650:6;31571:92;:::i;:::-;31564:99;;31680:148;31824:3;31680:148;:::i;:::-;31673:155;;31845:3;31838:10;;31388:466;;;;:::o;31860:222::-;31953:4;31991:2;31980:9;31976:18;31968:26;;32004:71;32072:1;32061:9;32057:17;32048:6;32004:71;:::i;:::-;31958:124;;;;:::o;32088:640::-;32283:4;32321:3;32310:9;32306:19;32298:27;;32335:71;32403:1;32392:9;32388:17;32379:6;32335:71;:::i;:::-;32416:72;32484:2;32473:9;32469:18;32460:6;32416:72;:::i;:::-;32498;32566:2;32555:9;32551:18;32542:6;32498:72;:::i;:::-;32617:9;32611:4;32607:20;32602:2;32591:9;32587:18;32580:48;32645:76;32716:4;32707:6;32645:76;:::i;:::-;32637:84;;32288:440;;;;;;;:::o;32734:210::-;32821:4;32859:2;32848:9;32844:18;32836:26;;32872:65;32934:1;32923:9;32919:17;32910:6;32872:65;:::i;:::-;32826:118;;;;:::o;32950:313::-;33063:4;33101:2;33090:9;33086:18;33078:26;;33150:9;33144:4;33140:20;33136:1;33125:9;33121:17;33114:47;33178:78;33251:4;33242:6;33178:78;:::i;:::-;33170:86;;33068:195;;;;:::o;33269:419::-;33435:4;33473:2;33462:9;33458:18;33450:26;;33522:9;33516:4;33512:20;33508:1;33497:9;33493:17;33486:47;33550:131;33676:4;33550:131;:::i;:::-;33542:139;;33440:248;;;:::o;33694:419::-;33860:4;33898:2;33887:9;33883:18;33875:26;;33947:9;33941:4;33937:20;33933:1;33922:9;33918:17;33911:47;33975:131;34101:4;33975:131;:::i;:::-;33967:139;;33865:248;;;:::o;34119:419::-;34285:4;34323:2;34312:9;34308:18;34300:26;;34372:9;34366:4;34362:20;34358:1;34347:9;34343:17;34336:47;34400:131;34526:4;34400:131;:::i;:::-;34392:139;;34290:248;;;:::o;34544:419::-;34710:4;34748:2;34737:9;34733:18;34725:26;;34797:9;34791:4;34787:20;34783:1;34772:9;34768:17;34761:47;34825:131;34951:4;34825:131;:::i;:::-;34817:139;;34715:248;;;:::o;34969:419::-;35135:4;35173:2;35162:9;35158:18;35150:26;;35222:9;35216:4;35212:20;35208:1;35197:9;35193:17;35186:47;35250:131;35376:4;35250:131;:::i;:::-;35242:139;;35140:248;;;:::o;35394:419::-;35560:4;35598:2;35587:9;35583:18;35575:26;;35647:9;35641:4;35637:20;35633:1;35622:9;35618:17;35611:47;35675:131;35801:4;35675:131;:::i;:::-;35667:139;;35565:248;;;:::o;35819:419::-;35985:4;36023:2;36012:9;36008:18;36000:26;;36072:9;36066:4;36062:20;36058:1;36047:9;36043:17;36036:47;36100:131;36226:4;36100:131;:::i;:::-;36092:139;;35990:248;;;:::o;36244:419::-;36410:4;36448:2;36437:9;36433:18;36425:26;;36497:9;36491:4;36487:20;36483:1;36472:9;36468:17;36461:47;36525:131;36651:4;36525:131;:::i;:::-;36517:139;;36415:248;;;:::o;36669:419::-;36835:4;36873:2;36862:9;36858:18;36850:26;;36922:9;36916:4;36912:20;36908:1;36897:9;36893:17;36886:47;36950:131;37076:4;36950:131;:::i;:::-;36942:139;;36840:248;;;:::o;37094:419::-;37260:4;37298:2;37287:9;37283:18;37275:26;;37347:9;37341:4;37337:20;37333:1;37322:9;37318:17;37311:47;37375:131;37501:4;37375:131;:::i;:::-;37367:139;;37265:248;;;:::o;37519:419::-;37685:4;37723:2;37712:9;37708:18;37700:26;;37772:9;37766:4;37762:20;37758:1;37747:9;37743:17;37736:47;37800:131;37926:4;37800:131;:::i;:::-;37792:139;;37690:248;;;:::o;37944:419::-;38110:4;38148:2;38137:9;38133:18;38125:26;;38197:9;38191:4;38187:20;38183:1;38172:9;38168:17;38161:47;38225:131;38351:4;38225:131;:::i;:::-;38217:139;;38115:248;;;:::o;38369:419::-;38535:4;38573:2;38562:9;38558:18;38550:26;;38622:9;38616:4;38612:20;38608:1;38597:9;38593:17;38586:47;38650:131;38776:4;38650:131;:::i;:::-;38642:139;;38540:248;;;:::o;38794:419::-;38960:4;38998:2;38987:9;38983:18;38975:26;;39047:9;39041:4;39037:20;39033:1;39022:9;39018:17;39011:47;39075:131;39201:4;39075:131;:::i;:::-;39067:139;;38965:248;;;:::o;39219:419::-;39385:4;39423:2;39412:9;39408:18;39400:26;;39472:9;39466:4;39462:20;39458:1;39447:9;39443:17;39436:47;39500:131;39626:4;39500:131;:::i;:::-;39492:139;;39390:248;;;:::o;39644:419::-;39810:4;39848:2;39837:9;39833:18;39825:26;;39897:9;39891:4;39887:20;39883:1;39872:9;39868:17;39861:47;39925:131;40051:4;39925:131;:::i;:::-;39917:139;;39815:248;;;:::o;40069:419::-;40235:4;40273:2;40262:9;40258:18;40250:26;;40322:9;40316:4;40312:20;40308:1;40297:9;40293:17;40286:47;40350:131;40476:4;40350:131;:::i;:::-;40342:139;;40240:248;;;:::o;40494:419::-;40660:4;40698:2;40687:9;40683:18;40675:26;;40747:9;40741:4;40737:20;40733:1;40722:9;40718:17;40711:47;40775:131;40901:4;40775:131;:::i;:::-;40767:139;;40665:248;;;:::o;40919:419::-;41085:4;41123:2;41112:9;41108:18;41100:26;;41172:9;41166:4;41162:20;41158:1;41147:9;41143:17;41136:47;41200:131;41326:4;41200:131;:::i;:::-;41192:139;;41090:248;;;:::o;41344:222::-;41437:4;41475:2;41464:9;41460:18;41452:26;;41488:71;41556:1;41545:9;41541:17;41532:6;41488:71;:::i;:::-;41442:124;;;;:::o;41572:129::-;41606:6;41633:20;;:::i;:::-;41623:30;;41662:33;41690:4;41682:6;41662:33;:::i;:::-;41613:88;;;:::o;41707:75::-;41740:6;41773:2;41767:9;41757:19;;41747:35;:::o;41788:307::-;41849:4;41939:18;41931:6;41928:30;41925:2;;;41961:18;;:::i;:::-;41925:2;41999:29;42021:6;41999:29;:::i;:::-;41991:37;;42083:4;42077;42073:15;42065:23;;41854:241;;;:::o;42101:308::-;42163:4;42253:18;42245:6;42242:30;42239:2;;;42275:18;;:::i;:::-;42239:2;42313:29;42335:6;42313:29;:::i;:::-;42305:37;;42397:4;42391;42387:15;42379:23;;42168:241;;;:::o;42415:141::-;42464:4;42487:3;42479:11;;42510:3;42507:1;42500:14;42544:4;42541:1;42531:18;42523:26;;42469:87;;;:::o;42562:98::-;42613:6;42647:5;42641:12;42631:22;;42620:40;;;:::o;42666:99::-;42718:6;42752:5;42746:12;42736:22;;42725:40;;;:::o;42771:168::-;42854:11;42888:6;42883:3;42876:19;42928:4;42923:3;42919:14;42904:29;;42866:73;;;;:::o;42945:147::-;43046:11;43083:3;43068:18;;43058:34;;;;:::o;43098:169::-;43182:11;43216:6;43211:3;43204:19;43256:4;43251:3;43247:14;43232:29;;43194:73;;;;:::o;43273:148::-;43375:11;43412:3;43397:18;;43387:34;;;;:::o;43427:305::-;43467:3;43486:20;43504:1;43486:20;:::i;:::-;43481:25;;43520:20;43538:1;43520:20;:::i;:::-;43515:25;;43674:1;43606:66;43602:74;43599:1;43596:81;43593:2;;;43680:18;;:::i;:::-;43593:2;43724:1;43721;43717:9;43710:16;;43471:261;;;;:::o;43738:237::-;43776:3;43795:18;43811:1;43795:18;:::i;:::-;43790:23;;43827:18;43843:1;43827:18;:::i;:::-;43822:23;;43917:1;43911:4;43907:12;43904:1;43901:19;43898:2;;;43923:18;;:::i;:::-;43898:2;43967:1;43964;43960:9;43953:16;;43780:195;;;;:::o;43981:185::-;44021:1;44038:20;44056:1;44038:20;:::i;:::-;44033:25;;44072:20;44090:1;44072:20;:::i;:::-;44067:25;;44111:1;44101:2;;44116:18;;:::i;:::-;44101:2;44158:1;44155;44151:9;44146:14;;44023:143;;;;:::o;44172:179::-;44210:1;44227:18;44243:1;44227:18;:::i;:::-;44222:23;;44259:18;44275:1;44259:18;:::i;:::-;44254:23;;44296:1;44286:2;;44301:18;;:::i;:::-;44286:2;44343:1;44340;44336:9;44331:14;;44212:139;;;;:::o;44357:848::-;44418:5;44425:4;44449:6;44440:15;;44473:5;44464:14;;44487:712;44508:1;44498:8;44495:15;44487:712;;;44603:4;44598:3;44594:14;44588:4;44585:24;44582:2;;;44612:18;;:::i;:::-;44582:2;44662:1;44652:8;44648:16;44645:2;;;45077:4;45070:5;45066:16;45057:25;;44645:2;45127:4;45121;45117:15;45109:23;;45157:32;45180:8;45157:32;:::i;:::-;45145:44;;44487:712;;;44430:775;;;;;;;:::o;45211:285::-;45271:5;45295:23;45313:4;45295:23;:::i;:::-;45287:31;;45339:27;45357:8;45339:27;:::i;:::-;45327:39;;45385:104;45422:66;45412:8;45406:4;45385:104;:::i;:::-;45376:113;;45277:219;;;;:::o;45502:1073::-;45556:5;45747:8;45737:2;;45768:1;45759:10;;45770:5;;45737:2;45796:4;45786:2;;45813:1;45804:10;;45815:5;;45786:2;45882:4;45930:1;45925:27;;;;45966:1;45961:191;;;;45875:277;;45925:27;45943:1;45934:10;;45945:5;;;45961:191;46006:3;45996:8;45993:17;45990:2;;;46013:18;;:::i;:::-;45990:2;46062:8;46059:1;46055:16;46046:25;;46097:3;46090:5;46087:14;46084:2;;;46104:18;;:::i;:::-;46084:2;46137:5;;;45875:277;;46261:2;46251:8;46248:16;46242:3;46236:4;46233:13;46229:36;46211:2;46201:8;46198:16;46193:2;46187:4;46184:12;46180:35;46164:111;46161:2;;;46317:8;46311:4;46307:19;46298:28;;46352:3;46345:5;46342:14;46339:2;;;46359:18;;:::i;:::-;46339:2;46392:5;;46161:2;46432:42;46470:3;46460:8;46454:4;46451:1;46432:42;:::i;:::-;46417:57;;;;46506:4;46501:3;46497:14;46490:5;46487:25;46484:2;;;46515:18;;:::i;:::-;46484:2;46564:4;46557:5;46553:16;46544:25;;45562:1013;;;;;;:::o;46581:348::-;46621:7;46644:20;46662:1;46644:20;:::i;:::-;46639:25;;46678:20;46696:1;46678:20;:::i;:::-;46673:25;;46866:1;46798:66;46794:74;46791:1;46788:81;46783:1;46776:9;46769:17;46765:105;46762:2;;;46873:18;;:::i;:::-;46762:2;46921:1;46918;46914:9;46903:20;;46629:300;;;;:::o;46935:280::-;46973:7;46996:18;47012:1;46996:18;:::i;:::-;46991:23;;47028:18;47044:1;47028:18;:::i;:::-;47023:23;;47152:1;47146:4;47142:12;47139:1;47136:19;47131:1;47124:9;47117:17;47113:43;47110:2;;;47159:18;;:::i;:::-;47110:2;47207:1;47204;47200:9;47189:20;;46981:234;;;;:::o;47221:191::-;47261:4;47281:20;47299:1;47281:20;:::i;:::-;47276:25;;47315:20;47333:1;47315:20;:::i;:::-;47310:25;;47354:1;47351;47348:8;47345:2;;;47359:18;;:::i;:::-;47345:2;47404:1;47401;47397:9;47389:17;;47266:146;;;;:::o;47418:185::-;47456:4;47476:18;47492:1;47476:18;:::i;:::-;47471:23;;47508:18;47524:1;47508:18;:::i;:::-;47503:23;;47545:1;47542;47539:8;47536:2;;;47550:18;;:::i;:::-;47536:2;47595:1;47592;47588:9;47580:17;;47461:142;;;;:::o;47609:96::-;47646:7;47675:24;47693:5;47675:24;:::i;:::-;47664:35;;47654:51;;;:::o;47711:90::-;47745:7;47788:5;47781:13;47774:21;47763:32;;47753:48;;;:::o;47807:149::-;47843:7;47883:66;47876:5;47872:78;47861:89;;47851:105;;;:::o;47962:149::-;47998:7;48038:66;48031:5;48027:78;48016:89;;48006:105;;;:::o;48117:126::-;48154:7;48194:42;48187:5;48183:54;48172:65;;48162:81;;;:::o;48249:77::-;48286:7;48315:5;48304:16;;48294:32;;;:::o;48332:86::-;48367:7;48407:4;48400:5;48396:16;48385:27;;48375:43;;;:::o;48424:154::-;48508:6;48503:3;48498;48485:30;48570:1;48561:6;48556:3;48552:16;48545:27;48475:103;;;:::o;48584:307::-;48652:1;48662:113;48676:6;48673:1;48670:13;48662:113;;;48761:1;48756:3;48752:11;48746:18;48742:1;48737:3;48733:11;48726:39;48698:2;48695:1;48691:10;48686:15;;48662:113;;;48793:6;48790:1;48787:13;48784:2;;;48873:1;48864:6;48859:3;48855:16;48848:27;48784:2;48633:258;;;;:::o;48897:320::-;48941:6;48978:1;48972:4;48968:12;48958:22;;49025:1;49019:4;49015:12;49046:18;49036:2;;49102:4;49094:6;49090:17;49080:27;;49036:2;49164;49156:6;49153:14;49133:18;49130:38;49127:2;;;49183:18;;:::i;:::-;49127:2;48948:269;;;;:::o;49223:281::-;49306:27;49328:4;49306:27;:::i;:::-;49298:6;49294:40;49436:6;49424:10;49421:22;49400:18;49388:10;49385:34;49382:62;49379:2;;;49447:18;;:::i;:::-;49379:2;49487:10;49483:2;49476:22;49266:238;;;:::o;49510:233::-;49549:3;49572:24;49590:5;49572:24;:::i;:::-;49563:33;;49618:66;49611:5;49608:77;49605:2;;;49688:18;;:::i;:::-;49605:2;49735:1;49728:5;49724:13;49717:20;;49553:190;;;:::o;49749:78::-;49787:7;49816:5;49805:16;;49795:32;;;:::o;49833:180::-;49881:77;49878:1;49871:88;49978:4;49975:1;49968:15;50002:4;49999:1;49992:15;50019:180;50067:77;50064:1;50057:88;50164:4;50161:1;50154:15;50188:4;50185:1;50178:15;50205:180;50253:77;50250:1;50243:88;50350:4;50347:1;50340:15;50374:4;50371:1;50364:15;50391:180;50439:77;50436:1;50429:88;50536:4;50533:1;50526:15;50560:4;50557:1;50550:15;50577:102;50618:6;50669:2;50665:7;50660:2;50653:5;50649:14;50645:28;50635:38;;50625:54;;;:::o;50685:102::-;50727:8;50774:5;50771:1;50767:13;50746:34;;50736:51;;;:::o;50793:315::-;50933:66;50929:1;50921:6;50917:14;50910:90;51034:66;51029:2;51021:6;51017:15;51010:91;50899:209;:::o;51114:214::-;51254:66;51250:1;51242:6;51238:14;51231:90;51220:108;:::o;51334:237::-;51474:34;51470:1;51462:6;51458:14;51451:58;51543:20;51538:2;51530:6;51526:15;51519:45;51440:131;:::o;51577:225::-;51717:34;51713:1;51705:6;51701:14;51694:58;51786:8;51781:2;51773:6;51769:15;51762:33;51683:119;:::o;51808:178::-;51948:30;51944:1;51936:6;51932:14;51925:54;51914:72;:::o;51992:158::-;52132:10;52128:1;52120:6;52116:14;52109:34;52098:52;:::o;52156:315::-;52296:66;52292:1;52284:6;52280:14;52273:90;52397:66;52392:2;52384:6;52380:15;52373:91;52262:209;:::o;52477:214::-;52617:66;52613:1;52605:6;52601:14;52594:90;52583:108;:::o;52697:223::-;52837:34;52833:1;52825:6;52821:14;52814:58;52906:6;52901:2;52893:6;52889:15;52882:31;52803:117;:::o;52926:175::-;53066:27;53062:1;53054:6;53050:14;53043:51;53032:69;:::o;53107:231::-;53247:34;53243:1;53235:6;53231:14;53224:58;53316:14;53311:2;53303:6;53299:15;53292:39;53213:125;:::o;53344:243::-;53484:34;53480:1;53472:6;53468:14;53461:58;53553:26;53548:2;53540:6;53536:15;53529:51;53450:137;:::o;53593:229::-;53733:34;53729:1;53721:6;53717:14;53710:58;53802:12;53797:2;53789:6;53785:15;53778:37;53699:123;:::o;53828:228::-;53968:34;53964:1;53956:6;53952:14;53945:58;54037:11;54032:2;54024:6;54020:15;54013:36;53934:122;:::o;54062:166::-;54202:18;54198:1;54190:6;54186:14;54179:42;54168:60;:::o;54234:214::-;54374:66;54370:1;54362:6;54358:14;54351:90;54340:108;:::o;54454:182::-;54594:34;54590:1;54582:6;54578:14;54571:58;54560:76;:::o;54642:315::-;54782:66;54778:1;54770:6;54766:14;54759:90;54883:66;54878:2;54870:6;54866:15;54859:91;54748:209;:::o;54963:236::-;55103:34;55099:1;55091:6;55087:14;55080:58;55172:19;55167:2;55159:6;55155:15;55148:44;55069:130;:::o;55205:227::-;55345:34;55341:1;55333:6;55329:14;55322:58;55414:10;55409:2;55401:6;55397:15;55390:35;55311:121;:::o;55438:231::-;55578:34;55574:1;55566:6;55562:14;55555:58;55647:14;55642:2;55634:6;55630:15;55623:39;55544:125;:::o;55675:214::-;55815:66;55811:1;55803:6;55799:14;55792:90;55781:108;:::o;55895:182::-;56035:34;56031:1;56023:6;56019:14;56012:58;56001:76;:::o;56083:228::-;56223:34;56219:1;56211:6;56207:14;56200:58;56292:11;56287:2;56279:6;56275:15;56268:36;56189:122;:::o;56317:227::-;56457:34;56453:1;56445:6;56441:14;56434:58;56526:10;56521:2;56513:6;56509:15;56502:35;56423:121;:::o;56550:220::-;56690:34;56686:1;56678:6;56674:14;56667:58;56759:3;56754:2;56746:6;56742:15;56735:28;56656:114;:::o;56776:236::-;56916:34;56912:1;56904:6;56900:14;56893:58;56985:19;56980:2;56972:6;56968:15;56961:44;56882:130;:::o;57018:214::-;57158:66;57154:1;57146:6;57142:14;57135:90;57124:108;:::o;57238:315::-;57378:66;57374:1;57366:6;57362:14;57355:90;57479:66;57474:2;57466:6;57462:15;57455:91;57344:209;:::o;57559:153::-;57699:5;57695:1;57687:6;57683:14;57676:29;57665:47;:::o;57718:236::-;57858:34;57854:1;57846:6;57842:14;57835:58;57927:19;57922:2;57914:6;57910:15;57903:44;57824:130;:::o;57960:174::-;58100:26;58096:1;58088:6;58084:14;58077:50;58066:68;:::o;58140:214::-;58280:66;58276:1;58268:6;58264:14;58257:90;58246:108;:::o;58360:157::-;58500:9;58496:1;58488:6;58484:14;58477:33;58466:51;:::o;58523:122::-;58596:24;58614:5;58596:24;:::i;:::-;58589:5;58586:35;58576:2;;58635:1;58632;58625:12;58576:2;58566:79;:::o;58651:116::-;58721:21;58736:5;58721:21;:::i;:::-;58714:5;58711:32;58701:2;;58757:1;58754;58747:12;58701:2;58691:76;:::o;58773:120::-;58845:23;58862:5;58845:23;:::i;:::-;58838:5;58835:34;58825:2;;58883:1;58880;58873:12;58825:2;58815:78;:::o;58899:122::-;58972:24;58990:5;58972:24;:::i;:::-;58965:5;58962:35;58952:2;;59011:1;59008;59001:12;58952:2;58942:79;:::o

Swarm Source

ipfs://2f29b4026dc33b30547e8c761969c2d324497c2b7a1589a16ff9f42943649ba6
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.