ETH Price: $3,424.20 (+3.38%)

Token

Metopian SBT (MSBT)
 

Overview

Max Total Supply

213 MSBT

Holders

158

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
llllx.eth
Balance
1 MSBT
0x695ED4801272fa829c5c5D9d2f52176c67d58010
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MetopiaAlphaTestProof

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-28
*/

// File: @openzeppelin\contracts\utils\Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin\contracts\access\Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin\contracts\utils\introspection\IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin\contracts\token\ERC721\IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin\contracts\token\ERC721\IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin\contracts\token\ERC721\extensions\IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

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

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

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

// File: @openzeppelin\contracts\utils\Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin\contracts\utils\Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin\contracts\utils\introspection\ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin\contracts\token\ERC721\ERC721.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin\contracts\utils\Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: lib\base64.sol



pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

}

// File: lib\addressFormatter.sol

pragma solidity ^0.8.0;

library addressFormatter{

    function char(bytes1 b) internal pure returns (bytes1 c) {
        if (uint8(b) < 10) return bytes1(uint8(b) + 0x30);
        else return bytes1(uint8(b) + 0x57);
    }

    function toAsciiString(address x) internal pure returns (string memory) {
        bytes memory s = new bytes(40);
        for (uint256 i = 0; i < 20; i++) {
            bytes1 b = bytes1(uint8(uint256(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);
    }

}

// File: lib\strings.sol

/*
 * @title String & slice utility library for Solidity contracts.
 * @author Nick Johnson <[email protected]>
 *
 * @dev Functionality in this library is largely implemented using an
 *      abstraction called a 'slice'. A slice represents a part of a string -
 *      anything from the entire string to a single character, or even no
 *      characters at all (a 0-length slice). Since a slice only has to specify
 *      an offset and a length, copying and manipulating slices is a lot less
 *      expensive than copying and manipulating the strings they reference.
 *
 *      To further reduce gas costs, most functions on slice that need to return
 *      a slice modify the original one instead of allocating a new one; for
 *      instance, `s.split(".")` will return the text up to the first '.',
 *      modifying s to only contain the remainder of the string after the '.'.
 *      In situations where you do not want to modify the original slice, you
 *      can make a copy first with `.copy()`, for example:
 *      `s.copy().split(".")`. Try and avoid using this idiom in loops; since
 *      Solidity has no memory management, it will result in allocating many
 *      short-lived slices that are later discarded.
 *
 *      Functions that return two slices come in two versions: a non-allocating
 *      version that takes the second slice as an argument, modifying it in
 *      place, and an allocating version that allocates and returns the second
 *      slice; see `nextRune` for example.
 *
 *      Functions that have to copy string data will return strings rather than
 *      slices; these can be cast back to slices for further processing if
 *      required.
 *
 *      For convenience, some functions are provided with non-modifying
 *      variants that create a new slice and return both; for instance,
 *      `s.splitNew('.')` leaves s unmodified, and returns two values
 *      corresponding to the left and right parts of the string.
 */

pragma solidity ^0.8.0;

library strings {
    struct slice {
        uint _len;
        uint _ptr;
    }

    function memcpy(uint dest, uint src, uint len) private pure {
        // Copy word-length chunks while possible
        for(; len >= 32; len -= 32) {
            assembly {
                mstore(dest, mload(src))
            }
            dest += 32;
            src += 32;
        }

        // Copy remaining bytes
        uint mask = type(uint).max;
        if (len > 0) {
            mask = 256 ** (32 - len) - 1;
        }
        assembly {
            let srcpart := and(mload(src), not(mask))
            let destpart := and(mload(dest), mask)
            mstore(dest, or(destpart, srcpart))
        }
    }

    /*
     * @dev Returns a slice containing the entire string.
     * @param self The string to make a slice from.
     * @return A newly allocated slice containing the entire string.
     */
    function toSlice(string memory self) internal pure returns (slice memory) {
        uint ptr;
        assembly {
            ptr := add(self, 0x20)
        }
        return slice(bytes(self).length, ptr);
    }

    /*
     * @dev Returns the length of a null-terminated bytes32 string.
     * @param self The value to find the length of.
     * @return The length of the string, from 0 to 32.
     */
    function len(bytes32 self) internal pure returns (uint) {
        uint ret;
        if (self == 0)
            return 0;
        if (uint(self) & type(uint128).max == 0) {
            ret += 16;
            self = bytes32(uint(self) / 0x100000000000000000000000000000000);
        }
        if (uint(self) & type(uint64).max == 0) {
            ret += 8;
            self = bytes32(uint(self) / 0x10000000000000000);
        }
        if (uint(self) & type(uint32).max == 0) {
            ret += 4;
            self = bytes32(uint(self) / 0x100000000);
        }
        if (uint(self) & type(uint16).max == 0) {
            ret += 2;
            self = bytes32(uint(self) / 0x10000);
        }
        if (uint(self) & type(uint8).max == 0) {
            ret += 1;
        }
        return 32 - ret;
    }

    /*
     * @dev Returns a slice containing the entire bytes32, interpreted as a
     *      null-terminated utf-8 string.
     * @param self The bytes32 value to convert to a slice.
     * @return A new slice containing the value of the input argument up to the
     *         first null.
     */
    function toSliceB32(bytes32 self) internal pure returns (slice memory ret) {
        // Allocate space for `self` in memory, copy it there, and point ret at it
        assembly {
            let ptr := mload(0x40)
            mstore(0x40, add(ptr, 0x20))
            mstore(ptr, self)
            mstore(add(ret, 0x20), ptr)
        }
        ret._len = len(self);
    }

    /*
     * @dev Returns a new slice containing the same data as the current slice.
     * @param self The slice to copy.
     * @return A new slice containing the same data as `self`.
     */
    function copy(slice memory self) internal pure returns (slice memory) {
        return slice(self._len, self._ptr);
    }

    /*
     * @dev Copies a slice to a new string.
     * @param self The slice to copy.
     * @return A newly allocated string containing the slice's text.
     */
    function toString(slice memory self) internal pure returns (string memory) {
        string memory ret = new string(self._len);
        uint retptr;
        assembly { retptr := add(ret, 32) }

        memcpy(retptr, self._ptr, self._len);
        return ret;
    }

    /*
     * @dev Returns the length in runes of the slice. Note that this operation
     *      takes time proportional to the length of the slice; avoid using it
     *      in loops, and call `slice.empty()` if you only need to know whether
     *      the slice is empty or not.
     * @param self The slice to operate on.
     * @return The length of the slice in runes.
     */
    function len(slice memory self) internal pure returns (uint l) {
        // Starting at ptr-31 means the LSB will be the byte we care about
        uint ptr = self._ptr - 31;
        uint end = ptr + self._len;
        for (l = 0; ptr < end; l++) {
            uint8 b;
            assembly { b := and(mload(ptr), 0xFF) }
            if (b < 0x80) {
                ptr += 1;
            } else if(b < 0xE0) {
                ptr += 2;
            } else if(b < 0xF0) {
                ptr += 3;
            } else if(b < 0xF8) {
                ptr += 4;
            } else if(b < 0xFC) {
                ptr += 5;
            } else {
                ptr += 6;
            }
        }
    }

    /*
     * @dev Returns true if the slice is empty (has a length of 0).
     * @param self The slice to operate on.
     * @return True if the slice is empty, False otherwise.
     */
    function empty(slice memory self) internal pure returns (bool) {
        return self._len == 0;
    }

    /*
     * @dev Returns a positive number if `other` comes lexicographically after
     *      `self`, a negative number if it comes before, or zero if the
     *      contents of the two slices are equal. Comparison is done per-rune,
     *      on unicode codepoints.
     * @param self The first slice to compare.
     * @param other The second slice to compare.
     * @return The result of the comparison.
     */
    function compare(slice memory self, slice memory other) internal pure returns (int) {
        uint shortest = self._len;
        if (other._len < self._len)
            shortest = other._len;

        uint selfptr = self._ptr;
        uint otherptr = other._ptr;
        for (uint idx = 0; idx < shortest; idx += 32) {
            uint a;
            uint b;
            assembly {
                a := mload(selfptr)
                b := mload(otherptr)
            }
            if (a != b) {
                // Mask out irrelevant bytes and check again
                uint mask = type(uint).max; // 0xffff...
                if(shortest < 32) {
                  mask = ~(2 ** (8 * (32 - shortest + idx)) - 1);
                }
                unchecked {
                    uint diff = (a & mask) - (b & mask);
                    if (diff != 0)
                        return int(diff);
                }
            }
            selfptr += 32;
            otherptr += 32;
        }
        return int(self._len) - int(other._len);
    }

    /*
     * @dev Extracts the first rune in the slice into `rune`, advancing the
     *      slice to point to the next rune and returning `self`.
     * @param self The slice to operate on.
     * @param rune The slice that will contain the first rune.
     * @return `rune`.
     */
    function nextRune(slice memory self, slice memory rune) internal pure returns (slice memory) {
        rune._ptr = self._ptr;

        if (self._len == 0) {
            rune._len = 0;
            return rune;
        }

        uint l;
        uint b;
        // Load the first byte of the rune into the LSBs of b
        assembly { b := and(mload(sub(mload(add(self, 32)), 31)), 0xFF) }
        if (b < 0x80) {
            l = 1;
        } else if(b < 0xE0) {
            l = 2;
        } else if(b < 0xF0) {
            l = 3;
        } else {
            l = 4;
        }

        // Check for truncated codepoints
        if (l > self._len) {
            rune._len = self._len;
            self._ptr += self._len;
            self._len = 0;
            return rune;
        }

        self._ptr += l;
        self._len -= l;
        rune._len = l;
        return rune;
    }

    /*
     * @dev Returns the first rune in the slice, advancing the slice to point
     *      to the next rune.
     * @param self The slice to operate on.
     * @return A slice containing only the first rune from `self`.
     */
    function nextRune(slice memory self) internal pure returns (slice memory ret) {
        nextRune(self, ret);
    }


    /*
     * @dev Returns the keccak-256 hash of the slice.
     * @param self The slice to hash.
     * @return The hash of the slice.
     */
    function keccak(slice memory self) internal pure returns (bytes32 ret) {
        assembly {
            ret := keccak256(mload(add(self, 32)), mload(self))
        }
    }



    // Returns the memory address of the first byte of the first occurrence of
    // `needle` in `self`, or the first byte after `self` if not found.
    function findPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private pure returns (uint) {
        uint ptr = selfptr;
        uint idx;

        if (needlelen <= selflen) {
            if (needlelen <= 32) {
                bytes32 mask;
                if (needlelen > 0) {
                    mask = bytes32(~(2 ** (8 * (32 - needlelen)) - 1));
                }

                bytes32 needledata;
                assembly { needledata := and(mload(needleptr), mask) }

                uint end = selfptr + selflen - needlelen;
                bytes32 ptrdata;
                assembly { ptrdata := and(mload(ptr), mask) }

                while (ptrdata != needledata) {
                    if (ptr >= end)
                        return selfptr + selflen;
                    ptr++;
                    assembly { ptrdata := and(mload(ptr), mask) }
                }
                return ptr;
            } else {
                // For long needles, use hashing
                bytes32 hash;
                assembly { hash := keccak256(needleptr, needlelen) }

                for (idx = 0; idx <= selflen - needlelen; idx++) {
                    bytes32 testHash;
                    assembly { testHash := keccak256(ptr, needlelen) }
                    if (hash == testHash)
                        return ptr;
                    ptr += 1;
                }
            }
        }
        return selfptr + selflen;
    }

    /*
     * @dev Modifies `self` to contain everything from the first occurrence of
     *      `needle` to the end of the slice. `self` is set to the empty slice
     *      if `needle` is not found.
     * @param self The slice to search and modify.
     * @param needle The text to search for.
     * @return `self`.
     */
    function find(slice memory self, slice memory needle) internal pure returns (slice memory) {
        uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr);
        self._len -= ptr - self._ptr;
        self._ptr = ptr;
        return self;
    }

    /*
     * @dev Splits the slice, setting `self` to everything after the first
     *      occurrence of `needle`, and `token` to everything before it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and `token` is set to the entirety of `self`.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @param token An output parameter to which the first token is written.
     * @return `token`.
     */
    function split(slice memory self, slice memory needle, slice memory token) internal pure returns (slice memory) {
        uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr);
        token._ptr = self._ptr;
        token._len = ptr - self._ptr;
        if (ptr == self._ptr + self._len) {
            // Not found
            self._len = 0;
        } else {
            self._len -= token._len + needle._len;
            self._ptr = ptr + needle._len;
        }
        return token;
    }

    /*
     * @dev Splits the slice, setting `self` to everything after the first
     *      occurrence of `needle`, and returning everything before it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and the entirety of `self` is returned.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @return The part of `self` up to the first occurrence of `delim`.
     */
    function split(slice memory self, slice memory needle) internal pure returns (slice memory token) {
        split(self, needle, token);
    }

    /*
     * @dev Counts the number of nonoverlapping occurrences of `needle` in `self`.
     * @param self The slice to search.
     * @param needle The text to search for in `self`.
     * @return The number of occurrences of `needle` found in `self`.
     */
    function count(slice memory self, slice memory needle) internal pure returns (uint cnt) {
        uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr) + needle._len;
        while (ptr <= self._ptr + self._len) {
            cnt++;
            ptr = findPtr(self._len - (ptr - self._ptr), ptr, needle._len, needle._ptr) + needle._len;
        }
    }


    /*
     * @dev Returns a newly allocated string containing the concatenation of
     *      `self` and `other`.
     * @param self The first slice to concatenate.
     * @param other The second slice to concatenate.
     * @return The concatenation of the two strings.
     */
    function concat(slice memory self, slice memory other) internal pure returns (string memory) {
        string memory ret = new string(self._len + other._len);
        uint retptr;
        assembly { retptr := add(ret, 32) }
        memcpy(retptr, self._ptr, self._len);
        memcpy(retptr + self._len, other._ptr, other._len);
        return ret;
    }
    
}

// File: tools\IValidator.sol

pragma solidity ^0.8.0;

interface IValidator {
    
    function verify(
        address _signer,
        address _receiver,
        string memory message,
        bytes memory _sig
    ) external pure returns (bool);
    
}

// File: contracts\IMetopianSBTFactory.sol

pragma solidity >=0.8.0;


interface IMetopianSBTFactory {

    struct TokenType{
        // IPFS CID
        string featuredImageCID;

        // TODO logo image CID 

        string title;
        string space;
        string description;
        string titleEncoded;
        string spaceEncoded;
        string descriptionEncoded;
        string[] fields;

        address owner;
        // address issuer;
        // string issuerName;
    }

    function tokenType(uint id) external view returns(TokenType memory);

}

// File: contracts\MetopiaAlphaTestProof.sol


pragma solidity >=0.8.0 <0.9.0;
error Soulbound();

abstract contract IReverseRecords {
    function getNames(address[] calldata addresses)
        external
        view
        virtual
        returns (string[] memory);
}


contract MetopiaAlphaTestProof is ERC721, Ownable {
	using strings for *;
    using Counters for Counters.Counter;
    event Issue(uint typeId);

    IValidator validator = IValidator(0xEadC2a6fff036C12e62A74392d4c6CA77A5Ea007);
    IMetopianSBTFactory sbtFactory = IMetopianSBTFactory(0xeFC0590f81a6d3067d98ECEB11c1bF5a42ece05e);
    IReverseRecords res = IReverseRecords (0x3671aE578E63FdF66ad4F3E12CC0c0d71Ac7510C);

    function lookupName(address addr) private view returns (string memory) {
        string memory resolved;
        address[] memory t = new address[](1);
        t[0] = addr;
        string[] memory results = res.getNames(t);
        if (bytes(results[0]).length == 0) {
            resolved = string(abi.encodePacked("0x",addressFormatter.toAsciiString(addr)));
        } else {
            resolved = results[0];
        }
        return resolved;
    }
    
    struct Token {
        uint id;
        uint tokenType;
        address issuer;
        string issuerName;
        
        bytes signature;
        uint timestamp;
        mapping(string=>string) attributes;
    }

    Counters.Counter private _tokenId;
    Token[] public _tokens;
    mapping(uint=>uint) _tokenIdCounters;
    mapping(uint=>mapping(address=>uint)) private _balances;
    
    string private imageRenderURI =  "https://ai.metopia.xyz/sbt-generator";
    string private description = "";

    constructor() ERC721("Metopian SBT", "MSBT"){}

    function mint(uint typeId, string memory attributes, bytes memory _sig) public {
        require(_balances[typeId][msg.sender]==0, "Dupl");
        IMetopianSBTFactory.TokenType memory tokenType = sbtFactory.tokenType(typeId);
        string memory message = string(abi.encodePacked("0x",addressFormatter.toAsciiString(msg.sender), attributes, Strings.toString(typeId)));
        require(validator.verify(tokenType.owner, msg.sender, message, _sig));
        _tokenIdCounters[typeId] = _tokenIdCounters[typeId] + 1 ;
        _tokenId.increment();
        _safeMint(msg.sender, _tokenId.current());
        _balances[typeId][msg.sender] = 1;
        Token storage token = _tokens.push();
        token.id = _tokenIdCounters[typeId];
        token.tokenType = typeId;
        token.signature = _sig;
        token.issuer = tokenType.owner;
        token.issuerName = lookupName(tokenType.owner);
        token.timestamp = block.timestamp;
        
        updateTokenAttrs(_tokenId.current(), attributes);
    }

    function updateTokenAttrs(uint id, string memory attributes) private{
        // Token storage token = _tokens[id - 1]; 
        if(bytes(attributes).length>0){
            strings.slice memory s = attributes.toSlice();
            strings.slice memory delim = "==".toSlice();
            strings.slice memory delim2 = "&&".toSlice();
    
            while(!s.empty()){
                string memory tmpField = s.split(delim).toString();
                string memory tmpValue = s.split(delim2).toString();
                _tokens[id - 1].attributes[tmpField] = tmpValue;
            }   
        }
    }

    function update(uint id, string memory attributes, bytes memory _sig) public {
        require(id <= _tokenId.current(), "Invalid id");
        Token storage token = _tokens[id-1]; 
        IMetopianSBTFactory.TokenType memory tokenType = sbtFactory.tokenType(token.tokenType);
        string memory message = string(abi.encodePacked(attributes, Strings.toString(id)));
        require(validator.verify(tokenType.owner, msg.sender, message, _sig));
        token.signature = _sig;

        updateTokenAttrs(id, attributes);
    }

    function tokenAttr(uint256 id, string calldata field) public view returns (string memory){
        return _tokens[id-1].attributes[field];
    }

    function tokenAttrsJsonStr(uint id) public view returns (string memory){
        bytes memory buff;
        Token storage token = _tokens[id-1];
        IMetopianSBTFactory.TokenType memory tokenType = sbtFactory.tokenType(token.tokenType);
        if(tokenType.fields.length==0){
            return "";
        }
        for (uint i=0; i<tokenType.fields.length; i++) {
            buff = bytes(abi.encodePacked(
                    buff,
                    ',{"trait_type":"',
                    tokenType.fields[i],
                    '","value":"',
                    token.attributes[tokenType.fields[i]],
                    '"}'
                ));
        }
        return string(buff);
    }

    function totalSupply() public view returns (uint256) {
        return _tokenId.current();
    }

    function tokenURI(uint256 id) public view override returns (string memory){
        require(id <= _tokenId.current(), "Invalid id");
        return constructTokenURI(id);
    }

    function tokenImageUrl(uint256 id) private view returns (string memory) {
        Token storage token = _tokens[id-1];
        
        IMetopianSBTFactory.TokenType memory tokenType = sbtFactory.tokenType(token.tokenType);
        // TokenType storage tokenType = _tokenTypes[token.tokenType];
        return string(abi.encodePacked(
                imageRenderURI,
                '?title=',
                tokenType.titleEncoded,
                '&description=',
                tokenType.descriptionEncoded,
                '&space=',
                tokenType.spaceEncoded,
                '&signer=',
                token.issuerName,
                '&featuredImageCID=',
                tokenType.featuredImageCID,
                '&id=',
                Strings.toString(id)));
    }
    
    function constructTokenURI(uint256 id) private view returns (string memory) {
        Token storage token = _tokens[id-1];
        IMetopianSBTFactory.TokenType memory tokenType = sbtFactory.tokenType(token.tokenType);
        // TokenType storage tokenType = _tokenTypes[token.tokenType];
        return string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    Base64.encode(
                        bytes(
                            abi.encodePacked(
                                '{',
                                '"name":"',
                                name(),
                                '",',
                                '"description":"',
                                description,
                                '","image":"',
                                tokenImageUrl(id),
                                '", "attributes":[',
                                '{"trait_type": "Title", "value": "',
                                tokenType.title,
                                '"},',
                                '{"trait_type":"Description", "value":"',
                                tokenType.description,
                                '"},',
                                '{"trait_type":"Space", "value":"',
                                tokenType.space,
                                '"},',
                                '{"trait_type":"Signer", "value":"',
                                token.issuerName,
                                '"}',
                                tokenAttrsJsonStr(id),
                                ']}'
                            )
                        )
                    )
                )
            );
    }

    function setValidator(address _addr) public onlyOwner{
        validator = IValidator(_addr);
    }

    function setSBTFactory(address _addr) public onlyOwner{
        sbtFactory = IMetopianSBTFactory(_addr);
    }

    function setImageRenderURI(string memory _uri) public onlyOwner{
        imageRenderURI = _uri;
    }

    function setDescription(string calldata _description) public onlyOwner{
        description = _description;
    }


    /**
     * @notice SOULBOUND: Block transfers.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        require(
            from == address(0) || to == address(0),
            "SB: Nontransferable"
        );
        super._beforeTokenTransfer(from, to, tokenId);
    }

    /**
     * @notice SOULBOUND: Block approvals.
     */
    function setApprovalForAll(address operator, bool _approved)
        public
        virtual
        override
    {
        revert Soulbound();
    }

    /**
     * @notice SOULBOUND: Block approvals.
     */
    function approve(address to, uint256 tokenId)
        public
        virtual
        override
    {
        revert Soulbound();
    }
   

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Soulbound","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"Issue","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":"uint256","name":"","type":"uint256"}],"name":"_tokens","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"address","name":"issuer","type":"address"},{"internalType":"string","name":"issuerName","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"typeId","type":"uint256"},{"internalType":"string","name":"attributes","type":"string"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"mint","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_description","type":"string"}],"name":"setDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setImageRenderURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setSBTFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setValidator","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":"id","type":"uint256"},{"internalType":"string","name":"field","type":"string"}],"name":"tokenAttr","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenAttrsJsonStr","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"attributes","type":"string"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405273eadc2a6fff036c12e62a74392d4c6ca77a5ea007600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073efc0590f81a6d3067d98eceb11c1bf5a42ece05e600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550733671ae578e63fdf66ad4f3e12cc0c0d71ac7510c600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060600160405280602481526020016200644960249139600e90816200012d91906200055d565b5060405180602001604052806000815250600f90816200014e91906200055d565b503480156200015c57600080fd5b506040518060400160405280600c81526020017f4d65746f7069616e2053425400000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d534254000000000000000000000000000000000000000000000000000000008152508160009081620001da91906200055d565b508060019081620001ec91906200055d565b5050506200020f620002036200021560201b60201c565b6200021d60201b60201c565b62000644565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036557607f821691505b6020821081036200037b576200037a6200031d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003e57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003a6565b620003f18683620003a6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200043e62000438620004328462000409565b62000413565b62000409565b9050919050565b6000819050919050565b6200045a836200041d565b62000472620004698262000445565b848454620003b3565b825550505050565b600090565b620004896200047a565b620004968184846200044f565b505050565b5b81811015620004be57620004b26000826200047f565b6001810190506200049c565b5050565b601f8211156200050d57620004d78162000381565b620004e28462000396565b81016020851015620004f2578190505b6200050a620005018562000396565b8301826200049b565b50505b505050565b600082821c905092915050565b6000620005326000198460080262000512565b1980831691505092915050565b60006200054d83836200051f565b9150826002028217905092915050565b6200056882620002e3565b67ffffffffffffffff811115620005845762000583620002ee565b5b6200059082546200034c565b6200059d828285620004c2565b600060209050601f831160018114620005d55760008415620005c0578287015190505b620005cc85826200053f565b8655506200063c565b601f198416620005e58662000381565b60005b828110156200060f57848901518255600182019150602085019450602081019050620005e8565b868310156200062f57848901516200062b601f8916826200051f565b8355505b6001600288020188555050505b505050505050565b615df580620006546000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063785cc997116100de578063a22cb46511610097578063c87b56dd11610071578063c87b56dd14610469578063e985e9c514610499578063ed70554d146104c9578063f2fde38b146104fe5761018e565b8063a22cb46514610401578063a610040f1461041d578063b88d4fde1461044d5761018e565b8063785cc997146103415780638a0374921461035d5780638da5cb5b1461038d57806390c3f38f146103ab578063944ea5a4146103c757806395d89b41146103e35761018e565b806323b872dd1161014b5780635043c8c4116101255780635043c8c4146102bb5780636352211e146102d757806370a0823114610307578063715018a6146103375761018e565b806323b872dd146102675780632f607ddd1461028357806342842e0e1461029f5761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b3146102115780631327d3d81461022d57806318160ddd14610249575b600080fd5b6101ad60048036038101906101a89190613308565b61051a565b6040516101ba9190613350565b60405180910390f35b6101cb6105fc565b6040516101d891906133fb565b60405180910390f35b6101fb60048036038101906101f69190613453565b61068e565b60405161020891906134c1565b60405180910390f35b61022b60048036038101906102269190613508565b610713565b005b61024760048036038101906102429190613548565b610745565b005b610251610805565b60405161025e9190613584565b60405180910390f35b610281600480360381019061027c919061359f565b610816565b005b61029d600480360381019061029891906137c8565b610876565b005b6102b960048036038101906102b4919061359f565b610a9f565b005b6102d560048036038101906102d09190613548565b610abf565b005b6102f160048036038101906102ec9190613453565b610b7f565b6040516102fe91906134c1565b60405180910390f35b610321600480360381019061031c9190613548565b610c30565b60405161032e9190613584565b60405180910390f35b61033f610ce7565b005b61035b600480360381019061035691906137c8565b610d6f565b005b61037760048036038101906103729190613453565b61111f565b60405161038491906133fb565b60405180910390f35b6103956112d5565b6040516103a291906134c1565b60405180910390f35b6103c560048036038101906103c091906138b3565b6112ff565b005b6103e160048036038101906103dc9190613900565b611391565b005b6103eb611420565b6040516103f891906133fb565b60405180910390f35b61041b60048036038101906104169190613975565b6114b2565b005b610437600480360381019061043291906139b5565b6114e4565b60405161044491906133fb565b60405180910390f35b61046760048036038101906104629190613a15565b6115c7565b005b610483600480360381019061047e9190613453565b611629565b60405161049091906133fb565b60405180910390f35b6104b360048036038101906104ae9190613a98565b611687565b6040516104c09190613350565b60405180910390f35b6104e360048036038101906104de9190613453565b61171b565b6040516104f596959493929190613b2d565b60405180910390f35b61051860048036038101906105139190613548565b611897565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105e557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105f557506105f48261198e565b5b9050919050565b60606000805461060b90613bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613bcb565b80156106845780601f1061065957610100808354040283529160200191610684565b820191906000526020600020905b81548152906001019060200180831161066757829003601f168201915b5050505050905090565b6000610699826119f8565b6106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90613c6e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6040517fa4420a9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61074d611a64565b73ffffffffffffffffffffffffffffffffffffffff1661076b6112d5565b73ffffffffffffffffffffffffffffffffffffffff16146107c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b890613cda565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610811600a611a6c565b905090565b610827610821611a64565b82611a7a565b610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085d90613d6c565b60405180910390fd5b610871838383611b58565b505050565b610880600a611a6c565b8311156108c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b990613dd8565b60405180910390fd5b6000600b6001856108d39190613e27565b815481106108e4576108e3613e5b565b5b906000526020600020906007020190506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f683600101546040518263ffffffff1660e01b81526004016109559190613584565b600060405180830381865afa158015610972573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061099b91906141ba565b90506000846109a987611dbe565b6040516020016109ba92919061423f565b6040516020818303038152906040529050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ba4f8668361010001513384886040518563ffffffff1660e01b8152600401610a319493929190614263565b602060405180830381865afa158015610a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7291906142cb565b610a7b57600080fd5b83836004019081610a8c91906144a4565b50610a978686611f1e565b505050505050565b610aba838383604051806020016040528060008152506115c7565b505050565b610ac7611a64565b73ffffffffffffffffffffffffffffffffffffffff16610ae56112d5565b73ffffffffffffffffffffffffffffffffffffffff1614610b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3290613cda565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1e906145e8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c979061467a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cef611a64565b73ffffffffffffffffffffffffffffffffffffffff16610d0d6112d5565b73ffffffffffffffffffffffffffffffffffffffff1614610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a90613cda565b60405180910390fd5b610d6d600061206f565b565b6000600d600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df9906146e6565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f6856040518263ffffffff1660e01b8152600401610e5f9190613584565b600060405180830381865afa158015610e7c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ea591906141ba565b90506000610eb233612135565b84610ebc87611dbe565b604051602001610ece93929190614752565b6040516020818303038152906040529050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ba4f8668361010001513384876040518563ffffffff1660e01b8152600401610f459493929190614263565b602060405180830381865afa158015610f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8691906142cb565b610f8f57600080fd5b6001600c600087815260200190815260200160002054610faf919061478e565b600c600087815260200190815260200160002081905550610fd0600a6122f8565b610fe333610fde600a611a6c565b61230e565b6001600d600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600b6001816001815401808255809150500390600052602060002090600702019050600c60008781526020019081526020016000205481600001819055508581600101819055508381600401908161109391906144a4565b508261010001518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110ea83610100015161232c565b8160030190816110fa919061481d565b50428160050181905550611117611111600a611a6c565b86611f1e565b505050505050565b6060806000600b6001856111339190613e27565b8154811061114457611143613e5b565b5b906000526020600020906007020190506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f683600101546040518263ffffffff1660e01b81526004016111b59190613584565b600060405180830381865afa1580156111d2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111fb91906141ba565b905060008160e001515103611224576040518060200160405280600081525093505050506112d0565b60005b8160e00151518110156112c857838260e00151828151811061124c5761124b613e5b565b5b6020026020010151846006018460e00151848151811061126f5761126e613e5b565b5b602002602001015160405161128491906148ef565b90815260200160405180910390206040516020016112a493929190614aa9565b604051602081830303815290604052935080806112c090614afb565b915050611227565b508293505050505b919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611307611a64565b73ffffffffffffffffffffffffffffffffffffffff166113256112d5565b73ffffffffffffffffffffffffffffffffffffffff161461137b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137290613cda565b60405180910390fd5b8181600f918261138c929190614b4e565b505050565b611399611a64565b73ffffffffffffffffffffffffffffffffffffffff166113b76112d5565b73ffffffffffffffffffffffffffffffffffffffff161461140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490613cda565b60405180910390fd5b80600e908161141c919061481d565b5050565b60606001805461142f90613bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461145b90613bcb565b80156114a85780601f1061147d576101008083540402835291602001916114a8565b820191906000526020600020905b81548152906001019060200180831161148b57829003601f168201915b5050505050905090565b6040517fa4420a9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060600b6001856114f59190613e27565b8154811061150657611505613e5b565b5b90600052602060002090600702016006018383604051611527929190614c43565b9081526020016040518091039020805461154090613bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461156c90613bcb565b80156115b95780601f1061158e576101008083540402835291602001916115b9565b820191906000526020600020905b81548152906001019060200180831161159c57829003601f168201915b505050505090509392505050565b6115d86115d2611a64565b83611a7a565b611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e90613d6c565b60405180910390fd5b611623848484846124ee565b50505050565b6060611635600a611a6c565b821115611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e90613dd8565b60405180910390fd5b6116808261254a565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b818154811061172b57600080fd5b90600052602060002090600702016000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600301805461178090613bcb565b80601f01602080910402602001604051908101604052809291908181526020018280546117ac90613bcb565b80156117f95780601f106117ce576101008083540402835291602001916117f9565b820191906000526020600020905b8154815290600101906020018083116117dc57829003601f168201915b50505050509080600401805461180e90613bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461183a90613bcb565b80156118875780601f1061185c57610100808354040283529160200191611887565b820191906000526020600020905b81548152906001019060200180831161186a57829003601f168201915b5050505050908060050154905086565b61189f611a64565b73ffffffffffffffffffffffffffffffffffffffff166118bd6112d5565b73ffffffffffffffffffffffffffffffffffffffff1614611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a90613cda565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990614cce565b60405180910390fd5b61198b8161206f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b600081600001549050919050565b6000611a85826119f8565b611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90614d60565b60405180910390fd5b6000611acf83610b7f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b3e57508373ffffffffffffffffffffffffffffffffffffffff16611b268461068e565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b4f5750611b4e8185611687565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b7882610b7f565b73ffffffffffffffffffffffffffffffffffffffff1614611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc590614df2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3490614e84565b60405180910390fd5b611c488383836126ac565b611c53600082612762565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ca39190613e27565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cfa919061478e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611db983838361281b565b505050565b606060008203611e05576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f19565b600082905060005b60008214611e37578080611e2090614afb565b915050600a82611e309190614ed3565b9150611e0d565b60008167ffffffffffffffff811115611e5357611e526135fc565b5b6040519080825280601f01601f191660200182016040528015611e855781602001600182028036833780820191505090505b5090505b60008514611f1257600182611e9e9190613e27565b9150600a85611ead9190614f04565b6030611eb9919061478e565b60f81b818381518110611ecf57611ece613e5b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f0b9190614ed3565b9450611e89565b8093505050505b919050565b60008151111561206b576000611f3382612820565b90506000611f756040518060400160405280600281526020017f3d3d000000000000000000000000000000000000000000000000000000000000815250612820565b90506000611fb76040518060400160405280600281526020017f2626000000000000000000000000000000000000000000000000000000000000815250612820565b90505b611fc38361284e565b612067576000611fe4611fdf848661285e90919063ffffffff16565b612878565b90506000612003611ffe848761285e90919063ffffffff16565b612878565b905080600b6001896120159190613e27565b8154811061202657612025613e5b565b5b90600052602060002090600702016006018360405161204591906148ef565b9081526020016040518091039020908161205f919061481d565b505050611fba565b5050505b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000602867ffffffffffffffff811115612154576121536135fc565b5b6040519080825280601f01601f1916602001820160405280156121865781602001600182028036833780820191505090505b50905060005b60148110156122ee5760008160136121a49190613e27565b60086121b09190614f35565b60026121bc91906150aa565b8573ffffffffffffffffffffffffffffffffffffffff166121dd9190614ed3565b60f81b9050600060108260f81c6121f49190615102565b60f81b905060008160f81c601061220b9190615133565b8360f81c6122199190615170565b60f81b9050612227826128f4565b858560026122359190614f35565b8151811061224657612245613e5b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061227e816128f4565b85600186600261228e9190614f35565b612298919061478e565b815181106122a9576122a8613e5b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050505080806122e690614afb565b91505061218c565b5080915050919050565b6001816000016000828254019250508190555050565b61232882826040518060200160405280600081525061293a565b5050565b6060806000600167ffffffffffffffff81111561234c5761234b6135fc565b5b60405190808252806020026020018201604052801561237a5781602001602082028036833780820191505090505b509050838160008151811061239257612391613e5b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cbf8b66c836040518263ffffffff1660e01b81526004016124299190615263565b600060405180830381865afa158015612446573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061246f9190615285565b905060008160008151811061248757612486613e5b565b5b602002602001015151036124c45761249e85612135565b6040516020016124ae91906152ce565b60405160208183030381529060405292506124e3565b806000815181106124d8576124d7613e5b565b5b602002602001015192505b829350505050919050565b6124f9848484611b58565b61250584848484612995565b612544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253b90615362565b60405180910390fd5b50505050565b60606000600b60018461255d9190613e27565b8154811061256e5761256d613e5b565b5b906000526020600020906007020190506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f683600101546040518263ffffffff1660e01b81526004016125df9190613584565b600060405180830381865afa1580156125fc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061262591906141ba565b90506126846126326105fc565b600f61263d87612b1c565b846020015185606001518660400151886003016126598c61111f565b604051602001612670989796959493929190615784565b604051602081830303815290604052612c4a565b60405160200161269491906158e7565b60405160208183030381529060405292505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806127135750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b612752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274990615955565b60405180910390fd5b61275d838383612dc2565b505050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127d583610b7f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b505050565b612828613282565b600060208301905060405180604001604052808451815260200182815250915050919050565b6000808260000151149050919050565b612866613282565b612871838383612dc7565b5092915050565b60606000826000015167ffffffffffffffff81111561289a576128996135fc565b5b6040519080825280601f01601f1916602001820160405280156128cc5781602001600182028036833780820191505090505b50905060006020820190506128ea8185602001518660000151612e91565b8192505050919050565b6000600a8260f81c60ff16101561291f5760308260f81c6129159190615975565b60f81b9050612935565b60578260f81c61292f9190615975565b60f81b90505b919050565b6129448383612f3d565b6129516000848484612995565b612990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298790615362565b60405180910390fd5b505050565b60006129b68473ffffffffffffffffffffffffffffffffffffffff16613116565b15612b0f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129df611a64565b8786866040518563ffffffff1660e01b8152600401612a0194939291906159aa565b6020604051808303816000875af1925050508015612a3d57506040513d601f19601f82011682018060405250810190612a3a9190615a0b565b60015b612abf573d8060008114612a6d576040519150601f19603f3d011682016040523d82523d6000602084013e612a72565b606091505b506000815103612ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aae90615362565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b14565b600190505b949350505050565b60606000600b600184612b2f9190613e27565b81548110612b4057612b3f613e5b565b5b906000526020600020906007020190506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f683600101546040518263ffffffff1660e01b8152600401612bb19190613584565b600060405180830381865afa158015612bce573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612bf791906141ba565b9050600e81608001518260c001518360a00151856003018560000151612c1c8a611dbe565b604051602001612c329796959493929190615c00565b60405160208183030381529060405292505050919050565b60606000825103612c6c57604051806020016040528060008152509050612dbd565b6000604051806060016040528060408152602001615d806040913990506000600360028551612c9b919061478e565b612ca59190614ed3565b6004612cb19190614f35565b90506000602082612cc2919061478e565b67ffffffffffffffff811115612cdb57612cda6135fc565b5b6040519080825280601f01601f191660200182016040528015612d0d5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612d7c576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825360018201915050612d21565b600389510660018114612d965760028114612da657612db1565b613d3d60f01b6002830352612db1565b603d60f81b60018303525b50505050508093505050505b919050565b505050565b612dcf613282565b6000612ded8560000151866020015186600001518760200151613139565b90508460200151836020018181525050846020015181612e0d9190613e27565b83600001818152505084600001518560200151612e2a919061478e565b8103612e40576000856000018181525050612e86565b83600001518360000151612e54919061478e565b85600001818151612e659190613e27565b91508181525050836000015181612e7c919061478e565b8560200181815250505b829150509392505050565b5b60208110612ed05781518352602083612eab919061478e565b9250602082612eba919061478e565b9150602081612ec99190613e27565b9050612e92565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90506000821115612f27576001826020612f0d9190613e27565b610100612f1a91906150aa565b612f249190613e27565b90505b8019835116818551168181178652505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa390615cf3565b60405180910390fd5b612fb5816119f8565b15612ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fec90615d5f565b60405180910390fd5b613001600083836126ac565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613051919061478e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131126000838361281b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000808490506000868511613269576020851161320c576000808611156131925760018660206131699190613e27565b60086131759190614f35565b600261318191906150aa565b61318b9190613e27565b1960001b90505b60008186511690506000878a8a6131a9919061478e565b6131b39190613e27565b905060008386511690505b8281146131fe578186106131e5578a8a6131d8919061478e565b965050505050505061327a565b85806131f090614afb565b9650508386511690506131be565b85965050505050505061327a565b60008585209050600091505b85886132249190613e27565b82116132675760008684209050808203613244578394505050505061327a565b600184613251919061478e565b935050818061325f90614afb565b925050613218565b505b8686613275919061478e565b925050505b949350505050565b604051806040016040528060008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132e5816132b0565b81146132f057600080fd5b50565b600081359050613302816132dc565b92915050565b60006020828403121561331e5761331d6132a6565b5b600061332c848285016132f3565b91505092915050565b60008115159050919050565b61334a81613335565b82525050565b60006020820190506133656000830184613341565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133a557808201518184015260208101905061338a565b60008484015250505050565b6000601f19601f8301169050919050565b60006133cd8261336b565b6133d78185613376565b93506133e7818560208601613387565b6133f0816133b1565b840191505092915050565b6000602082019050818103600083015261341581846133c2565b905092915050565b6000819050919050565b6134308161341d565b811461343b57600080fd5b50565b60008135905061344d81613427565b92915050565b600060208284031215613469576134686132a6565b5b60006134778482850161343e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134ab82613480565b9050919050565b6134bb816134a0565b82525050565b60006020820190506134d660008301846134b2565b92915050565b6134e5816134a0565b81146134f057600080fd5b50565b600081359050613502816134dc565b92915050565b6000806040838503121561351f5761351e6132a6565b5b600061352d858286016134f3565b925050602061353e8582860161343e565b9150509250929050565b60006020828403121561355e5761355d6132a6565b5b600061356c848285016134f3565b91505092915050565b61357e8161341d565b82525050565b60006020820190506135996000830184613575565b92915050565b6000806000606084860312156135b8576135b76132a6565b5b60006135c6868287016134f3565b93505060206135d7868287016134f3565b92505060406135e88682870161343e565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613634826133b1565b810181811067ffffffffffffffff82111715613653576136526135fc565b5b80604052505050565b600061366661329c565b9050613672828261362b565b919050565b600067ffffffffffffffff821115613692576136916135fc565b5b61369b826133b1565b9050602081019050919050565b82818337600083830152505050565b60006136ca6136c584613677565b61365c565b9050828152602081018484840111156136e6576136e56135f7565b5b6136f18482856136a8565b509392505050565b600082601f83011261370e5761370d6135f2565b5b813561371e8482602086016136b7565b91505092915050565b600067ffffffffffffffff821115613742576137416135fc565b5b61374b826133b1565b9050602081019050919050565b600061376b61376684613727565b61365c565b905082815260208101848484011115613787576137866135f7565b5b6137928482856136a8565b509392505050565b600082601f8301126137af576137ae6135f2565b5b81356137bf848260208601613758565b91505092915050565b6000806000606084860312156137e1576137e06132a6565b5b60006137ef8682870161343e565b935050602084013567ffffffffffffffff8111156138105761380f6132ab565b5b61381c868287016136f9565b925050604084013567ffffffffffffffff81111561383d5761383c6132ab565b5b6138498682870161379a565b9150509250925092565b600080fd5b600080fd5b60008083601f840112613873576138726135f2565b5b8235905067ffffffffffffffff8111156138905761388f613853565b5b6020830191508360018202830111156138ac576138ab613858565b5b9250929050565b600080602083850312156138ca576138c96132a6565b5b600083013567ffffffffffffffff8111156138e8576138e76132ab565b5b6138f48582860161385d565b92509250509250929050565b600060208284031215613916576139156132a6565b5b600082013567ffffffffffffffff811115613934576139336132ab565b5b613940848285016136f9565b91505092915050565b61395281613335565b811461395d57600080fd5b50565b60008135905061396f81613949565b92915050565b6000806040838503121561398c5761398b6132a6565b5b600061399a858286016134f3565b92505060206139ab85828601613960565b9150509250929050565b6000806000604084860312156139ce576139cd6132a6565b5b60006139dc8682870161343e565b935050602084013567ffffffffffffffff8111156139fd576139fc6132ab565b5b613a098682870161385d565b92509250509250925092565b60008060008060808587031215613a2f57613a2e6132a6565b5b6000613a3d878288016134f3565b9450506020613a4e878288016134f3565b9350506040613a5f8782880161343e565b925050606085013567ffffffffffffffff811115613a8057613a7f6132ab565b5b613a8c8782880161379a565b91505092959194509250565b60008060408385031215613aaf57613aae6132a6565b5b6000613abd858286016134f3565b9250506020613ace858286016134f3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000613aff82613ad8565b613b098185613ae3565b9350613b19818560208601613387565b613b22816133b1565b840191505092915050565b600060c082019050613b426000830189613575565b613b4f6020830188613575565b613b5c60408301876134b2565b8181036060830152613b6e81866133c2565b90508181036080830152613b828185613af4565b9050613b9160a0830184613575565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613be357607f821691505b602082108103613bf657613bf5613b9c565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c58602c83613376565b9150613c6382613bfc565b604082019050919050565b60006020820190508181036000830152613c8781613c4b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613cc4602083613376565b9150613ccf82613c8e565b602082019050919050565b60006020820190508181036000830152613cf381613cb7565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613d56603183613376565b9150613d6182613cfa565b604082019050919050565b60006020820190508181036000830152613d8581613d49565b9050919050565b7f496e76616c696420696400000000000000000000000000000000000000000000600082015250565b6000613dc2600a83613376565b9150613dcd82613d8c565b602082019050919050565b60006020820190508181036000830152613df181613db5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e328261341d565b9150613e3d8361341d565b9250828203905081811115613e5557613e54613df8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b6000613ea7613ea284613677565b61365c565b905082815260208101848484011115613ec357613ec26135f7565b5b613ece848285613387565b509392505050565b600082601f830112613eeb57613eea6135f2565b5b8151613efb848260208601613e94565b91505092915050565b600067ffffffffffffffff821115613f1f57613f1e6135fc565b5b602082029050602081019050919050565b6000613f43613f3e84613f04565b61365c565b90508083825260208201905060208402830185811115613f6657613f65613858565b5b835b81811015613fad57805167ffffffffffffffff811115613f8b57613f8a6135f2565b5b808601613f988982613ed6565b85526020850194505050602081019050613f68565b5050509392505050565b600082601f830112613fcc57613fcb6135f2565b5b8151613fdc848260208601613f30565b91505092915050565b600081519050613ff4816134dc565b92915050565b6000610120828403121561401157614010613e8a565b5b61401c61012061365c565b9050600082015167ffffffffffffffff81111561403c5761403b613e8f565b5b61404884828501613ed6565b600083015250602082015167ffffffffffffffff81111561406c5761406b613e8f565b5b61407884828501613ed6565b602083015250604082015167ffffffffffffffff81111561409c5761409b613e8f565b5b6140a884828501613ed6565b604083015250606082015167ffffffffffffffff8111156140cc576140cb613e8f565b5b6140d884828501613ed6565b606083015250608082015167ffffffffffffffff8111156140fc576140fb613e8f565b5b61410884828501613ed6565b60808301525060a082015167ffffffffffffffff81111561412c5761412b613e8f565b5b61413884828501613ed6565b60a08301525060c082015167ffffffffffffffff81111561415c5761415b613e8f565b5b61416884828501613ed6565b60c08301525060e082015167ffffffffffffffff81111561418c5761418b613e8f565b5b61419884828501613fb7565b60e0830152506101006141ad84828501613fe5565b6101008301525092915050565b6000602082840312156141d0576141cf6132a6565b5b600082015167ffffffffffffffff8111156141ee576141ed6132ab565b5b6141fa84828501613ffa565b91505092915050565b600081905092915050565b60006142198261336b565b6142238185614203565b9350614233818560208601613387565b80840191505092915050565b600061424b828561420e565b9150614257828461420e565b91508190509392505050565b600060808201905061427860008301876134b2565b61428560208301866134b2565b818103604083015261429781856133c2565b905081810360608301526142ab8184613af4565b905095945050505050565b6000815190506142c581613949565b92915050565b6000602082840312156142e1576142e06132a6565b5b60006142ef848285016142b6565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261435a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261431d565b614364868361431d565b95508019841693508086168417925050509392505050565b6000819050919050565b60006143a161439c6143978461341d565b61437c565b61341d565b9050919050565b6000819050919050565b6143bb83614386565b6143cf6143c7826143a8565b84845461432a565b825550505050565b600090565b6143e46143d7565b6143ef8184846143b2565b505050565b5b81811015614413576144086000826143dc565b6001810190506143f5565b5050565b601f82111561445857614429816142f8565b6144328461430d565b81016020851015614441578190505b61445561444d8561430d565b8301826143f4565b50505b505050565b600082821c905092915050565b600061447b6000198460080261445d565b1980831691505092915050565b6000614494838361446a565b9150826002028217905092915050565b6144ad82613ad8565b67ffffffffffffffff8111156144c6576144c56135fc565b5b6144d08254613bcb565b6144db828285614417565b600060209050601f83116001811461450e57600084156144fc578287015190505b6145068582614488565b86555061456e565b601f19841661451c866142f8565b60005b828110156145445784890151825560018201915060208501945060208101905061451f565b86831015614561578489015161455d601f89168261446a565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006145d2602983613376565b91506145dd82614576565b604082019050919050565b60006020820190508181036000830152614601816145c5565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614664602a83613376565b915061466f82614608565b604082019050919050565b6000602082019050818103600083015261469381614657565b9050919050565b7f4475706c00000000000000000000000000000000000000000000000000000000600082015250565b60006146d0600483613376565b91506146db8261469a565b602082019050919050565b600060208201905081810360008301526146ff816146c3565b9050919050565b7f3078000000000000000000000000000000000000000000000000000000000000600082015250565b600061473c600283614203565b915061474782614706565b600282019050919050565b600061475d8261472f565b9150614769828661420e565b9150614775828561420e565b9150614781828461420e565b9150819050949350505050565b60006147998261341d565b91506147a48361341d565b92508282019050808211156147bc576147bb613df8565b5b92915050565b60008190508160005260206000209050919050565b601f821115614818576147e9816147c2565b6147f28461430d565b81016020851015614801578190505b61481561480d8561430d565b8301826143f4565b50505b505050565b6148268261336b565b67ffffffffffffffff81111561483f5761483e6135fc565b5b6148498254613bcb565b6148548282856147d7565b600060209050601f8311600181146148875760008415614875578287015190505b61487f8582614488565b8655506148e7565b601f198416614895866147c2565b60005b828110156148bd57848901518255600182019150602085019450602081019050614898565b868310156148da57848901516148d6601f89168261446a565b8355505b6001600288020188555050505b505050505050565b60006148fb828461420e565b915081905092915050565b600081905092915050565b600061491c82613ad8565b6149268185614906565b9350614936818560208601613387565b80840191505092915050565b7f2c7b2274726169745f74797065223a2200000000000000000000000000000000600082015250565b6000614978601083614203565b915061498382614942565b601082019050919050565b7f222c2276616c7565223a22000000000000000000000000000000000000000000600082015250565b60006149c4600b83614203565b91506149cf8261498e565b600b82019050919050565b600081546149e781613bcb565b6149f18186614203565b94506001821660008114614a0c5760018114614a2157614a54565b60ff1983168652811515820286019350614a54565b614a2a856147c2565b60005b83811015614a4c57815481890152600182019150602081019050614a2d565b838801955050505b50505092915050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614a93600283614203565b9150614a9e82614a5d565b600282019050919050565b6000614ab58286614911565b9150614ac08261496b565b9150614acc828561420e565b9150614ad7826149b7565b9150614ae382846149da565b9150614aee82614a86565b9150819050949350505050565b6000614b068261341d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b3857614b37613df8565b5b600182019050919050565b600082905092915050565b614b588383614b43565b67ffffffffffffffff811115614b7157614b706135fc565b5b614b7b8254613bcb565b614b868282856147d7565b6000601f831160018114614bb55760008415614ba3578287013590505b614bad8582614488565b865550614c15565b601f198416614bc3866147c2565b60005b82811015614beb57848901358255600182019150602085019450602081019050614bc6565b86831015614c085784890135614c04601f89168261446a565b8355505b6001600288020188555050505b50505050505050565b6000614c2a8385614203565b9350614c378385846136a8565b82840190509392505050565b6000614c50828486614c1e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614cb8602683613376565b9150614cc382614c5c565b604082019050919050565b60006020820190508181036000830152614ce781614cab565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614d4a602c83613376565b9150614d5582614cee565b604082019050919050565b60006020820190508181036000830152614d7981614d3d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614ddc602583613376565b9150614de782614d80565b604082019050919050565b60006020820190508181036000830152614e0b81614dcf565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614e6e602483613376565b9150614e7982614e12565b604082019050919050565b60006020820190508181036000830152614e9d81614e61565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ede8261341d565b9150614ee98361341d565b925082614ef957614ef8614ea4565b5b828204905092915050565b6000614f0f8261341d565b9150614f1a8361341d565b925082614f2a57614f29614ea4565b5b828206905092915050565b6000614f408261341d565b9150614f4b8361341d565b9250828202614f598161341d565b91508282048414831517614f7057614f6f613df8565b5b5092915050565b60008160011c9050919050565b6000808291508390505b6001851115614fce57808604811115614faa57614fa9613df8565b5b6001851615614fb95780820291505b8081029050614fc785614f77565b9450614f8e565b94509492505050565b600082614fe757600190506150a3565b81614ff557600090506150a3565b816001811461500b576002811461501557615044565b60019150506150a3565b60ff84111561502757615026613df8565b5b8360020a91508482111561503e5761503d613df8565b5b506150a3565b5060208310610133831016604e8410600b84101617156150795782820a90508381111561507457615073613df8565b5b6150a3565b6150868484846001614f84565b9250905081840481111561509d5761509c613df8565b5b81810290505b9392505050565b60006150b58261341d565b91506150c08361341d565b92506150ed7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614fd7565b905092915050565b600060ff82169050919050565b600061510d826150f5565b9150615118836150f5565b92508261512857615127614ea4565b5b828204905092915050565b600061513e826150f5565b9150615149836150f5565b9250828202615157816150f5565b915080821461516957615168613df8565b5b5092915050565b600061517b826150f5565b9150615186836150f5565b9250828203905060ff81111561519f5761519e613df8565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6151da816134a0565b82525050565b60006151ec83836151d1565b60208301905092915050565b6000602082019050919050565b6000615210826151a5565b61521a81856151b0565b9350615225836151c1565b8060005b8381101561525657815161523d88826151e0565b9750615248836151f8565b925050600181019050615229565b5085935050505092915050565b6000602082019050818103600083015261527d8184615205565b905092915050565b60006020828403121561529b5761529a6132a6565b5b600082015167ffffffffffffffff8111156152b9576152b86132ab565b5b6152c584828501613fb7565b91505092915050565b60006152d98261472f565b91506152e5828461420e565b915081905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061534c603283613376565b9150615357826152f0565b604082019050919050565b6000602082019050818103600083015261537b8161533f565b9050919050565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b60006153b8600183614203565b91506153c382615382565b600182019050919050565b7f226e616d65223a22000000000000000000000000000000000000000000000000600082015250565b6000615404600883614203565b915061540f826153ce565b600882019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b6000615450600283614203565b915061545b8261541a565b600282019050919050565b7f226465736372697074696f6e223a220000000000000000000000000000000000600082015250565b600061549c600f83614203565b91506154a782615466565b600f82019050919050565b7f222c22696d616765223a22000000000000000000000000000000000000000000600082015250565b60006154e8600b83614203565b91506154f3826154b2565b600b82019050919050565b7f222c202261747472696275746573223a5b000000000000000000000000000000600082015250565b6000615534601183614203565b915061553f826154fe565b601182019050919050565b7f7b2274726169745f74797065223a20225469746c65222c202276616c7565223a60008201527f2022000000000000000000000000000000000000000000000000000000000000602082015250565b60006155a6602283614203565b91506155b18261554a565b602282019050919050565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b60006155f2600383614203565b91506155fd826155bc565b600382019050919050565b7f7b2274726169745f74797065223a224465736372697074696f6e222c2022766160008201527f6c7565223a220000000000000000000000000000000000000000000000000000602082015250565b6000615664602683614203565b915061566f82615608565b602682019050919050565b7f7b2274726169745f74797065223a225370616365222c202276616c7565223a22600082015250565b60006156b0602083614203565b91506156bb8261567a565b602082019050919050565b7f7b2274726169745f74797065223a225369676e6572222c202276616c7565223a60008201527f2200000000000000000000000000000000000000000000000000000000000000602082015250565b6000615722602183614203565b915061572d826156c6565b602182019050919050565b7f5d7d000000000000000000000000000000000000000000000000000000000000600082015250565b600061576e600283614203565b915061577982615738565b600282019050919050565b600061578f826153ab565b915061579a826153f7565b91506157a6828b61420e565b91506157b182615443565b91506157bc8261548f565b91506157c8828a6149da565b91506157d3826154db565b91506157df828961420e565b91506157ea82615527565b91506157f582615599565b9150615801828861420e565b915061580c826155e5565b915061581782615657565b9150615823828761420e565b915061582e826155e5565b9150615839826156a3565b9150615845828661420e565b9150615850826155e5565b915061585b82615715565b915061586782856149da565b915061587282614a86565b915061587e828461420e565b915061588982615761565b91508190509998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b60006158d1601d83614203565b91506158dc8261589b565b601d82019050919050565b60006158f2826158c4565b91506158fe828461420e565b915081905092915050565b7f53423a204e6f6e7472616e7366657261626c6500000000000000000000000000600082015250565b600061593f601383613376565b915061594a82615909565b602082019050919050565b6000602082019050818103600083015261596e81615932565b9050919050565b6000615980826150f5565b915061598b836150f5565b9250828201905060ff8111156159a4576159a3613df8565b5b92915050565b60006080820190506159bf60008301876134b2565b6159cc60208301866134b2565b6159d96040830185613575565b81810360608301526159eb8184613af4565b905095945050505050565b600081519050615a05816132dc565b92915050565b600060208284031215615a2157615a206132a6565b5b6000615a2f848285016159f6565b91505092915050565b7f3f7469746c653d00000000000000000000000000000000000000000000000000600082015250565b6000615a6e600783614203565b9150615a7982615a38565b600782019050919050565b7f266465736372697074696f6e3d00000000000000000000000000000000000000600082015250565b6000615aba600d83614203565b9150615ac582615a84565b600d82019050919050565b7f2673706163653d00000000000000000000000000000000000000000000000000600082015250565b6000615b06600783614203565b9150615b1182615ad0565b600782019050919050565b7f267369676e65723d000000000000000000000000000000000000000000000000600082015250565b6000615b52600883614203565b9150615b5d82615b1c565b600882019050919050565b7f266665617475726564496d6167654349443d0000000000000000000000000000600082015250565b6000615b9e601283614203565b9150615ba982615b68565b601282019050919050565b7f2669643d00000000000000000000000000000000000000000000000000000000600082015250565b6000615bea600483614203565b9150615bf582615bb4565b600482019050919050565b6000615c0c828a6149da565b9150615c1782615a61565b9150615c23828961420e565b9150615c2e82615aad565b9150615c3a828861420e565b9150615c4582615af9565b9150615c51828761420e565b9150615c5c82615b45565b9150615c6882866149da565b9150615c7382615b91565b9150615c7f828561420e565b9150615c8a82615bdd565b9150615c96828461420e565b915081905098975050505050505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615cdd602083613376565b9150615ce882615ca7565b602082019050919050565b60006020820190508181036000830152615d0c81615cd0565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615d49601c83613376565b9150615d5482615d13565b602082019050919050565b60006020820190508181036000830152615d7881615d3c565b905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220e09edc06651da4c00b85699b22bd541916b5b88e1bbf8012baecfe539d0d345e64736f6c6343000811003368747470733a2f2f61692e6d65746f7069612e78797a2f7362742d67656e657261746f72

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063785cc997116100de578063a22cb46511610097578063c87b56dd11610071578063c87b56dd14610469578063e985e9c514610499578063ed70554d146104c9578063f2fde38b146104fe5761018e565b8063a22cb46514610401578063a610040f1461041d578063b88d4fde1461044d5761018e565b8063785cc997146103415780638a0374921461035d5780638da5cb5b1461038d57806390c3f38f146103ab578063944ea5a4146103c757806395d89b41146103e35761018e565b806323b872dd1161014b5780635043c8c4116101255780635043c8c4146102bb5780636352211e146102d757806370a0823114610307578063715018a6146103375761018e565b806323b872dd146102675780632f607ddd1461028357806342842e0e1461029f5761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b3146102115780631327d3d81461022d57806318160ddd14610249575b600080fd5b6101ad60048036038101906101a89190613308565b61051a565b6040516101ba9190613350565b60405180910390f35b6101cb6105fc565b6040516101d891906133fb565b60405180910390f35b6101fb60048036038101906101f69190613453565b61068e565b60405161020891906134c1565b60405180910390f35b61022b60048036038101906102269190613508565b610713565b005b61024760048036038101906102429190613548565b610745565b005b610251610805565b60405161025e9190613584565b60405180910390f35b610281600480360381019061027c919061359f565b610816565b005b61029d600480360381019061029891906137c8565b610876565b005b6102b960048036038101906102b4919061359f565b610a9f565b005b6102d560048036038101906102d09190613548565b610abf565b005b6102f160048036038101906102ec9190613453565b610b7f565b6040516102fe91906134c1565b60405180910390f35b610321600480360381019061031c9190613548565b610c30565b60405161032e9190613584565b60405180910390f35b61033f610ce7565b005b61035b600480360381019061035691906137c8565b610d6f565b005b61037760048036038101906103729190613453565b61111f565b60405161038491906133fb565b60405180910390f35b6103956112d5565b6040516103a291906134c1565b60405180910390f35b6103c560048036038101906103c091906138b3565b6112ff565b005b6103e160048036038101906103dc9190613900565b611391565b005b6103eb611420565b6040516103f891906133fb565b60405180910390f35b61041b60048036038101906104169190613975565b6114b2565b005b610437600480360381019061043291906139b5565b6114e4565b60405161044491906133fb565b60405180910390f35b61046760048036038101906104629190613a15565b6115c7565b005b610483600480360381019061047e9190613453565b611629565b60405161049091906133fb565b60405180910390f35b6104b360048036038101906104ae9190613a98565b611687565b6040516104c09190613350565b60405180910390f35b6104e360048036038101906104de9190613453565b61171b565b6040516104f596959493929190613b2d565b60405180910390f35b61051860048036038101906105139190613548565b611897565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105e557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105f557506105f48261198e565b5b9050919050565b60606000805461060b90613bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613bcb565b80156106845780601f1061065957610100808354040283529160200191610684565b820191906000526020600020905b81548152906001019060200180831161066757829003601f168201915b5050505050905090565b6000610699826119f8565b6106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90613c6e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6040517fa4420a9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61074d611a64565b73ffffffffffffffffffffffffffffffffffffffff1661076b6112d5565b73ffffffffffffffffffffffffffffffffffffffff16146107c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b890613cda565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610811600a611a6c565b905090565b610827610821611a64565b82611a7a565b610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085d90613d6c565b60405180910390fd5b610871838383611b58565b505050565b610880600a611a6c565b8311156108c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b990613dd8565b60405180910390fd5b6000600b6001856108d39190613e27565b815481106108e4576108e3613e5b565b5b906000526020600020906007020190506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f683600101546040518263ffffffff1660e01b81526004016109559190613584565b600060405180830381865afa158015610972573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061099b91906141ba565b90506000846109a987611dbe565b6040516020016109ba92919061423f565b6040516020818303038152906040529050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ba4f8668361010001513384886040518563ffffffff1660e01b8152600401610a319493929190614263565b602060405180830381865afa158015610a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7291906142cb565b610a7b57600080fd5b83836004019081610a8c91906144a4565b50610a978686611f1e565b505050505050565b610aba838383604051806020016040528060008152506115c7565b505050565b610ac7611a64565b73ffffffffffffffffffffffffffffffffffffffff16610ae56112d5565b73ffffffffffffffffffffffffffffffffffffffff1614610b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3290613cda565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1e906145e8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c979061467a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cef611a64565b73ffffffffffffffffffffffffffffffffffffffff16610d0d6112d5565b73ffffffffffffffffffffffffffffffffffffffff1614610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a90613cda565b60405180910390fd5b610d6d600061206f565b565b6000600d600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df9906146e6565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f6856040518263ffffffff1660e01b8152600401610e5f9190613584565b600060405180830381865afa158015610e7c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610ea591906141ba565b90506000610eb233612135565b84610ebc87611dbe565b604051602001610ece93929190614752565b6040516020818303038152906040529050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ba4f8668361010001513384876040518563ffffffff1660e01b8152600401610f459493929190614263565b602060405180830381865afa158015610f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8691906142cb565b610f8f57600080fd5b6001600c600087815260200190815260200160002054610faf919061478e565b600c600087815260200190815260200160002081905550610fd0600a6122f8565b610fe333610fde600a611a6c565b61230e565b6001600d600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600b6001816001815401808255809150500390600052602060002090600702019050600c60008781526020019081526020016000205481600001819055508581600101819055508381600401908161109391906144a4565b508261010001518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506110ea83610100015161232c565b8160030190816110fa919061481d565b50428160050181905550611117611111600a611a6c565b86611f1e565b505050505050565b6060806000600b6001856111339190613e27565b8154811061114457611143613e5b565b5b906000526020600020906007020190506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f683600101546040518263ffffffff1660e01b81526004016111b59190613584565b600060405180830381865afa1580156111d2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111fb91906141ba565b905060008160e001515103611224576040518060200160405280600081525093505050506112d0565b60005b8160e00151518110156112c857838260e00151828151811061124c5761124b613e5b565b5b6020026020010151846006018460e00151848151811061126f5761126e613e5b565b5b602002602001015160405161128491906148ef565b90815260200160405180910390206040516020016112a493929190614aa9565b604051602081830303815290604052935080806112c090614afb565b915050611227565b508293505050505b919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611307611a64565b73ffffffffffffffffffffffffffffffffffffffff166113256112d5565b73ffffffffffffffffffffffffffffffffffffffff161461137b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137290613cda565b60405180910390fd5b8181600f918261138c929190614b4e565b505050565b611399611a64565b73ffffffffffffffffffffffffffffffffffffffff166113b76112d5565b73ffffffffffffffffffffffffffffffffffffffff161461140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490613cda565b60405180910390fd5b80600e908161141c919061481d565b5050565b60606001805461142f90613bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461145b90613bcb565b80156114a85780601f1061147d576101008083540402835291602001916114a8565b820191906000526020600020905b81548152906001019060200180831161148b57829003601f168201915b5050505050905090565b6040517fa4420a9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060600b6001856114f59190613e27565b8154811061150657611505613e5b565b5b90600052602060002090600702016006018383604051611527929190614c43565b9081526020016040518091039020805461154090613bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461156c90613bcb565b80156115b95780601f1061158e576101008083540402835291602001916115b9565b820191906000526020600020905b81548152906001019060200180831161159c57829003601f168201915b505050505090509392505050565b6115d86115d2611a64565b83611a7a565b611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e90613d6c565b60405180910390fd5b611623848484846124ee565b50505050565b6060611635600a611a6c565b821115611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e90613dd8565b60405180910390fd5b6116808261254a565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b818154811061172b57600080fd5b90600052602060002090600702016000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600301805461178090613bcb565b80601f01602080910402602001604051908101604052809291908181526020018280546117ac90613bcb565b80156117f95780601f106117ce576101008083540402835291602001916117f9565b820191906000526020600020905b8154815290600101906020018083116117dc57829003601f168201915b50505050509080600401805461180e90613bcb565b80601f016020809104026020016040519081016040528092919081815260200182805461183a90613bcb565b80156118875780601f1061185c57610100808354040283529160200191611887565b820191906000526020600020905b81548152906001019060200180831161186a57829003601f168201915b5050505050908060050154905086565b61189f611a64565b73ffffffffffffffffffffffffffffffffffffffff166118bd6112d5565b73ffffffffffffffffffffffffffffffffffffffff1614611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a90613cda565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990614cce565b60405180910390fd5b61198b8161206f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b600081600001549050919050565b6000611a85826119f8565b611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90614d60565b60405180910390fd5b6000611acf83610b7f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b3e57508373ffffffffffffffffffffffffffffffffffffffff16611b268461068e565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b4f5750611b4e8185611687565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b7882610b7f565b73ffffffffffffffffffffffffffffffffffffffff1614611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc590614df2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3490614e84565b60405180910390fd5b611c488383836126ac565b611c53600082612762565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ca39190613e27565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cfa919061478e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611db983838361281b565b505050565b606060008203611e05576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f19565b600082905060005b60008214611e37578080611e2090614afb565b915050600a82611e309190614ed3565b9150611e0d565b60008167ffffffffffffffff811115611e5357611e526135fc565b5b6040519080825280601f01601f191660200182016040528015611e855781602001600182028036833780820191505090505b5090505b60008514611f1257600182611e9e9190613e27565b9150600a85611ead9190614f04565b6030611eb9919061478e565b60f81b818381518110611ecf57611ece613e5b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f0b9190614ed3565b9450611e89565b8093505050505b919050565b60008151111561206b576000611f3382612820565b90506000611f756040518060400160405280600281526020017f3d3d000000000000000000000000000000000000000000000000000000000000815250612820565b90506000611fb76040518060400160405280600281526020017f2626000000000000000000000000000000000000000000000000000000000000815250612820565b90505b611fc38361284e565b612067576000611fe4611fdf848661285e90919063ffffffff16565b612878565b90506000612003611ffe848761285e90919063ffffffff16565b612878565b905080600b6001896120159190613e27565b8154811061202657612025613e5b565b5b90600052602060002090600702016006018360405161204591906148ef565b9081526020016040518091039020908161205f919061481d565b505050611fba565b5050505b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000602867ffffffffffffffff811115612154576121536135fc565b5b6040519080825280601f01601f1916602001820160405280156121865781602001600182028036833780820191505090505b50905060005b60148110156122ee5760008160136121a49190613e27565b60086121b09190614f35565b60026121bc91906150aa565b8573ffffffffffffffffffffffffffffffffffffffff166121dd9190614ed3565b60f81b9050600060108260f81c6121f49190615102565b60f81b905060008160f81c601061220b9190615133565b8360f81c6122199190615170565b60f81b9050612227826128f4565b858560026122359190614f35565b8151811061224657612245613e5b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061227e816128f4565b85600186600261228e9190614f35565b612298919061478e565b815181106122a9576122a8613e5b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050505080806122e690614afb565b91505061218c565b5080915050919050565b6001816000016000828254019250508190555050565b61232882826040518060200160405280600081525061293a565b5050565b6060806000600167ffffffffffffffff81111561234c5761234b6135fc565b5b60405190808252806020026020018201604052801561237a5781602001602082028036833780820191505090505b509050838160008151811061239257612391613e5b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cbf8b66c836040518263ffffffff1660e01b81526004016124299190615263565b600060405180830381865afa158015612446573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061246f9190615285565b905060008160008151811061248757612486613e5b565b5b602002602001015151036124c45761249e85612135565b6040516020016124ae91906152ce565b60405160208183030381529060405292506124e3565b806000815181106124d8576124d7613e5b565b5b602002602001015192505b829350505050919050565b6124f9848484611b58565b61250584848484612995565b612544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253b90615362565b60405180910390fd5b50505050565b60606000600b60018461255d9190613e27565b8154811061256e5761256d613e5b565b5b906000526020600020906007020190506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f683600101546040518263ffffffff1660e01b81526004016125df9190613584565b600060405180830381865afa1580156125fc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061262591906141ba565b90506126846126326105fc565b600f61263d87612b1c565b846020015185606001518660400151886003016126598c61111f565b604051602001612670989796959493929190615784565b604051602081830303815290604052612c4a565b60405160200161269491906158e7565b60405160208183030381529060405292505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806127135750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b612752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274990615955565b60405180910390fd5b61275d838383612dc2565b505050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127d583610b7f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b505050565b612828613282565b600060208301905060405180604001604052808451815260200182815250915050919050565b6000808260000151149050919050565b612866613282565b612871838383612dc7565b5092915050565b60606000826000015167ffffffffffffffff81111561289a576128996135fc565b5b6040519080825280601f01601f1916602001820160405280156128cc5781602001600182028036833780820191505090505b50905060006020820190506128ea8185602001518660000151612e91565b8192505050919050565b6000600a8260f81c60ff16101561291f5760308260f81c6129159190615975565b60f81b9050612935565b60578260f81c61292f9190615975565b60f81b90505b919050565b6129448383612f3d565b6129516000848484612995565b612990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298790615362565b60405180910390fd5b505050565b60006129b68473ffffffffffffffffffffffffffffffffffffffff16613116565b15612b0f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129df611a64565b8786866040518563ffffffff1660e01b8152600401612a0194939291906159aa565b6020604051808303816000875af1925050508015612a3d57506040513d601f19601f82011682018060405250810190612a3a9190615a0b565b60015b612abf573d8060008114612a6d576040519150601f19603f3d011682016040523d82523d6000602084013e612a72565b606091505b506000815103612ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aae90615362565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b14565b600190505b949350505050565b60606000600b600184612b2f9190613e27565b81548110612b4057612b3f613e5b565b5b906000526020600020906007020190506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6c3b1f683600101546040518263ffffffff1660e01b8152600401612bb19190613584565b600060405180830381865afa158015612bce573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612bf791906141ba565b9050600e81608001518260c001518360a00151856003018560000151612c1c8a611dbe565b604051602001612c329796959493929190615c00565b60405160208183030381529060405292505050919050565b60606000825103612c6c57604051806020016040528060008152509050612dbd565b6000604051806060016040528060408152602001615d806040913990506000600360028551612c9b919061478e565b612ca59190614ed3565b6004612cb19190614f35565b90506000602082612cc2919061478e565b67ffffffffffffffff811115612cdb57612cda6135fc565b5b6040519080825280601f01601f191660200182016040528015612d0d5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612d7c576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825360018201915050612d21565b600389510660018114612d965760028114612da657612db1565b613d3d60f01b6002830352612db1565b603d60f81b60018303525b50505050508093505050505b919050565b505050565b612dcf613282565b6000612ded8560000151866020015186600001518760200151613139565b90508460200151836020018181525050846020015181612e0d9190613e27565b83600001818152505084600001518560200151612e2a919061478e565b8103612e40576000856000018181525050612e86565b83600001518360000151612e54919061478e565b85600001818151612e659190613e27565b91508181525050836000015181612e7c919061478e565b8560200181815250505b829150509392505050565b5b60208110612ed05781518352602083612eab919061478e565b9250602082612eba919061478e565b9150602081612ec99190613e27565b9050612e92565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90506000821115612f27576001826020612f0d9190613e27565b610100612f1a91906150aa565b612f249190613e27565b90505b8019835116818551168181178652505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa390615cf3565b60405180910390fd5b612fb5816119f8565b15612ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fec90615d5f565b60405180910390fd5b613001600083836126ac565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613051919061478e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131126000838361281b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000808490506000868511613269576020851161320c576000808611156131925760018660206131699190613e27565b60086131759190614f35565b600261318191906150aa565b61318b9190613e27565b1960001b90505b60008186511690506000878a8a6131a9919061478e565b6131b39190613e27565b905060008386511690505b8281146131fe578186106131e5578a8a6131d8919061478e565b965050505050505061327a565b85806131f090614afb565b9650508386511690506131be565b85965050505050505061327a565b60008585209050600091505b85886132249190613e27565b82116132675760008684209050808203613244578394505050505061327a565b600184613251919061478e565b935050818061325f90614afb565b925050613218565b505b8686613275919061478e565b925050505b949350505050565b604051806040016040528060008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132e5816132b0565b81146132f057600080fd5b50565b600081359050613302816132dc565b92915050565b60006020828403121561331e5761331d6132a6565b5b600061332c848285016132f3565b91505092915050565b60008115159050919050565b61334a81613335565b82525050565b60006020820190506133656000830184613341565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133a557808201518184015260208101905061338a565b60008484015250505050565b6000601f19601f8301169050919050565b60006133cd8261336b565b6133d78185613376565b93506133e7818560208601613387565b6133f0816133b1565b840191505092915050565b6000602082019050818103600083015261341581846133c2565b905092915050565b6000819050919050565b6134308161341d565b811461343b57600080fd5b50565b60008135905061344d81613427565b92915050565b600060208284031215613469576134686132a6565b5b60006134778482850161343e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134ab82613480565b9050919050565b6134bb816134a0565b82525050565b60006020820190506134d660008301846134b2565b92915050565b6134e5816134a0565b81146134f057600080fd5b50565b600081359050613502816134dc565b92915050565b6000806040838503121561351f5761351e6132a6565b5b600061352d858286016134f3565b925050602061353e8582860161343e565b9150509250929050565b60006020828403121561355e5761355d6132a6565b5b600061356c848285016134f3565b91505092915050565b61357e8161341d565b82525050565b60006020820190506135996000830184613575565b92915050565b6000806000606084860312156135b8576135b76132a6565b5b60006135c6868287016134f3565b93505060206135d7868287016134f3565b92505060406135e88682870161343e565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613634826133b1565b810181811067ffffffffffffffff82111715613653576136526135fc565b5b80604052505050565b600061366661329c565b9050613672828261362b565b919050565b600067ffffffffffffffff821115613692576136916135fc565b5b61369b826133b1565b9050602081019050919050565b82818337600083830152505050565b60006136ca6136c584613677565b61365c565b9050828152602081018484840111156136e6576136e56135f7565b5b6136f18482856136a8565b509392505050565b600082601f83011261370e5761370d6135f2565b5b813561371e8482602086016136b7565b91505092915050565b600067ffffffffffffffff821115613742576137416135fc565b5b61374b826133b1565b9050602081019050919050565b600061376b61376684613727565b61365c565b905082815260208101848484011115613787576137866135f7565b5b6137928482856136a8565b509392505050565b600082601f8301126137af576137ae6135f2565b5b81356137bf848260208601613758565b91505092915050565b6000806000606084860312156137e1576137e06132a6565b5b60006137ef8682870161343e565b935050602084013567ffffffffffffffff8111156138105761380f6132ab565b5b61381c868287016136f9565b925050604084013567ffffffffffffffff81111561383d5761383c6132ab565b5b6138498682870161379a565b9150509250925092565b600080fd5b600080fd5b60008083601f840112613873576138726135f2565b5b8235905067ffffffffffffffff8111156138905761388f613853565b5b6020830191508360018202830111156138ac576138ab613858565b5b9250929050565b600080602083850312156138ca576138c96132a6565b5b600083013567ffffffffffffffff8111156138e8576138e76132ab565b5b6138f48582860161385d565b92509250509250929050565b600060208284031215613916576139156132a6565b5b600082013567ffffffffffffffff811115613934576139336132ab565b5b613940848285016136f9565b91505092915050565b61395281613335565b811461395d57600080fd5b50565b60008135905061396f81613949565b92915050565b6000806040838503121561398c5761398b6132a6565b5b600061399a858286016134f3565b92505060206139ab85828601613960565b9150509250929050565b6000806000604084860312156139ce576139cd6132a6565b5b60006139dc8682870161343e565b935050602084013567ffffffffffffffff8111156139fd576139fc6132ab565b5b613a098682870161385d565b92509250509250925092565b60008060008060808587031215613a2f57613a2e6132a6565b5b6000613a3d878288016134f3565b9450506020613a4e878288016134f3565b9350506040613a5f8782880161343e565b925050606085013567ffffffffffffffff811115613a8057613a7f6132ab565b5b613a8c8782880161379a565b91505092959194509250565b60008060408385031215613aaf57613aae6132a6565b5b6000613abd858286016134f3565b9250506020613ace858286016134f3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000613aff82613ad8565b613b098185613ae3565b9350613b19818560208601613387565b613b22816133b1565b840191505092915050565b600060c082019050613b426000830189613575565b613b4f6020830188613575565b613b5c60408301876134b2565b8181036060830152613b6e81866133c2565b90508181036080830152613b828185613af4565b9050613b9160a0830184613575565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613be357607f821691505b602082108103613bf657613bf5613b9c565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c58602c83613376565b9150613c6382613bfc565b604082019050919050565b60006020820190508181036000830152613c8781613c4b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613cc4602083613376565b9150613ccf82613c8e565b602082019050919050565b60006020820190508181036000830152613cf381613cb7565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613d56603183613376565b9150613d6182613cfa565b604082019050919050565b60006020820190508181036000830152613d8581613d49565b9050919050565b7f496e76616c696420696400000000000000000000000000000000000000000000600082015250565b6000613dc2600a83613376565b9150613dcd82613d8c565b602082019050919050565b60006020820190508181036000830152613df181613db5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e328261341d565b9150613e3d8361341d565b9250828203905081811115613e5557613e54613df8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b6000613ea7613ea284613677565b61365c565b905082815260208101848484011115613ec357613ec26135f7565b5b613ece848285613387565b509392505050565b600082601f830112613eeb57613eea6135f2565b5b8151613efb848260208601613e94565b91505092915050565b600067ffffffffffffffff821115613f1f57613f1e6135fc565b5b602082029050602081019050919050565b6000613f43613f3e84613f04565b61365c565b90508083825260208201905060208402830185811115613f6657613f65613858565b5b835b81811015613fad57805167ffffffffffffffff811115613f8b57613f8a6135f2565b5b808601613f988982613ed6565b85526020850194505050602081019050613f68565b5050509392505050565b600082601f830112613fcc57613fcb6135f2565b5b8151613fdc848260208601613f30565b91505092915050565b600081519050613ff4816134dc565b92915050565b6000610120828403121561401157614010613e8a565b5b61401c61012061365c565b9050600082015167ffffffffffffffff81111561403c5761403b613e8f565b5b61404884828501613ed6565b600083015250602082015167ffffffffffffffff81111561406c5761406b613e8f565b5b61407884828501613ed6565b602083015250604082015167ffffffffffffffff81111561409c5761409b613e8f565b5b6140a884828501613ed6565b604083015250606082015167ffffffffffffffff8111156140cc576140cb613e8f565b5b6140d884828501613ed6565b606083015250608082015167ffffffffffffffff8111156140fc576140fb613e8f565b5b61410884828501613ed6565b60808301525060a082015167ffffffffffffffff81111561412c5761412b613e8f565b5b61413884828501613ed6565b60a08301525060c082015167ffffffffffffffff81111561415c5761415b613e8f565b5b61416884828501613ed6565b60c08301525060e082015167ffffffffffffffff81111561418c5761418b613e8f565b5b61419884828501613fb7565b60e0830152506101006141ad84828501613fe5565b6101008301525092915050565b6000602082840312156141d0576141cf6132a6565b5b600082015167ffffffffffffffff8111156141ee576141ed6132ab565b5b6141fa84828501613ffa565b91505092915050565b600081905092915050565b60006142198261336b565b6142238185614203565b9350614233818560208601613387565b80840191505092915050565b600061424b828561420e565b9150614257828461420e565b91508190509392505050565b600060808201905061427860008301876134b2565b61428560208301866134b2565b818103604083015261429781856133c2565b905081810360608301526142ab8184613af4565b905095945050505050565b6000815190506142c581613949565b92915050565b6000602082840312156142e1576142e06132a6565b5b60006142ef848285016142b6565b91505092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261435a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261431d565b614364868361431d565b95508019841693508086168417925050509392505050565b6000819050919050565b60006143a161439c6143978461341d565b61437c565b61341d565b9050919050565b6000819050919050565b6143bb83614386565b6143cf6143c7826143a8565b84845461432a565b825550505050565b600090565b6143e46143d7565b6143ef8184846143b2565b505050565b5b81811015614413576144086000826143dc565b6001810190506143f5565b5050565b601f82111561445857614429816142f8565b6144328461430d565b81016020851015614441578190505b61445561444d8561430d565b8301826143f4565b50505b505050565b600082821c905092915050565b600061447b6000198460080261445d565b1980831691505092915050565b6000614494838361446a565b9150826002028217905092915050565b6144ad82613ad8565b67ffffffffffffffff8111156144c6576144c56135fc565b5b6144d08254613bcb565b6144db828285614417565b600060209050601f83116001811461450e57600084156144fc578287015190505b6145068582614488565b86555061456e565b601f19841661451c866142f8565b60005b828110156145445784890151825560018201915060208501945060208101905061451f565b86831015614561578489015161455d601f89168261446a565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006145d2602983613376565b91506145dd82614576565b604082019050919050565b60006020820190508181036000830152614601816145c5565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614664602a83613376565b915061466f82614608565b604082019050919050565b6000602082019050818103600083015261469381614657565b9050919050565b7f4475706c00000000000000000000000000000000000000000000000000000000600082015250565b60006146d0600483613376565b91506146db8261469a565b602082019050919050565b600060208201905081810360008301526146ff816146c3565b9050919050565b7f3078000000000000000000000000000000000000000000000000000000000000600082015250565b600061473c600283614203565b915061474782614706565b600282019050919050565b600061475d8261472f565b9150614769828661420e565b9150614775828561420e565b9150614781828461420e565b9150819050949350505050565b60006147998261341d565b91506147a48361341d565b92508282019050808211156147bc576147bb613df8565b5b92915050565b60008190508160005260206000209050919050565b601f821115614818576147e9816147c2565b6147f28461430d565b81016020851015614801578190505b61481561480d8561430d565b8301826143f4565b50505b505050565b6148268261336b565b67ffffffffffffffff81111561483f5761483e6135fc565b5b6148498254613bcb565b6148548282856147d7565b600060209050601f8311600181146148875760008415614875578287015190505b61487f8582614488565b8655506148e7565b601f198416614895866147c2565b60005b828110156148bd57848901518255600182019150602085019450602081019050614898565b868310156148da57848901516148d6601f89168261446a565b8355505b6001600288020188555050505b505050505050565b60006148fb828461420e565b915081905092915050565b600081905092915050565b600061491c82613ad8565b6149268185614906565b9350614936818560208601613387565b80840191505092915050565b7f2c7b2274726169745f74797065223a2200000000000000000000000000000000600082015250565b6000614978601083614203565b915061498382614942565b601082019050919050565b7f222c2276616c7565223a22000000000000000000000000000000000000000000600082015250565b60006149c4600b83614203565b91506149cf8261498e565b600b82019050919050565b600081546149e781613bcb565b6149f18186614203565b94506001821660008114614a0c5760018114614a2157614a54565b60ff1983168652811515820286019350614a54565b614a2a856147c2565b60005b83811015614a4c57815481890152600182019150602081019050614a2d565b838801955050505b50505092915050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614a93600283614203565b9150614a9e82614a5d565b600282019050919050565b6000614ab58286614911565b9150614ac08261496b565b9150614acc828561420e565b9150614ad7826149b7565b9150614ae382846149da565b9150614aee82614a86565b9150819050949350505050565b6000614b068261341d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b3857614b37613df8565b5b600182019050919050565b600082905092915050565b614b588383614b43565b67ffffffffffffffff811115614b7157614b706135fc565b5b614b7b8254613bcb565b614b868282856147d7565b6000601f831160018114614bb55760008415614ba3578287013590505b614bad8582614488565b865550614c15565b601f198416614bc3866147c2565b60005b82811015614beb57848901358255600182019150602085019450602081019050614bc6565b86831015614c085784890135614c04601f89168261446a565b8355505b6001600288020188555050505b50505050505050565b6000614c2a8385614203565b9350614c378385846136a8565b82840190509392505050565b6000614c50828486614c1e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614cb8602683613376565b9150614cc382614c5c565b604082019050919050565b60006020820190508181036000830152614ce781614cab565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614d4a602c83613376565b9150614d5582614cee565b604082019050919050565b60006020820190508181036000830152614d7981614d3d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614ddc602583613376565b9150614de782614d80565b604082019050919050565b60006020820190508181036000830152614e0b81614dcf565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614e6e602483613376565b9150614e7982614e12565b604082019050919050565b60006020820190508181036000830152614e9d81614e61565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ede8261341d565b9150614ee98361341d565b925082614ef957614ef8614ea4565b5b828204905092915050565b6000614f0f8261341d565b9150614f1a8361341d565b925082614f2a57614f29614ea4565b5b828206905092915050565b6000614f408261341d565b9150614f4b8361341d565b9250828202614f598161341d565b91508282048414831517614f7057614f6f613df8565b5b5092915050565b60008160011c9050919050565b6000808291508390505b6001851115614fce57808604811115614faa57614fa9613df8565b5b6001851615614fb95780820291505b8081029050614fc785614f77565b9450614f8e565b94509492505050565b600082614fe757600190506150a3565b81614ff557600090506150a3565b816001811461500b576002811461501557615044565b60019150506150a3565b60ff84111561502757615026613df8565b5b8360020a91508482111561503e5761503d613df8565b5b506150a3565b5060208310610133831016604e8410600b84101617156150795782820a90508381111561507457615073613df8565b5b6150a3565b6150868484846001614f84565b9250905081840481111561509d5761509c613df8565b5b81810290505b9392505050565b60006150b58261341d565b91506150c08361341d565b92506150ed7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614fd7565b905092915050565b600060ff82169050919050565b600061510d826150f5565b9150615118836150f5565b92508261512857615127614ea4565b5b828204905092915050565b600061513e826150f5565b9150615149836150f5565b9250828202615157816150f5565b915080821461516957615168613df8565b5b5092915050565b600061517b826150f5565b9150615186836150f5565b9250828203905060ff81111561519f5761519e613df8565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6151da816134a0565b82525050565b60006151ec83836151d1565b60208301905092915050565b6000602082019050919050565b6000615210826151a5565b61521a81856151b0565b9350615225836151c1565b8060005b8381101561525657815161523d88826151e0565b9750615248836151f8565b925050600181019050615229565b5085935050505092915050565b6000602082019050818103600083015261527d8184615205565b905092915050565b60006020828403121561529b5761529a6132a6565b5b600082015167ffffffffffffffff8111156152b9576152b86132ab565b5b6152c584828501613fb7565b91505092915050565b60006152d98261472f565b91506152e5828461420e565b915081905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061534c603283613376565b9150615357826152f0565b604082019050919050565b6000602082019050818103600083015261537b8161533f565b9050919050565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b60006153b8600183614203565b91506153c382615382565b600182019050919050565b7f226e616d65223a22000000000000000000000000000000000000000000000000600082015250565b6000615404600883614203565b915061540f826153ce565b600882019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b6000615450600283614203565b915061545b8261541a565b600282019050919050565b7f226465736372697074696f6e223a220000000000000000000000000000000000600082015250565b600061549c600f83614203565b91506154a782615466565b600f82019050919050565b7f222c22696d616765223a22000000000000000000000000000000000000000000600082015250565b60006154e8600b83614203565b91506154f3826154b2565b600b82019050919050565b7f222c202261747472696275746573223a5b000000000000000000000000000000600082015250565b6000615534601183614203565b915061553f826154fe565b601182019050919050565b7f7b2274726169745f74797065223a20225469746c65222c202276616c7565223a60008201527f2022000000000000000000000000000000000000000000000000000000000000602082015250565b60006155a6602283614203565b91506155b18261554a565b602282019050919050565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b60006155f2600383614203565b91506155fd826155bc565b600382019050919050565b7f7b2274726169745f74797065223a224465736372697074696f6e222c2022766160008201527f6c7565223a220000000000000000000000000000000000000000000000000000602082015250565b6000615664602683614203565b915061566f82615608565b602682019050919050565b7f7b2274726169745f74797065223a225370616365222c202276616c7565223a22600082015250565b60006156b0602083614203565b91506156bb8261567a565b602082019050919050565b7f7b2274726169745f74797065223a225369676e6572222c202276616c7565223a60008201527f2200000000000000000000000000000000000000000000000000000000000000602082015250565b6000615722602183614203565b915061572d826156c6565b602182019050919050565b7f5d7d000000000000000000000000000000000000000000000000000000000000600082015250565b600061576e600283614203565b915061577982615738565b600282019050919050565b600061578f826153ab565b915061579a826153f7565b91506157a6828b61420e565b91506157b182615443565b91506157bc8261548f565b91506157c8828a6149da565b91506157d3826154db565b91506157df828961420e565b91506157ea82615527565b91506157f582615599565b9150615801828861420e565b915061580c826155e5565b915061581782615657565b9150615823828761420e565b915061582e826155e5565b9150615839826156a3565b9150615845828661420e565b9150615850826155e5565b915061585b82615715565b915061586782856149da565b915061587282614a86565b915061587e828461420e565b915061588982615761565b91508190509998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b60006158d1601d83614203565b91506158dc8261589b565b601d82019050919050565b60006158f2826158c4565b91506158fe828461420e565b915081905092915050565b7f53423a204e6f6e7472616e7366657261626c6500000000000000000000000000600082015250565b600061593f601383613376565b915061594a82615909565b602082019050919050565b6000602082019050818103600083015261596e81615932565b9050919050565b6000615980826150f5565b915061598b836150f5565b9250828201905060ff8111156159a4576159a3613df8565b5b92915050565b60006080820190506159bf60008301876134b2565b6159cc60208301866134b2565b6159d96040830185613575565b81810360608301526159eb8184613af4565b905095945050505050565b600081519050615a05816132dc565b92915050565b600060208284031215615a2157615a206132a6565b5b6000615a2f848285016159f6565b91505092915050565b7f3f7469746c653d00000000000000000000000000000000000000000000000000600082015250565b6000615a6e600783614203565b9150615a7982615a38565b600782019050919050565b7f266465736372697074696f6e3d00000000000000000000000000000000000000600082015250565b6000615aba600d83614203565b9150615ac582615a84565b600d82019050919050565b7f2673706163653d00000000000000000000000000000000000000000000000000600082015250565b6000615b06600783614203565b9150615b1182615ad0565b600782019050919050565b7f267369676e65723d000000000000000000000000000000000000000000000000600082015250565b6000615b52600883614203565b9150615b5d82615b1c565b600882019050919050565b7f266665617475726564496d6167654349443d0000000000000000000000000000600082015250565b6000615b9e601283614203565b9150615ba982615b68565b601282019050919050565b7f2669643d00000000000000000000000000000000000000000000000000000000600082015250565b6000615bea600483614203565b9150615bf582615bb4565b600482019050919050565b6000615c0c828a6149da565b9150615c1782615a61565b9150615c23828961420e565b9150615c2e82615aad565b9150615c3a828861420e565b9150615c4582615af9565b9150615c51828761420e565b9150615c5c82615b45565b9150615c6882866149da565b9150615c7382615b91565b9150615c7f828561420e565b9150615c8a82615bdd565b9150615c96828461420e565b915081905098975050505050505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615cdd602083613376565b9150615ce882615ca7565b602082019050919050565b60006020820190508181036000830152615d0c81615cd0565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615d49601c83613376565b9150615d5482615d13565b602082019050919050565b60006020820190508181036000830152615d7881615d3c565b905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220e09edc06651da4c00b85699b22bd541916b5b88e1bbf8012baecfe539d0d345e64736f6c63430008110033

Deployed Bytecode Sourcemap

59144:8795:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24130:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25075:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26634:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67790:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66654:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63727:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27384:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62297:538;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27794:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66763:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24769:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24499:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2635:103;;;:::i;:::-;;60636:1027;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62997:722;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1984:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66994:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66883:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25244:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67566:154;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62843:146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28050:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63832:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27153:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60324:22;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;2893:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24130:305;24232:4;24284:25;24269:40;;;:11;:40;;;;:105;;;;24341:33;24326:48;;;:11;:48;;;;24269:105;:158;;;;24391:36;24415:11;24391:23;:36::i;:::-;24269:158;24249:178;;24130:305;;;:::o;25075:100::-;25129:13;25162:5;25155:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25075:100;:::o;26634:221::-;26710:7;26738:16;26746:7;26738;:16::i;:::-;26730:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26823:15;:24;26839:7;26823:24;;;;;;;;;;;;;;;;;;;;;26816:31;;26634:221;;;:::o;67790:139::-;67910:11;;;;;;;;;;;;;;66654:101;2215:12;:10;:12::i;:::-;2204:23;;:7;:5;:7::i;:::-;:23;;;2196:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66741:5:::1;66718:9;;:29;;;;;;;;;;;;;;;;;;66654:101:::0;:::o;63727:97::-;63771:7;63798:18;:8;:16;:18::i;:::-;63791:25;;63727:97;:::o;27384:339::-;27579:41;27598:12;:10;:12::i;:::-;27612:7;27579:18;:41::i;:::-;27571:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27687:28;27697:4;27703:2;27707:7;27687:9;:28::i;:::-;27384:339;;;:::o;62297:538::-;62399:18;:8;:16;:18::i;:::-;62393:2;:24;;62385:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;62443:19;62465:7;62476:1;62473:2;:4;;;;:::i;:::-;62465:13;;;;;;;;:::i;:::-;;;;;;;;;;;;62443:35;;62490:46;62539:10;;;;;;;;;;;:20;;;62560:5;:15;;;62539:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62490:86;;62587:21;62635:10;62647:20;62664:2;62647:16;:20::i;:::-;62618:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62587:82;;62688:9;;;;;;;;;;;:16;;;62705:9;:15;;;62722:10;62734:7;62743:4;62688:60;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62680:69;;;;;;62778:4;62760:5;:15;;:22;;;;;;:::i;:::-;;62795:32;62812:2;62816:10;62795:16;:32::i;:::-;62374:461;;;62297:538;;;:::o;27794:185::-;27932:39;27949:4;27955:2;27959:7;27932:39;;;;;;;;;;;;:16;:39::i;:::-;27794:185;;;:::o;66763:112::-;2215:12;:10;:12::i;:::-;2204:23;;:7;:5;:7::i;:::-;:23;;;2196:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66861:5:::1;66828:10;;:39;;;;;;;;;;;;;;;;;;66763:112:::0;:::o;24769:239::-;24841:7;24861:13;24877:7;:16;24885:7;24877:16;;;;;;;;;;;;;;;;;;;;;24861:32;;24929:1;24912:19;;:5;:19;;;24904:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24995:5;24988:12;;;24769:239;;;:::o;24499:208::-;24571:7;24616:1;24599:19;;:5;:19;;;24591:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24683:9;:16;24693:5;24683:16;;;;;;;;;;;;;;;;24676:23;;24499:208;;;:::o;2635:103::-;2215:12;:10;:12::i;:::-;2204:23;;:7;:5;:7::i;:::-;:23;;;2196:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2700:30:::1;2727:1;2700:18;:30::i;:::-;2635:103::o:0;60636:1027::-;60765:1;60734:9;:17;60744:6;60734:17;;;;;;;;;;;:29;60752:10;60734:29;;;;;;;;;;;;;;;;:32;60726:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;60786:46;60835:10;;;;;;;;;;;:20;;;60856:6;60835:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60786:77;;60874:21;60927:42;60958:10;60927:30;:42::i;:::-;60971:10;60983:24;61000:6;60983:16;:24::i;:::-;60905:103;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60874:135;;61028:9;;;;;;;;;;;:16;;;61045:9;:15;;;61062:10;61074:7;61083:4;61028:60;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61020:69;;;;;;61154:1;61127:16;:24;61144:6;61127:24;;;;;;;;;;;;:28;;;;:::i;:::-;61100:16;:24;61117:6;61100:24;;;;;;;;;;;:55;;;;61167:20;:8;:18;:20::i;:::-;61198:41;61208:10;61220:18;:8;:16;:18::i;:::-;61198:9;:41::i;:::-;61282:1;61250:9;:17;61260:6;61250:17;;;;;;;;;;;:29;61268:10;61250:29;;;;;;;;;;;;;;;:33;;;;61294:19;61316:7;:14;;;;;;;;;;;;;;;;;;;;;;;;61294:36;;61352:16;:24;61369:6;61352:24;;;;;;;;;;;;61341:5;:8;;:35;;;;61405:6;61387:5;:15;;:24;;;;61440:4;61422:5;:15;;:22;;;;;;:::i;:::-;;61470:9;:15;;;61455:5;:12;;;:30;;;;;;;;;;;;;;;;;;61515:27;61526:9;:15;;;61515:10;:27::i;:::-;61496:5;:16;;:46;;;;;;:::i;:::-;;61571:15;61553:5;:15;;:33;;;;61607:48;61624:18;:8;:16;:18::i;:::-;61644:10;61607:16;:48::i;:::-;60715:948;;;60636:1027;;;:::o;62997:722::-;63054:13;63079:17;63107:19;63129:7;63140:1;63137:2;:4;;;;:::i;:::-;63129:13;;;;;;;;:::i;:::-;;;;;;;;;;;;63107:35;;63153:46;63202:10;;;;;;;;;;;:20;;;63223:5;:15;;;63202:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63153:86;;63278:1;63253:9;:16;;;:23;:26;63250:66;;63295:9;;;;;;;;;;;;;;;;;;;63250:66;63331:6;63326:356;63343:9;:16;;;:23;63341:1;:25;63326:356;;;63440:4;63508:9;:16;;;63525:1;63508:19;;;;;;;;:::i;:::-;;;;;;;;63586:5;:16;;63603:9;:16;;;63620:1;63603:19;;;;;;;;:::i;:::-;;;;;;;;63586:37;;;;;;:::i;:::-;;;;;;;;;;;;;63401:268;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63388:282;;63368:3;;;;;:::i;:::-;;;;63326:356;;;;63706:4;63692:19;;;;;62997:722;;;;:::o;1984:87::-;2030:7;2057:6;;;;;;;;;;;2050:13;;1984:87;:::o;66994:115::-;2215:12;:10;:12::i;:::-;2204:23;;:7;:5;:7::i;:::-;:23;;;2196:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67089:12:::1;;67075:11;:26;;;;;;;:::i;:::-;;66994:115:::0;;:::o;66883:103::-;2215:12;:10;:12::i;:::-;2204:23;;:7;:5;:7::i;:::-;:23;;;2196:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66974:4:::1;66957:14;:21;;;;;;:::i;:::-;;66883:103:::0;:::o;25244:104::-;25300:13;25333:7;25326:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25244:104;:::o;67566:154::-;67701:11;;;;;;;;;;;;;;62843:146;62918:13;62950:7;62961:1;62958:2;:4;;;;:::i;:::-;62950:13;;;;;;;;:::i;:::-;;;;;;;;;;;;:24;;62975:5;;62950:31;;;;;;;:::i;:::-;;;;;;;;;;;;;62943:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62843:146;;;;;:::o;28050:328::-;28225:41;28244:12;:10;:12::i;:::-;28258:7;28225:18;:41::i;:::-;28217:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28331:39;28345:4;28351:2;28355:7;28364:5;28331:13;:39::i;:::-;28050:328;;;;:::o;63832:179::-;63892:13;63931:18;:8;:16;:18::i;:::-;63925:2;:24;;63917:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;63982:21;64000:2;63982:17;:21::i;:::-;63975:28;;63832:179;;;:::o;27153:164::-;27250:4;27274:18;:25;27293:5;27274:25;;;;;;;;;;;;;;;:35;27300:8;27274:35;;;;;;;;;;;;;;;;;;;;;;;;;27267:42;;27153:164;;;;:::o;60324:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2893:201::-;2215:12;:10;:12::i;:::-;2204:23;;:7;:5;:7::i;:::-;:23;;;2196:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3002:1:::1;2982:22;;:8;:22;;::::0;2974:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3058:28;3077:8;3058:18;:28::i;:::-;2893:201:::0;:::o;22561:157::-;22646:4;22685:25;22670:40;;;:11;:40;;;;22663:47;;22561:157;;;:::o;29888:127::-;29953:4;30005:1;29977:30;;:7;:16;29985:7;29977:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29970:37;;29888:127;;;:::o;710:98::-;763:7;790:10;783:17;;710:98;:::o;38116:114::-;38181:7;38208;:14;;;38201:21;;38116:114;;;:::o;30182:348::-;30275:4;30300:16;30308:7;30300;:16::i;:::-;30292:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30376:13;30392:23;30407:7;30392:14;:23::i;:::-;30376:39;;30445:5;30434:16;;:7;:16;;;:51;;;;30478:7;30454:31;;:20;30466:7;30454:11;:20::i;:::-;:31;;;30434:51;:87;;;;30489:32;30506:5;30513:7;30489:16;:32::i;:::-;30434:87;30426:96;;;30182:348;;;;:::o;33291:625::-;33450:4;33423:31;;:23;33438:7;33423:14;:23::i;:::-;:31;;;33415:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;33529:1;33515:16;;:2;:16;;;33507:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33585:39;33606:4;33612:2;33616:7;33585:20;:39::i;:::-;33689:29;33706:1;33710:7;33689:8;:29::i;:::-;33750:1;33731:9;:15;33741:4;33731:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33779:1;33762:9;:13;33772:2;33762:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33810:2;33791:7;:16;33799:7;33791:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33849:7;33845:2;33830:27;;33839:4;33830:27;;;;;;;;;;;;33870:38;33890:4;33896:2;33900:7;33870:19;:38::i;:::-;33291:625;;;:::o;19939:723::-;19995:13;20225:1;20216:5;:10;20212:53;;20243:10;;;;;;;;;;;;;;;;;;;;;20212:53;20275:12;20290:5;20275:20;;20306:14;20331:78;20346:1;20338:4;:9;20331:78;;20364:8;;;;;:::i;:::-;;;;20395:2;20387:10;;;;;:::i;:::-;;;20331:78;;;20419:19;20451:6;20441:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20419:39;;20469:154;20485:1;20476:5;:10;20469:154;;20513:1;20503:11;;;;;:::i;:::-;;;20580:2;20572:5;:10;;;;:::i;:::-;20559:2;:24;;;;:::i;:::-;20546:39;;20529:6;20536;20529:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;20609:2;20600:11;;;;;:::i;:::-;;;20469:154;;;20647:6;20633:21;;;;;19939:723;;;;:::o;61671:618::-;61830:1;61811:10;61805:24;:26;61802:480;;;61847:22;61872:20;:10;:18;:20::i;:::-;61847:45;;61907:26;61936:14;:12;;;;;;;;;;;;;;;;;;:14::i;:::-;61907:43;;61965:27;61995:14;:12;;;;;;;;;;;;;;;;;;:14::i;:::-;61965:44;;62030:238;62037:9;:1;:7;:9::i;:::-;62030:238;;62066:22;62091:25;:14;62099:5;62091:1;:7;;:14;;;;:::i;:::-;:23;:25::i;:::-;62066:50;;62135:22;62160:26;:15;62168:6;62160:1;:7;;:15;;;;:::i;:::-;:24;:26::i;:::-;62135:51;;62244:8;62205:7;62218:1;62213:2;:6;;;;:::i;:::-;62205:15;;;;;;;;:::i;:::-;;;;;;;;;;;;:26;;62232:8;62205:36;;;;;;:::i;:::-;;;;;;;;;;;;;:47;;;;;;:::i;:::-;;62047:221;;62030:238;;;61832:450;;;61802:480;61671:618;;:::o;3254:191::-;3328:16;3347:6;;;;;;;;;;;3328:25;;3373:8;3364:6;;:17;;;;;;;;;;;;;;;;;;3428:8;3397:40;;3418:8;3397:40;;;;;;;;;;;;3317:128;3254:191;:::o;41693:465::-;41750:13;41776:14;41803:2;41793:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41776:30;;41822:9;41817:307;41841:2;41837:1;:6;41817:307;;;41865:8;41926:1;41921:2;:6;;;;:::i;:::-;41916:1;:12;;;;:::i;:::-;41912:1;:17;;;;:::i;:::-;41905:1;41889:19;;:41;;;;:::i;:::-;41876:56;;41865:67;;41947:9;41977:2;41972:1;41966:8;;:13;;;;:::i;:::-;41959:21;;41947:33;;41995:9;42036:2;42030:9;;42025:2;:14;;;;:::i;:::-;42020:1;42014:8;;:25;;;;:::i;:::-;42007:33;;41995:45;;42066:8;42071:2;42066:4;:8::i;:::-;42055:1;42061;42057;:5;;;;:::i;:::-;42055:8;;;;;;;;:::i;:::-;;;;;:19;;;;;;;;;;;42104:8;42109:2;42104:4;:8::i;:::-;42089:1;42099;42095;42091;:5;;;;:::i;:::-;:9;;;;:::i;:::-;42089:12;;;;;;;;:::i;:::-;;;;;:23;;;;;;;;;;;41850:274;;;41845:3;;;;;:::i;:::-;;;;41817:307;;;;42148:1;42134:16;;;41693:465;;;:::o;38238:127::-;38345:1;38327:7;:14;;;:19;;;;;;;;;;;38238:127;:::o;30872:110::-;30948:26;30958:2;30962:7;30948:26;;;;;;;;;;;;:9;:26::i;:::-;30872:110;;:::o;59577:464::-;59633:13;59659:22;59692:18;59727:1;59713:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59692:37;;59747:4;59740:1;59742;59740:4;;;;;;;;:::i;:::-;;;;;;;:11;;;;;;;;;;;59762:23;59788:3;;;;;;;;;;;:12;;;59801:1;59788:15;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59762:41;;59846:1;59824:7;59832:1;59824:10;;;;;;;;:::i;:::-;;;;;;;;59818:24;:29;59814:194;;59904:36;59935:4;59904:30;:36::i;:::-;59882:59;;;;;;;;:::i;:::-;;;;;;;;;;;;;59864:78;;59814:194;;;59986:7;59994:1;59986:10;;;;;;;;:::i;:::-;;;;;;;;59975:21;;59814:194;60025:8;60018:15;;;;;59577:464;;;:::o;29260:315::-;29417:28;29427:4;29433:2;29437:7;29417:9;:28::i;:::-;29464:48;29487:4;29493:2;29497:7;29506:5;29464:22;:48::i;:::-;29456:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29260:315;;;;:::o;64843:1803::-;64904:13;64930:19;64952:7;64963:1;64960:2;:4;;;;:::i;:::-;64952:13;;;;;;;;:::i;:::-;;;;;;;;;;;;64930:35;;64976:46;65025:10;;;;;;;;;;;:20;;;65046:5;:15;;;65025:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64976:86;;65270:1334;65480:6;:4;:6::i;:::-;65612:11;65706:17;65720:2;65706:13;:17::i;:::-;65883:9;:15;;;66048:9;:21;;;66213:9;:15;;;66373:5;:16;;66463:21;66481:2;66463:17;:21::i;:::-;65346:1208;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65270:13;:1334::i;:::-;65177:1446;;;;;;;;:::i;:::-;;;;;;;;;;;;;65145:1493;;;;64843:1803;;;:::o;67181:315::-;67363:1;67347:18;;:4;:18;;;:38;;;;67383:1;67369:16;;:2;:16;;;67347:38;67325:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;67443:45;67470:4;67476:2;67480:7;67443:26;:45::i;:::-;67181:315;;;:::o;34034:174::-;34136:2;34109:15;:24;34125:7;34109:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34192:7;34188:2;34154:46;;34163:23;34178:7;34163:14;:23::i;:::-;34154:46;;;;;;;;;;;;34034:174;;:::o;37112:125::-;;;;:::o;45170:216::-;45230:12;;:::i;:::-;45255:8;45315:4;45309;45305:15;45298:22;;45348:30;;;;;;;;45360:4;45354:18;45348:30;;;;45374:3;45348:30;;;45341:37;;;45170:216;;;:::o;49209:103::-;49266:4;49303:1;49290:4;:9;;;:14;49283:21;;49209:103;;;:::o;56523:143::-;56601:18;;:::i;:::-;56632:26;56638:4;56644:6;56652:5;56632;:26::i;:::-;;56523:143;;;;:::o;47623:272::-;47683:13;47709:17;47740:4;:9;;;47729:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47709:41;;47761:11;47813:2;47808:3;47804:12;47794:22;;47830:36;47837:6;47845:4;:9;;;47856:4;:9;;;47830:6;:36::i;:::-;47884:3;47877:10;;;;47623:272;;;:::o;41514:171::-;41561:8;41597:2;41592:1;41586:8;;:13;;;41582:95;;;41626:4;41621:1;41615:8;;:15;;;;:::i;:::-;41608:23;;41601:30;;;;41582:95;41672:4;41667:1;41661:8;;:15;;;;:::i;:::-;41654:23;;41647:30;;41514:171;;;;:::o;31209:321::-;31339:18;31345:2;31349:7;31339:5;:18::i;:::-;31390:54;31421:1;31425:2;31429:7;31438:5;31390:22;:54::i;:::-;31368:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31209:321;;;:::o;35230:799::-;35385:4;35406:15;:2;:13;;;:15::i;:::-;35402:620;;;35458:2;35442:36;;;35479:12;:10;:12::i;:::-;35493:4;35499:7;35508:5;35442:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35438:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35701:1;35684:6;:13;:18;35680:272;;35727:60;;;;;;;;;;:::i;:::-;;;;;;;;35680:272;35902:6;35896:13;35887:6;35883:2;35879:15;35872:38;35438:529;35575:41;;;35565:51;;;:6;:51;;;;35558:58;;;;;35402:620;36006:4;35999:11;;35230:799;;;;;;;:::o;64019:812::-;64076:13;64102:19;64124:7;64135:1;64132:2;:4;;;;:::i;:::-;64124:13;;;;;;;;:::i;:::-;;;;;;;;;;;;64102:35;;64158:46;64207:10;;;;;;;;;;;:20;;;64228:5;:15;;;64207:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64158:86;;64376:14;64437:9;:22;;;64512:9;:28;;;64587:9;:22;;;64657:5;:16;;64731:9;:26;;;64801:20;64818:2;64801:16;:20::i;:::-;64341:481;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64327:496;;;;64019:812;;;:::o;39496:1912::-;39554:13;39599:1;39584:4;:11;:16;39580:31;;39602:9;;;;;;;;;;;;;;;;39580:31;39663:19;39685:12;;;;;;;;;;;;;;;;;39663:34;;39749:18;39795:1;39790;39776:4;:11;:15;;;;:::i;:::-;39775:21;;;;:::i;:::-;39770:1;:27;;;;:::i;:::-;39749:48;;39880:20;39927:2;39914:10;:15;;;;:::i;:::-;39903:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39880:50;;40027:10;40019:6;40012:26;40122:1;40115:5;40111:13;40181:4;40232;40226:11;40217:7;40213:25;40328:2;40320:6;40316:15;40401:754;40420:6;40411:7;40408:19;40401:754;;;40520:1;40511:7;40507:15;40496:26;;40559:7;40553:14;40685:4;40677:5;40673:2;40669:14;40665:25;40655:8;40651:40;40645:47;40634:9;40626:67;40739:1;40728:9;40724:17;40711:30;;40818:4;40810:5;40806:2;40802:14;40798:25;40788:8;40784:40;40778:47;40767:9;40759:67;40872:1;40861:9;40857:17;40844:30;;40951:4;40943:5;40940:1;40935:14;40931:25;40921:8;40917:40;40911:47;40900:9;40892:67;41005:1;40994:9;40990:17;40977:30;;41084:4;41076:5;41064:25;41054:8;41050:40;41044:47;41033:9;41025:67;41138:1;41127:9;41123:17;41110:30;;40444:711;40401:754;;;41228:1;41221:4;41215:11;41211:19;41249:1;41244:54;;;;41317:1;41312:52;;;;41204:160;;41244:54;41288:6;41283:3;41279:16;41275:1;41264:9;41260:17;41253:43;41244:54;;41312:52;41356:4;41351:3;41347:14;41343:1;41332:9;41328:17;41321:41;41204:160;;39952:1423;;;;41394:6;41387:13;;;;;39496:1912;;;;:::o;36601:126::-;;;;:::o;55525:516::-;55623:12;;:::i;:::-;55648:8;55659:55;55667:4;:9;;;55678:4;:9;;;55689:6;:11;;;55702:6;:11;;;55659:7;:55::i;:::-;55648:66;;55738:4;:9;;;55725:5;:10;;:22;;;;;55777:4;:9;;;55771:3;:15;;;;:::i;:::-;55758:5;:10;;:28;;;;;55820:4;:9;;;55808:4;:9;;;:21;;;;:::i;:::-;55801:3;:28;55797:214;;55884:1;55872:4;:9;;:13;;;;;55797:214;;;55944:6;:11;;;55931:5;:10;;;:24;;;;:::i;:::-;55918:4;:9;;:37;;;;;;;:::i;:::-;;;;;;;;55988:6;:11;;;55982:3;:17;;;;:::i;:::-;55970:4;:9;;:29;;;;;55797:214;56028:5;56021:12;;;55525:516;;;;;:::o;44327:636::-;44449:170;44462:2;44455:3;:9;44449:170;;44539:3;44533:10;44527:4;44520:24;44581:2;44573:10;;;;;:::i;:::-;;;44605:2;44598:9;;;;;:::i;:::-;;;44473:2;44466:9;;;;;:::i;:::-;;;44449:170;;;44664:9;44676:14;44664:26;;44711:1;44705:3;:7;44701:68;;;44756:1;44749:3;44744:2;:8;;;;:::i;:::-;44736:3;:17;;;;:::i;:::-;:21;;;;:::i;:::-;44729:28;;44701:68;44838:4;44834:9;44828:3;44822:10;44818:26;44891:4;44884;44878:11;44874:22;44936:7;44926:8;44923:21;44917:4;44910:35;44788:168;;;44327:636;;;:::o;31866:439::-;31960:1;31946:16;;:2;:16;;;31938:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32019:16;32027:7;32019;:16::i;:::-;32018:17;32010:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32081:45;32110:1;32114:2;32118:7;32081:20;:45::i;:::-;32156:1;32139:9;:13;32149:2;32139:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32187:2;32168:7;:16;32176:7;32168:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32232:7;32228:2;32207:33;;32224:1;32207:33;;;;;;;;;;;;32253:44;32281:1;32285:2;32289:7;32253:19;:44::i;:::-;31866:439;;:::o;12304:326::-;12364:4;12621:1;12599:7;:19;;;:23;12592:30;;12304:326;;;:::o;52905:1493::-;53004:4;53021:8;53032:7;53021:18;;53050:8;53088:7;53075:9;:20;53071:1285;;53129:2;53116:9;:15;53112:1233;;53152:12;53199:1;53187:9;:13;53183:112;;;53272:1;53258:9;53253:2;:14;;;;:::i;:::-;53248:1;:20;;;;:::i;:::-;53242:1;:27;;;;:::i;:::-;:31;;;;:::i;:::-;53240:34;53232:43;;53225:50;;53183:112;53315:18;53399:4;53387:9;53381:16;53377:27;53363:41;;53426:8;53457:9;53447:7;53437;:17;;;;:::i;:::-;:29;;;;:::i;:::-;53426:40;;53485:15;53557:4;53551:3;53545:10;53541:21;53530:32;;53584:233;53602:10;53591:7;:21;53584:233;;53648:3;53641;:10;53637:65;;53695:7;53685;:17;;;;:::i;:::-;53678:24;;;;;;;;;;53637:65;53725:5;;;;;:::i;:::-;;;;53791:4;53785:3;53779:10;53775:21;53764:32;;53584:233;;;53842:3;53835:10;;;;;;;;;;53112:1233;53936:12;54007:9;53996;53986:31;53978:39;;54050:1;54044:7;;54039:291;54070:9;54060:7;:19;;;;:::i;:::-;54053:3;:26;54039:291;;54111:16;54188:9;54183:3;54173:25;54161:37;;54234:8;54226:4;:16;54222:57;;54276:3;54269:10;;;;;;;;54222:57;54309:1;54302:8;;;;;:::i;:::-;;;54088:242;54081:5;;;;;:::i;:::-;;;;54039:291;;;53867:478;53071:1285;54383:7;54373;:17;;;;:::i;:::-;54366:24;;;;52905:1493;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:329::-;4949:6;4998:2;4986:9;4977:7;4973:23;4969:32;4966:119;;;5004:79;;:::i;:::-;4966:119;5124:1;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5095:117;4890:329;;;;:::o;5225:118::-;5312:24;5330:5;5312:24;:::i;:::-;5307:3;5300:37;5225:118;;:::o;5349:222::-;5442:4;5480:2;5469:9;5465:18;5457:26;;5493:71;5561:1;5550:9;5546:17;5537:6;5493:71;:::i;:::-;5349:222;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:308::-;7118:4;7208:18;7200:6;7197:30;7194:56;;;7230:18;;:::i;:::-;7194:56;7268:29;7290:6;7268:29;:::i;:::-;7260:37;;7352:4;7346;7342:15;7334:23;;7056:308;;;:::o;7370:146::-;7467:6;7462:3;7457;7444:30;7508:1;7499:6;7494:3;7490:16;7483:27;7370:146;;;:::o;7522:425::-;7600:5;7625:66;7641:49;7683:6;7641:49;:::i;:::-;7625:66;:::i;:::-;7616:75;;7714:6;7707:5;7700:21;7752:4;7745:5;7741:16;7790:3;7781:6;7776:3;7772:16;7769:25;7766:112;;;7797:79;;:::i;:::-;7766:112;7887:54;7934:6;7929:3;7924;7887:54;:::i;:::-;7606:341;7522:425;;;;;:::o;7967:340::-;8023:5;8072:3;8065:4;8057:6;8053:17;8049:27;8039:122;;8080:79;;:::i;:::-;8039:122;8197:6;8184:20;8222:79;8297:3;8289:6;8282:4;8274:6;8270:17;8222:79;:::i;:::-;8213:88;;8029:278;7967:340;;;;:::o;8313:307::-;8374:4;8464:18;8456:6;8453:30;8450:56;;;8486:18;;:::i;:::-;8450:56;8524:29;8546:6;8524:29;:::i;:::-;8516:37;;8608:4;8602;8598:15;8590:23;;8313:307;;;:::o;8626:423::-;8703:5;8728:65;8744:48;8785:6;8744:48;:::i;:::-;8728:65;:::i;:::-;8719:74;;8816:6;8809:5;8802:21;8854:4;8847:5;8843:16;8892:3;8883:6;8878:3;8874:16;8871:25;8868:112;;;8899:79;;:::i;:::-;8868:112;8989:54;9036:6;9031:3;9026;8989:54;:::i;:::-;8709:340;8626:423;;;;;:::o;9068:338::-;9123:5;9172:3;9165:4;9157:6;9153:17;9149:27;9139:122;;9180:79;;:::i;:::-;9139:122;9297:6;9284:20;9322:78;9396:3;9388:6;9381:4;9373:6;9369:17;9322:78;:::i;:::-;9313:87;;9129:277;9068:338;;;;:::o;9412:977::-;9508:6;9516;9524;9573:2;9561:9;9552:7;9548:23;9544:32;9541:119;;;9579:79;;:::i;:::-;9541:119;9699:1;9724:53;9769:7;9760:6;9749:9;9745:22;9724:53;:::i;:::-;9714:63;;9670:117;9854:2;9843:9;9839:18;9826:32;9885:18;9877:6;9874:30;9871:117;;;9907:79;;:::i;:::-;9871:117;10012:63;10067:7;10058:6;10047:9;10043:22;10012:63;:::i;:::-;10002:73;;9797:288;10152:2;10141:9;10137:18;10124:32;10183:18;10175:6;10172:30;10169:117;;;10205:79;;:::i;:::-;10169:117;10310:62;10364:7;10355:6;10344:9;10340:22;10310:62;:::i;:::-;10300:72;;10095:287;9412:977;;;;;:::o;10395:117::-;10504:1;10501;10494:12;10518:117;10627:1;10624;10617:12;10655:553;10713:8;10723:6;10773:3;10766:4;10758:6;10754:17;10750:27;10740:122;;10781:79;;:::i;:::-;10740:122;10894:6;10881:20;10871:30;;10924:18;10916:6;10913:30;10910:117;;;10946:79;;:::i;:::-;10910:117;11060:4;11052:6;11048:17;11036:29;;11114:3;11106:4;11098:6;11094:17;11084:8;11080:32;11077:41;11074:128;;;11121:79;;:::i;:::-;11074:128;10655:553;;;;;:::o;11214:529::-;11285:6;11293;11342:2;11330:9;11321:7;11317:23;11313:32;11310:119;;;11348:79;;:::i;:::-;11310:119;11496:1;11485:9;11481:17;11468:31;11526:18;11518:6;11515:30;11512:117;;;11548:79;;:::i;:::-;11512:117;11661:65;11718:7;11709:6;11698:9;11694:22;11661:65;:::i;:::-;11643:83;;;;11439:297;11214:529;;;;;:::o;11749:509::-;11818:6;11867:2;11855:9;11846:7;11842:23;11838:32;11835:119;;;11873:79;;:::i;:::-;11835:119;12021:1;12010:9;12006:17;11993:31;12051:18;12043:6;12040:30;12037:117;;;12073:79;;:::i;:::-;12037:117;12178:63;12233:7;12224:6;12213:9;12209:22;12178:63;:::i;:::-;12168:73;;11964:287;11749:509;;;;:::o;12264:116::-;12334:21;12349:5;12334:21;:::i;:::-;12327:5;12324:32;12314:60;;12370:1;12367;12360:12;12314:60;12264:116;:::o;12386:133::-;12429:5;12467:6;12454:20;12445:29;;12483:30;12507:5;12483:30;:::i;:::-;12386:133;;;;:::o;12525:468::-;12590:6;12598;12647:2;12635:9;12626:7;12622:23;12618:32;12615:119;;;12653:79;;:::i;:::-;12615:119;12773:1;12798:53;12843:7;12834:6;12823:9;12819:22;12798:53;:::i;:::-;12788:63;;12744:117;12900:2;12926:50;12968:7;12959:6;12948:9;12944:22;12926:50;:::i;:::-;12916:60;;12871:115;12525:468;;;;;:::o;12999:674::-;13079:6;13087;13095;13144:2;13132:9;13123:7;13119:23;13115:32;13112:119;;;13150:79;;:::i;:::-;13112:119;13270:1;13295:53;13340:7;13331:6;13320:9;13316:22;13295:53;:::i;:::-;13285:63;;13241:117;13425:2;13414:9;13410:18;13397:32;13456:18;13448:6;13445:30;13442:117;;;13478:79;;:::i;:::-;13442:117;13591:65;13648:7;13639:6;13628:9;13624:22;13591:65;:::i;:::-;13573:83;;;;13368:298;12999:674;;;;;:::o;13679:943::-;13774:6;13782;13790;13798;13847:3;13835:9;13826:7;13822:23;13818:33;13815:120;;;13854:79;;:::i;:::-;13815:120;13974:1;13999:53;14044:7;14035:6;14024:9;14020:22;13999:53;:::i;:::-;13989:63;;13945:117;14101:2;14127:53;14172:7;14163:6;14152:9;14148:22;14127:53;:::i;:::-;14117:63;;14072:118;14229:2;14255:53;14300:7;14291:6;14280:9;14276:22;14255:53;:::i;:::-;14245:63;;14200:118;14385:2;14374:9;14370:18;14357:32;14416:18;14408:6;14405:30;14402:117;;;14438:79;;:::i;:::-;14402:117;14543:62;14597:7;14588:6;14577:9;14573:22;14543:62;:::i;:::-;14533:72;;14328:287;13679:943;;;;;;;:::o;14628:474::-;14696:6;14704;14753:2;14741:9;14732:7;14728:23;14724:32;14721:119;;;14759:79;;:::i;:::-;14721:119;14879:1;14904:53;14949:7;14940:6;14929:9;14925:22;14904:53;:::i;:::-;14894:63;;14850:117;15006:2;15032:53;15077:7;15068:6;15057:9;15053:22;15032:53;:::i;:::-;15022:63;;14977:118;14628:474;;;;;:::o;15108:98::-;15159:6;15193:5;15187:12;15177:22;;15108:98;;;:::o;15212:168::-;15295:11;15329:6;15324:3;15317:19;15369:4;15364:3;15360:14;15345:29;;15212:168;;;;:::o;15386:373::-;15472:3;15500:38;15532:5;15500:38;:::i;:::-;15554:70;15617:6;15612:3;15554:70;:::i;:::-;15547:77;;15633:65;15691:6;15686:3;15679:4;15672:5;15668:16;15633:65;:::i;:::-;15723:29;15745:6;15723:29;:::i;:::-;15718:3;15714:39;15707:46;;15476:283;15386:373;;;;:::o;15765:953::-;16036:4;16074:3;16063:9;16059:19;16051:27;;16088:71;16156:1;16145:9;16141:17;16132:6;16088:71;:::i;:::-;16169:72;16237:2;16226:9;16222:18;16213:6;16169:72;:::i;:::-;16251;16319:2;16308:9;16304:18;16295:6;16251:72;:::i;:::-;16370:9;16364:4;16360:20;16355:2;16344:9;16340:18;16333:48;16398:78;16471:4;16462:6;16398:78;:::i;:::-;16390:86;;16524:9;16518:4;16514:20;16508:3;16497:9;16493:19;16486:49;16552:76;16623:4;16614:6;16552:76;:::i;:::-;16544:84;;16638:73;16706:3;16695:9;16691:19;16682:6;16638:73;:::i;:::-;15765:953;;;;;;;;;:::o;16724:180::-;16772:77;16769:1;16762:88;16869:4;16866:1;16859:15;16893:4;16890:1;16883:15;16910:320;16954:6;16991:1;16985:4;16981:12;16971:22;;17038:1;17032:4;17028:12;17059:18;17049:81;;17115:4;17107:6;17103:17;17093:27;;17049:81;17177:2;17169:6;17166:14;17146:18;17143:38;17140:84;;17196:18;;:::i;:::-;17140:84;16961:269;16910:320;;;:::o;17236:231::-;17376:34;17372:1;17364:6;17360:14;17353:58;17445:14;17440:2;17432:6;17428:15;17421:39;17236:231;:::o;17473:366::-;17615:3;17636:67;17700:2;17695:3;17636:67;:::i;:::-;17629:74;;17712:93;17801:3;17712:93;:::i;:::-;17830:2;17825:3;17821:12;17814:19;;17473:366;;;:::o;17845:419::-;18011:4;18049:2;18038:9;18034:18;18026:26;;18098:9;18092:4;18088:20;18084:1;18073:9;18069:17;18062:47;18126:131;18252:4;18126:131;:::i;:::-;18118:139;;17845:419;;;:::o;18270:182::-;18410:34;18406:1;18398:6;18394:14;18387:58;18270:182;:::o;18458:366::-;18600:3;18621:67;18685:2;18680:3;18621:67;:::i;:::-;18614:74;;18697:93;18786:3;18697:93;:::i;:::-;18815:2;18810:3;18806:12;18799:19;;18458:366;;;:::o;18830:419::-;18996:4;19034:2;19023:9;19019:18;19011:26;;19083:9;19077:4;19073:20;19069:1;19058:9;19054:17;19047:47;19111:131;19237:4;19111:131;:::i;:::-;19103:139;;18830:419;;;:::o;19255:236::-;19395:34;19391:1;19383:6;19379:14;19372:58;19464:19;19459:2;19451:6;19447:15;19440:44;19255:236;:::o;19497:366::-;19639:3;19660:67;19724:2;19719:3;19660:67;:::i;:::-;19653:74;;19736:93;19825:3;19736:93;:::i;:::-;19854:2;19849:3;19845:12;19838:19;;19497:366;;;:::o;19869:419::-;20035:4;20073:2;20062:9;20058:18;20050:26;;20122:9;20116:4;20112:20;20108:1;20097:9;20093:17;20086:47;20150:131;20276:4;20150:131;:::i;:::-;20142:139;;19869:419;;;:::o;20294:160::-;20434:12;20430:1;20422:6;20418:14;20411:36;20294:160;:::o;20460:366::-;20602:3;20623:67;20687:2;20682:3;20623:67;:::i;:::-;20616:74;;20699:93;20788:3;20699:93;:::i;:::-;20817:2;20812:3;20808:12;20801:19;;20460:366;;;:::o;20832:419::-;20998:4;21036:2;21025:9;21021:18;21013:26;;21085:9;21079:4;21075:20;21071:1;21060:9;21056:17;21049:47;21113:131;21239:4;21113:131;:::i;:::-;21105:139;;20832:419;;;:::o;21257:180::-;21305:77;21302:1;21295:88;21402:4;21399:1;21392:15;21426:4;21423:1;21416:15;21443:194;21483:4;21503:20;21521:1;21503:20;:::i;:::-;21498:25;;21537:20;21555:1;21537:20;:::i;:::-;21532:25;;21581:1;21578;21574:9;21566:17;;21605:1;21599:4;21596:11;21593:37;;;21610:18;;:::i;:::-;21593:37;21443:194;;;;:::o;21643:180::-;21691:77;21688:1;21681:88;21788:4;21785:1;21778:15;21812:4;21809:1;21802:15;21829:117;21938:1;21935;21928:12;21952:117;22061:1;22058;22051:12;22075:434;22164:5;22189:66;22205:49;22247:6;22205:49;:::i;:::-;22189:66;:::i;:::-;22180:75;;22278:6;22271:5;22264:21;22316:4;22309:5;22305:16;22354:3;22345:6;22340:3;22336:16;22333:25;22330:112;;;22361:79;;:::i;:::-;22330:112;22451:52;22496:6;22491:3;22486;22451:52;:::i;:::-;22170:339;22075:434;;;;;:::o;22529:355::-;22596:5;22645:3;22638:4;22630:6;22626:17;22622:27;22612:122;;22653:79;;:::i;:::-;22612:122;22763:6;22757:13;22788:90;22874:3;22866:6;22859:4;22851:6;22847:17;22788:90;:::i;:::-;22779:99;;22602:282;22529:355;;;;:::o;22890:321::-;22977:4;23067:18;23059:6;23056:30;23053:56;;;23089:18;;:::i;:::-;23053:56;23139:4;23131:6;23127:17;23119:25;;23199:4;23193;23189:15;23181:23;;22890:321;;;:::o;23233:960::-;23350:5;23375:91;23391:74;23458:6;23391:74;:::i;:::-;23375:91;:::i;:::-;23366:100;;23486:5;23515:6;23508:5;23501:21;23549:4;23542:5;23538:16;23531:23;;23602:4;23594:6;23590:17;23582:6;23578:30;23631:3;23623:6;23620:15;23617:122;;;23650:79;;:::i;:::-;23617:122;23765:6;23748:439;23782:6;23777:3;23774:15;23748:439;;;23864:3;23858:10;23900:18;23887:11;23884:35;23881:122;;;23922:79;;:::i;:::-;23881:122;24046:11;24038:6;24034:24;24084:58;24138:3;24126:10;24084:58;:::i;:::-;24079:3;24072:71;24172:4;24167:3;24163:14;24156:21;;23824:363;;23808:4;23803:3;23799:14;23792:21;;23748:439;;;23752:21;23356:837;;23233:960;;;;;:::o;24215:405::-;24307:5;24356:3;24349:4;24341:6;24337:17;24333:27;24323:122;;24364:79;;:::i;:::-;24323:122;24474:6;24468:13;24499:115;24610:3;24602:6;24595:4;24587:6;24583:17;24499:115;:::i;:::-;24490:124;;24313:307;24215:405;;;;:::o;24626:143::-;24683:5;24714:6;24708:13;24699:22;;24730:33;24757:5;24730:33;:::i;:::-;24626:143;;;;:::o;24819:3207::-;24906:5;24950:6;24938:9;24933:3;24929:19;24925:32;24922:119;;;24960:79;;:::i;:::-;24922:119;25059:23;25075:6;25059:23;:::i;:::-;25050:32;;25174:1;25163:9;25159:17;25153:24;25204:18;25196:6;25193:30;25190:117;;;25226:79;;:::i;:::-;25190:117;25346:70;25412:3;25403:6;25392:9;25388:22;25346:70;:::i;:::-;25339:4;25332:5;25328:16;25321:96;25092:336;25509:2;25498:9;25494:18;25488:25;25540:18;25532:6;25529:30;25526:117;;;25562:79;;:::i;:::-;25526:117;25682:70;25748:3;25739:6;25728:9;25724:22;25682:70;:::i;:::-;25675:4;25668:5;25664:16;25657:96;25438:326;25845:2;25834:9;25830:18;25824:25;25876:18;25868:6;25865:30;25862:117;;;25898:79;;:::i;:::-;25862:117;26018:70;26084:3;26075:6;26064:9;26060:22;26018:70;:::i;:::-;26011:4;26004:5;26000:16;25993:96;25774:326;26187:2;26176:9;26172:18;26166:25;26218:18;26210:6;26207:30;26204:117;;;26240:79;;:::i;:::-;26204:117;26360:70;26426:3;26417:6;26406:9;26402:22;26360:70;:::i;:::-;26353:4;26346:5;26342:16;26335:96;26110:332;26530:3;26519:9;26515:19;26509:26;26562:18;26554:6;26551:30;26548:117;;;26584:79;;:::i;:::-;26548:117;26704:70;26770:3;26761:6;26750:9;26746:22;26704:70;:::i;:::-;26697:4;26690:5;26686:16;26679:96;26452:334;26874:3;26863:9;26859:19;26853:26;26906:18;26898:6;26895:30;26892:117;;;26928:79;;:::i;:::-;26892:117;27048:70;27114:3;27105:6;27094:9;27090:22;27048:70;:::i;:::-;27041:4;27034:5;27030:16;27023:96;26796:334;27224:3;27213:9;27209:19;27203:26;27256:18;27248:6;27245:30;27242:117;;;27278:79;;:::i;:::-;27242:117;27398:70;27464:3;27455:6;27444:9;27440:22;27398:70;:::i;:::-;27391:4;27384:5;27380:16;27373:96;27140:340;27562:3;27551:9;27547:19;27541:26;27594:18;27586:6;27583:30;27580:117;;;27616:79;;:::i;:::-;27580:117;27736:95;27827:3;27818:6;27807:9;27803:22;27736:95;:::i;:::-;27729:4;27722:5;27718:16;27711:121;27490:353;27903:3;27947:60;28003:3;27994:6;27983:9;27979:22;27947:60;:::i;:::-;27938:6;27931:5;27927:18;27920:88;27853:166;24819:3207;;;;:::o;28032:558::-;28129:6;28178:2;28166:9;28157:7;28153:23;28149:32;28146:119;;;28184:79;;:::i;:::-;28146:119;28325:1;28314:9;28310:17;28304:24;28355:18;28347:6;28344:30;28341:117;;;28377:79;;:::i;:::-;28341:117;28482:91;28565:7;28556:6;28545:9;28541:22;28482:91;:::i;:::-;28472:101;;28275:308;28032:558;;;;:::o;28596:148::-;28698:11;28735:3;28720:18;;28596:148;;;;:::o;28750:390::-;28856:3;28884:39;28917:5;28884:39;:::i;:::-;28939:89;29021:6;29016:3;28939:89;:::i;:::-;28932:96;;29037:65;29095:6;29090:3;29083:4;29076:5;29072:16;29037:65;:::i;:::-;29127:6;29122:3;29118:16;29111:23;;28860:280;28750:390;;;;:::o;29146:435::-;29326:3;29348:95;29439:3;29430:6;29348:95;:::i;:::-;29341:102;;29460:95;29551:3;29542:6;29460:95;:::i;:::-;29453:102;;29572:3;29565:10;;29146:435;;;;;:::o;29587:731::-;29802:4;29840:3;29829:9;29825:19;29817:27;;29854:71;29922:1;29911:9;29907:17;29898:6;29854:71;:::i;:::-;29935:72;30003:2;29992:9;29988:18;29979:6;29935:72;:::i;:::-;30054:9;30048:4;30044:20;30039:2;30028:9;30024:18;30017:48;30082:78;30155:4;30146:6;30082:78;:::i;:::-;30074:86;;30207:9;30201:4;30197:20;30192:2;30181:9;30177:18;30170:48;30235:76;30306:4;30297:6;30235:76;:::i;:::-;30227:84;;29587:731;;;;;;;:::o;30324:137::-;30378:5;30409:6;30403:13;30394:22;;30425:30;30449:5;30425:30;:::i;:::-;30324:137;;;;:::o;30467:345::-;30534:6;30583:2;30571:9;30562:7;30558:23;30554:32;30551:119;;;30589:79;;:::i;:::-;30551:119;30709:1;30734:61;30787:7;30778:6;30767:9;30763:22;30734:61;:::i;:::-;30724:71;;30680:125;30467:345;;;;:::o;30818:140::-;30866:4;30889:3;30881:11;;30912:3;30909:1;30902:14;30946:4;30943:1;30933:18;30925:26;;30818:140;;;:::o;30964:93::-;31001:6;31048:2;31043;31036:5;31032:14;31028:23;31018:33;;30964:93;;;:::o;31063:107::-;31107:8;31157:5;31151:4;31147:16;31126:37;;31063:107;;;;:::o;31176:393::-;31245:6;31295:1;31283:10;31279:18;31318:97;31348:66;31337:9;31318:97;:::i;:::-;31436:39;31466:8;31455:9;31436:39;:::i;:::-;31424:51;;31508:4;31504:9;31497:5;31493:21;31484:30;;31557:4;31547:8;31543:19;31536:5;31533:30;31523:40;;31252:317;;31176:393;;;;;:::o;31575:60::-;31603:3;31624:5;31617:12;;31575:60;;;:::o;31641:142::-;31691:9;31724:53;31742:34;31751:24;31769:5;31751:24;:::i;:::-;31742:34;:::i;:::-;31724:53;:::i;:::-;31711:66;;31641:142;;;:::o;31789:75::-;31832:3;31853:5;31846:12;;31789:75;;;:::o;31870:269::-;31980:39;32011:7;31980:39;:::i;:::-;32041:91;32090:41;32114:16;32090:41;:::i;:::-;32082:6;32075:4;32069:11;32041:91;:::i;:::-;32035:4;32028:105;31946:193;31870:269;;;:::o;32145:73::-;32190:3;32145:73;:::o;32224:189::-;32301:32;;:::i;:::-;32342:65;32400:6;32392;32386:4;32342:65;:::i;:::-;32277:136;32224:189;;:::o;32419:186::-;32479:120;32496:3;32489:5;32486:14;32479:120;;;32550:39;32587:1;32580:5;32550:39;:::i;:::-;32523:1;32516:5;32512:13;32503:22;;32479:120;;;32419:186;;:::o;32611:541::-;32711:2;32706:3;32703:11;32700:445;;;32745:37;32776:5;32745:37;:::i;:::-;32828:29;32846:10;32828:29;:::i;:::-;32818:8;32814:44;33011:2;32999:10;32996:18;32993:49;;;33032:8;33017:23;;32993:49;33055:80;33111:22;33129:3;33111:22;:::i;:::-;33101:8;33097:37;33084:11;33055:80;:::i;:::-;32715:430;;32700:445;32611:541;;;:::o;33158:117::-;33212:8;33262:5;33256:4;33252:16;33231:37;;33158:117;;;;:::o;33281:169::-;33325:6;33358:51;33406:1;33402:6;33394:5;33391:1;33387:13;33358:51;:::i;:::-;33354:56;33439:4;33433;33429:15;33419:25;;33332:118;33281:169;;;;:::o;33455:295::-;33531:4;33677:29;33702:3;33696:4;33677:29;:::i;:::-;33669:37;;33739:3;33736:1;33732:11;33726:4;33723:21;33715:29;;33455:295;;;;:::o;33755:1390::-;33870:36;33902:3;33870:36;:::i;:::-;33971:18;33963:6;33960:30;33957:56;;;33993:18;;:::i;:::-;33957:56;34037:38;34069:4;34063:11;34037:38;:::i;:::-;34122:66;34181:6;34173;34167:4;34122:66;:::i;:::-;34215:1;34239:4;34226:17;;34271:2;34263:6;34260:14;34288:1;34283:617;;;;34944:1;34961:6;34958:77;;;35010:9;35005:3;35001:19;34995:26;34986:35;;34958:77;35061:67;35121:6;35114:5;35061:67;:::i;:::-;35055:4;35048:81;34917:222;34253:886;;34283:617;34335:4;34331:9;34323:6;34319:22;34369:36;34400:4;34369:36;:::i;:::-;34427:1;34441:208;34455:7;34452:1;34449:14;34441:208;;;34534:9;34529:3;34525:19;34519:26;34511:6;34504:42;34585:1;34577:6;34573:14;34563:24;;34632:2;34621:9;34617:18;34604:31;;34478:4;34475:1;34471:12;34466:17;;34441:208;;;34677:6;34668:7;34665:19;34662:179;;;34735:9;34730:3;34726:19;34720:26;34778:48;34820:4;34812:6;34808:17;34797:9;34778:48;:::i;:::-;34770:6;34763:64;34685:156;34662:179;34887:1;34883;34875:6;34871:14;34867:22;34861:4;34854:36;34290:610;;;34253:886;;33845:1300;;;33755:1390;;:::o;35151:228::-;35291:34;35287:1;35279:6;35275:14;35268:58;35360:11;35355:2;35347:6;35343:15;35336:36;35151:228;:::o;35385:366::-;35527:3;35548:67;35612:2;35607:3;35548:67;:::i;:::-;35541:74;;35624:93;35713:3;35624:93;:::i;:::-;35742:2;35737:3;35733:12;35726:19;;35385:366;;;:::o;35757:419::-;35923:4;35961:2;35950:9;35946:18;35938:26;;36010:9;36004:4;36000:20;35996:1;35985:9;35981:17;35974:47;36038:131;36164:4;36038:131;:::i;:::-;36030:139;;35757:419;;;:::o;36182:229::-;36322:34;36318:1;36310:6;36306:14;36299:58;36391:12;36386:2;36378:6;36374:15;36367:37;36182:229;:::o;36417:366::-;36559:3;36580:67;36644:2;36639:3;36580:67;:::i;:::-;36573:74;;36656:93;36745:3;36656:93;:::i;:::-;36774:2;36769:3;36765:12;36758:19;;36417:366;;;:::o;36789:419::-;36955:4;36993:2;36982:9;36978:18;36970:26;;37042:9;37036:4;37032:20;37028:1;37017:9;37013:17;37006:47;37070:131;37196:4;37070:131;:::i;:::-;37062:139;;36789:419;;;:::o;37214:154::-;37354:6;37350:1;37342:6;37338:14;37331:30;37214:154;:::o;37374:365::-;37516:3;37537:66;37601:1;37596:3;37537:66;:::i;:::-;37530:73;;37612:93;37701:3;37612:93;:::i;:::-;37730:2;37725:3;37721:12;37714:19;;37374:365;;;:::o;37745:419::-;37911:4;37949:2;37938:9;37934:18;37926:26;;37998:9;37992:4;37988:20;37984:1;37973:9;37969:17;37962:47;38026:131;38152:4;38026:131;:::i;:::-;38018:139;;37745:419;;;:::o;38170:152::-;38310:4;38306:1;38298:6;38294:14;38287:28;38170:152;:::o;38328:400::-;38488:3;38509:84;38591:1;38586:3;38509:84;:::i;:::-;38502:91;;38602:93;38691:3;38602:93;:::i;:::-;38720:1;38715:3;38711:11;38704:18;;38328:400;;;:::o;38734:861::-;39063:3;39085:148;39229:3;39085:148;:::i;:::-;39078:155;;39250:95;39341:3;39332:6;39250:95;:::i;:::-;39243:102;;39362:95;39453:3;39444:6;39362:95;:::i;:::-;39355:102;;39474:95;39565:3;39556:6;39474:95;:::i;:::-;39467:102;;39586:3;39579:10;;38734:861;;;;;;:::o;39601:191::-;39641:3;39660:20;39678:1;39660:20;:::i;:::-;39655:25;;39694:20;39712:1;39694:20;:::i;:::-;39689:25;;39737:1;39734;39730:9;39723:16;;39758:3;39755:1;39752:10;39749:36;;;39765:18;;:::i;:::-;39749:36;39601:191;;;;:::o;39798:141::-;39847:4;39870:3;39862:11;;39893:3;39890:1;39883:14;39927:4;39924:1;39914:18;39906:26;;39798:141;;;:::o;39945:543::-;40046:2;40041:3;40038:11;40035:446;;;40080:38;40112:5;40080:38;:::i;:::-;40164:29;40182:10;40164:29;:::i;:::-;40154:8;40150:44;40347:2;40335:10;40332:18;40329:49;;;40368:8;40353:23;;40329:49;40391:80;40447:22;40465:3;40447:22;:::i;:::-;40437:8;40433:37;40420:11;40391:80;:::i;:::-;40050:431;;40035:446;39945:543;;;:::o;40494:1395::-;40611:37;40644:3;40611:37;:::i;:::-;40713:18;40705:6;40702:30;40699:56;;;40735:18;;:::i;:::-;40699:56;40779:38;40811:4;40805:11;40779:38;:::i;:::-;40864:67;40924:6;40916;40910:4;40864:67;:::i;:::-;40958:1;40982:4;40969:17;;41014:2;41006:6;41003:14;41031:1;41026:618;;;;41688:1;41705:6;41702:77;;;41754:9;41749:3;41745:19;41739:26;41730:35;;41702:77;41805:67;41865:6;41858:5;41805:67;:::i;:::-;41799:4;41792:81;41661:222;40996:887;;41026:618;41078:4;41074:9;41066:6;41062:22;41112:37;41144:4;41112:37;:::i;:::-;41171:1;41185:208;41199:7;41196:1;41193:14;41185:208;;;41278:9;41273:3;41269:19;41263:26;41255:6;41248:42;41329:1;41321:6;41317:14;41307:24;;41376:2;41365:9;41361:18;41348:31;;41222:4;41219:1;41215:12;41210:17;;41185:208;;;41421:6;41412:7;41409:19;41406:179;;;41479:9;41474:3;41470:19;41464:26;41522:48;41564:4;41556:6;41552:17;41541:9;41522:48;:::i;:::-;41514:6;41507:64;41429:156;41406:179;41631:1;41627;41619:6;41615:14;41611:22;41605:4;41598:36;41033:611;;;40996:887;;40586:1303;;;40494:1395;;:::o;41895:275::-;42027:3;42049:95;42140:3;42131:6;42049:95;:::i;:::-;42042:102;;42161:3;42154:10;;41895:275;;;;:::o;42176:147::-;42277:11;42314:3;42299:18;;42176:147;;;;:::o;42329:386::-;42433:3;42461:38;42493:5;42461:38;:::i;:::-;42515:88;42596:6;42591:3;42515:88;:::i;:::-;42508:95;;42612:65;42670:6;42665:3;42658:4;42651:5;42647:16;42612:65;:::i;:::-;42702:6;42697:3;42693:16;42686:23;;42437:278;42329:386;;;;:::o;42721:214::-;42861:66;42857:1;42849:6;42845:14;42838:90;42721:214;:::o;42941:402::-;43101:3;43122:85;43204:2;43199:3;43122:85;:::i;:::-;43115:92;;43216:93;43305:3;43216:93;:::i;:::-;43334:2;43329:3;43325:12;43318:19;;42941:402;;;:::o;43349:214::-;43489:66;43485:1;43477:6;43473:14;43466:90;43349:214;:::o;43569:402::-;43729:3;43750:85;43832:2;43827:3;43750:85;:::i;:::-;43743:92;;43844:93;43933:3;43844:93;:::i;:::-;43962:2;43957:3;43953:12;43946:19;;43569:402;;;:::o;44001:874::-;44104:3;44141:5;44135:12;44170:36;44196:9;44170:36;:::i;:::-;44222:89;44304:6;44299:3;44222:89;:::i;:::-;44215:96;;44342:1;44331:9;44327:17;44358:1;44353:166;;;;44533:1;44528:341;;;;44320:549;;44353:166;44437:4;44433:9;44422;44418:25;44413:3;44406:38;44499:6;44492:14;44485:22;44477:6;44473:35;44468:3;44464:45;44457:52;;44353:166;;44528:341;44595:38;44627:5;44595:38;:::i;:::-;44655:1;44669:154;44683:6;44680:1;44677:13;44669:154;;;44757:7;44751:14;44747:1;44742:3;44738:11;44731:35;44807:1;44798:7;44794:15;44783:26;;44705:4;44702:1;44698:12;44693:17;;44669:154;;;44852:6;44847:3;44843:16;44836:23;;44535:334;;44320:549;;44108:767;;44001:874;;;;:::o;44881:214::-;45021:66;45017:1;45009:6;45005:14;44998:90;44881:214;:::o;45101:400::-;45261:3;45282:84;45364:1;45359:3;45282:84;:::i;:::-;45275:91;;45375:93;45464:3;45375:93;:::i;:::-;45493:1;45488:3;45484:11;45477:18;;45101:400;;;:::o;45507:1383::-;46033:3;46055:93;46144:3;46135:6;46055:93;:::i;:::-;46048:100;;46165:148;46309:3;46165:148;:::i;:::-;46158:155;;46330:95;46421:3;46412:6;46330:95;:::i;:::-;46323:102;;46442:148;46586:3;46442:148;:::i;:::-;46435:155;;46607:92;46695:3;46686:6;46607:92;:::i;:::-;46600:99;;46716:148;46860:3;46716:148;:::i;:::-;46709:155;;46881:3;46874:10;;45507:1383;;;;;;:::o;46896:233::-;46935:3;46958:24;46976:5;46958:24;:::i;:::-;46949:33;;47004:66;46997:5;46994:77;46991:103;;47074:18;;:::i;:::-;46991:103;47121:1;47114:5;47110:13;47103:20;;46896:233;;;:::o;47135:97::-;47194:6;47222:3;47212:13;;47135:97;;;;:::o;47238:1403::-;47362:44;47402:3;47397;47362:44;:::i;:::-;47471:18;47463:6;47460:30;47457:56;;;47493:18;;:::i;:::-;47457:56;47537:38;47569:4;47563:11;47537:38;:::i;:::-;47622:67;47682:6;47674;47668:4;47622:67;:::i;:::-;47716:1;47745:2;47737:6;47734:14;47762:1;47757:632;;;;48433:1;48450:6;48447:84;;;48506:9;48501:3;48497:19;48484:33;48475:42;;48447:84;48557:67;48617:6;48610:5;48557:67;:::i;:::-;48551:4;48544:81;48406:229;47727:908;;47757:632;47809:4;47805:9;47797:6;47793:22;47843:37;47875:4;47843:37;:::i;:::-;47902:1;47916:215;47930:7;47927:1;47924:14;47916:215;;;48016:9;48011:3;48007:19;47994:33;47986:6;47979:49;48067:1;48059:6;48055:14;48045:24;;48114:2;48103:9;48099:18;48086:31;;47953:4;47950:1;47946:12;47941:17;;47916:215;;;48159:6;48150:7;48147:19;48144:186;;;48224:9;48219:3;48215:19;48202:33;48267:48;48309:4;48301:6;48297:17;48286:9;48267:48;:::i;:::-;48259:6;48252:64;48167:163;48144:186;48376:1;48372;48364:6;48360:14;48356:22;48350:4;48343:36;47764:625;;;47727:908;;47337:1304;;;47238:1403;;;:::o;48671:330::-;48787:3;48808:89;48890:6;48885:3;48808:89;:::i;:::-;48801:96;;48907:56;48956:6;48951:3;48944:5;48907:56;:::i;:::-;48988:6;48983:3;48979:16;48972:23;;48671:330;;;;;:::o;49007:295::-;49149:3;49171:105;49272:3;49263:6;49255;49171:105;:::i;:::-;49164:112;;49293:3;49286:10;;49007:295;;;;;:::o;49308:225::-;49448:34;49444:1;49436:6;49432:14;49425:58;49517:8;49512:2;49504:6;49500:15;49493:33;49308:225;:::o;49539:366::-;49681:3;49702:67;49766:2;49761:3;49702:67;:::i;:::-;49695:74;;49778:93;49867:3;49778:93;:::i;:::-;49896:2;49891:3;49887:12;49880:19;;49539:366;;;:::o;49911:419::-;50077:4;50115:2;50104:9;50100:18;50092:26;;50164:9;50158:4;50154:20;50150:1;50139:9;50135:17;50128:47;50192:131;50318:4;50192:131;:::i;:::-;50184:139;;49911:419;;;:::o;50336:231::-;50476:34;50472:1;50464:6;50460:14;50453:58;50545:14;50540:2;50532:6;50528:15;50521:39;50336:231;:::o;50573:366::-;50715:3;50736:67;50800:2;50795:3;50736:67;:::i;:::-;50729:74;;50812:93;50901:3;50812:93;:::i;:::-;50930:2;50925:3;50921:12;50914:19;;50573:366;;;:::o;50945:419::-;51111:4;51149:2;51138:9;51134:18;51126:26;;51198:9;51192:4;51188:20;51184:1;51173:9;51169:17;51162:47;51226:131;51352:4;51226:131;:::i;:::-;51218:139;;50945:419;;;:::o;51370:224::-;51510:34;51506:1;51498:6;51494:14;51487:58;51579:7;51574:2;51566:6;51562:15;51555:32;51370:224;:::o;51600:366::-;51742:3;51763:67;51827:2;51822:3;51763:67;:::i;:::-;51756:74;;51839:93;51928:3;51839:93;:::i;:::-;51957:2;51952:3;51948:12;51941:19;;51600:366;;;:::o;51972:419::-;52138:4;52176:2;52165:9;52161:18;52153:26;;52225:9;52219:4;52215:20;52211:1;52200:9;52196:17;52189:47;52253:131;52379:4;52253:131;:::i;:::-;52245:139;;51972:419;;;:::o;52397:223::-;52537:34;52533:1;52525:6;52521:14;52514:58;52606:6;52601:2;52593:6;52589:15;52582:31;52397:223;:::o;52626:366::-;52768:3;52789:67;52853:2;52848:3;52789:67;:::i;:::-;52782:74;;52865:93;52954:3;52865:93;:::i;:::-;52983:2;52978:3;52974:12;52967:19;;52626:366;;;:::o;52998:419::-;53164:4;53202:2;53191:9;53187:18;53179:26;;53251:9;53245:4;53241:20;53237:1;53226:9;53222:17;53215:47;53279:131;53405:4;53279:131;:::i;:::-;53271:139;;52998:419;;;:::o;53423:180::-;53471:77;53468:1;53461:88;53568:4;53565:1;53558:15;53592:4;53589:1;53582:15;53609:185;53649:1;53666:20;53684:1;53666:20;:::i;:::-;53661:25;;53700:20;53718:1;53700:20;:::i;:::-;53695:25;;53739:1;53729:35;;53744:18;;:::i;:::-;53729:35;53786:1;53783;53779:9;53774:14;;53609:185;;;;:::o;53800:176::-;53832:1;53849:20;53867:1;53849:20;:::i;:::-;53844:25;;53883:20;53901:1;53883:20;:::i;:::-;53878:25;;53922:1;53912:35;;53927:18;;:::i;:::-;53912:35;53968:1;53965;53961:9;53956:14;;53800:176;;;;:::o;53982:410::-;54022:7;54045:20;54063:1;54045:20;:::i;:::-;54040:25;;54079:20;54097:1;54079:20;:::i;:::-;54074:25;;54134:1;54131;54127:9;54156:30;54174:11;54156:30;:::i;:::-;54145:41;;54335:1;54326:7;54322:15;54319:1;54316:22;54296:1;54289:9;54269:83;54246:139;;54365:18;;:::i;:::-;54246:139;54030:362;53982:410;;;;:::o;54398:102::-;54440:8;54487:5;54484:1;54480:13;54459:34;;54398:102;;;:::o;54506:848::-;54567:5;54574:4;54598:6;54589:15;;54622:5;54613:14;;54636:712;54657:1;54647:8;54644:15;54636:712;;;54752:4;54747:3;54743:14;54737:4;54734:24;54731:50;;;54761:18;;:::i;:::-;54731:50;54811:1;54801:8;54797:16;54794:451;;;55226:4;55219:5;55215:16;55206:25;;54794:451;55276:4;55270;55266:15;55258:23;;55306:32;55329:8;55306:32;:::i;:::-;55294:44;;54636:712;;;54506:848;;;;;;;:::o;55360:1073::-;55414:5;55605:8;55595:40;;55626:1;55617:10;;55628:5;;55595:40;55654:4;55644:36;;55671:1;55662:10;;55673:5;;55644:36;55740:4;55788:1;55783:27;;;;55824:1;55819:191;;;;55733:277;;55783:27;55801:1;55792:10;;55803:5;;;55819:191;55864:3;55854:8;55851:17;55848:43;;;55871:18;;:::i;:::-;55848:43;55920:8;55917:1;55913:16;55904:25;;55955:3;55948:5;55945:14;55942:40;;;55962:18;;:::i;:::-;55942:40;55995:5;;;55733:277;;56119:2;56109:8;56106:16;56100:3;56094:4;56091:13;56087:36;56069:2;56059:8;56056:16;56051:2;56045:4;56042:12;56038:35;56022:111;56019:246;;;56175:8;56169:4;56165:19;56156:28;;56210:3;56203:5;56200:14;56197:40;;;56217:18;;:::i;:::-;56197:40;56250:5;;56019:246;56290:42;56328:3;56318:8;56312:4;56309:1;56290:42;:::i;:::-;56275:57;;;;56364:4;56359:3;56355:14;56348:5;56345:25;56342:51;;;56373:18;;:::i;:::-;56342:51;56422:4;56415:5;56411:16;56402:25;;55360:1073;;;;;;:::o;56439:285::-;56499:5;56523:23;56541:4;56523:23;:::i;:::-;56515:31;;56567:27;56585:8;56567:27;:::i;:::-;56555:39;;56613:104;56650:66;56640:8;56634:4;56613:104;:::i;:::-;56604:113;;56439:285;;;;:::o;56730:86::-;56765:7;56805:4;56798:5;56794:16;56783:27;;56730:86;;;:::o;56822:179::-;56860:1;56877:18;56893:1;56877:18;:::i;:::-;56872:23;;56909:18;56925:1;56909:18;:::i;:::-;56904:23;;56946:1;56936:35;;56951:18;;:::i;:::-;56936:35;56993:1;56990;56986:9;56981:14;;56822:179;;;;:::o;57007:271::-;57045:7;57068:18;57084:1;57068:18;:::i;:::-;57063:23;;57100:18;57116:1;57100:18;:::i;:::-;57095:23;;57153:1;57150;57146:9;57175:28;57191:11;57175:28;:::i;:::-;57164:39;;57235:11;57226:7;57223:24;57213:58;;57251:18;;:::i;:::-;57213:58;57053:225;57007:271;;;;:::o;57284:191::-;57322:4;57342:18;57358:1;57342:18;:::i;:::-;57337:23;;57374:18;57390:1;57374:18;:::i;:::-;57369:23;;57416:1;57413;57409:9;57401:17;;57440:4;57434;57431:14;57428:40;;;57448:18;;:::i;:::-;57428:40;57284:191;;;;:::o;57481:114::-;57548:6;57582:5;57576:12;57566:22;;57481:114;;;:::o;57601:184::-;57700:11;57734:6;57729:3;57722:19;57774:4;57769:3;57765:14;57750:29;;57601:184;;;;:::o;57791:132::-;57858:4;57881:3;57873:11;;57911:4;57906:3;57902:14;57894:22;;57791:132;;;:::o;57929:108::-;58006:24;58024:5;58006:24;:::i;:::-;58001:3;57994:37;57929:108;;:::o;58043:179::-;58112:10;58133:46;58175:3;58167:6;58133:46;:::i;:::-;58211:4;58206:3;58202:14;58188:28;;58043:179;;;;:::o;58228:113::-;58298:4;58330;58325:3;58321:14;58313:22;;58228:113;;;:::o;58377:732::-;58496:3;58525:54;58573:5;58525:54;:::i;:::-;58595:86;58674:6;58669:3;58595:86;:::i;:::-;58588:93;;58705:56;58755:5;58705:56;:::i;:::-;58784:7;58815:1;58800:284;58825:6;58822:1;58819:13;58800:284;;;58901:6;58895:13;58928:63;58987:3;58972:13;58928:63;:::i;:::-;58921:70;;59014:60;59067:6;59014:60;:::i;:::-;59004:70;;58860:224;58847:1;58844;58840:9;58835:14;;58800:284;;;58804:14;59100:3;59093:10;;58501:608;;;58377:732;;;;:::o;59115:373::-;59258:4;59296:2;59285:9;59281:18;59273:26;;59345:9;59339:4;59335:20;59331:1;59320:9;59316:17;59309:47;59373:108;59476:4;59467:6;59373:108;:::i;:::-;59365:116;;59115:373;;;;:::o;59494:574::-;59599:6;59648:2;59636:9;59627:7;59623:23;59619:32;59616:119;;;59654:79;;:::i;:::-;59616:119;59795:1;59784:9;59780:17;59774:24;59825:18;59817:6;59814:30;59811:117;;;59847:79;;:::i;:::-;59811:117;59952:99;60043:7;60034:6;60023:9;60019:22;59952:99;:::i;:::-;59942:109;;59745:316;59494:574;;;;:::o;60074:541::-;60307:3;60329:148;60473:3;60329:148;:::i;:::-;60322:155;;60494:95;60585:3;60576:6;60494:95;:::i;:::-;60487:102;;60606:3;60599:10;;60074:541;;;;:::o;60621:237::-;60761:34;60757:1;60749:6;60745:14;60738:58;60830:20;60825:2;60817:6;60813:15;60806:45;60621:237;:::o;60864:366::-;61006:3;61027:67;61091:2;61086:3;61027:67;:::i;:::-;61020:74;;61103:93;61192:3;61103:93;:::i;:::-;61221:2;61216:3;61212:12;61205:19;;60864:366;;;:::o;61236:419::-;61402:4;61440:2;61429:9;61425:18;61417:26;;61489:9;61483:4;61479:20;61475:1;61464:9;61460:17;61453:47;61517:131;61643:4;61517:131;:::i;:::-;61509:139;;61236:419;;;:::o;61661:155::-;61801:3;61797:1;61789:6;61785:14;61778:27;61661:155;:::o;61826:416::-;61986:3;62011:84;62093:1;62088:3;62011:84;:::i;:::-;62004:91;;62108:93;62197:3;62108:93;:::i;:::-;62230:1;62225:3;62221:11;62214:18;;61826:416;;;:::o;62252:222::-;62396:66;62392:1;62384:6;62380:14;62373:90;62252:222;:::o;62484:416::-;62644:3;62669:84;62751:1;62746:3;62669:84;:::i;:::-;62662:91;;62766:93;62855:3;62766:93;:::i;:::-;62888:1;62883:3;62879:11;62872:18;;62484:416;;;:::o;62910:222::-;63054:66;63050:1;63042:6;63038:14;63031:90;62910:222;:::o;63142:416::-;63302:3;63327:84;63409:1;63404:3;63327:84;:::i;:::-;63320:91;;63424:93;63513:3;63424:93;:::i;:::-;63546:1;63541:3;63537:11;63530:18;;63142:416;;;:::o;63568:222::-;63712:66;63708:1;63700:6;63696:14;63689:90;63568:222;:::o;63800:418::-;63960:3;63985:85;64067:2;64062:3;63985:85;:::i;:::-;63978:92;;64083:93;64172:3;64083:93;:::i;:::-;64205:2;64200:3;64196:12;64189:19;;63800:418;;;:::o;64228:222::-;64372:66;64368:1;64360:6;64356:14;64349:90;64228:222;:::o;64460:418::-;64620:3;64645:85;64727:2;64722:3;64645:85;:::i;:::-;64638:92;;64743:93;64832:3;64743:93;:::i;:::-;64865:2;64860:3;64856:12;64849:19;;64460:418;;;:::o;64888:222::-;65032:66;65028:1;65020:6;65016:14;65009:90;64888:222;:::o;65120:418::-;65280:3;65305:85;65387:2;65382:3;65305:85;:::i;:::-;65298:92;;65403:93;65492:3;65403:93;:::i;:::-;65525:2;65520:3;65516:12;65509:19;;65120:418;;;:::o;65548:327::-;65692:66;65688:1;65680:6;65676:14;65669:90;65797:66;65792:2;65784:6;65780:15;65773:91;65548:327;:::o;65885:418::-;66045:3;66070:85;66152:2;66147:3;66070:85;:::i;:::-;66063:92;;66168:93;66257:3;66168:93;:::i;:::-;66290:2;66285:3;66281:12;66274:19;;65885:418;;;:::o;66313:222::-;66457:66;66453:1;66445:6;66441:14;66434:90;66313:222;:::o;66545:416::-;66705:3;66730:84;66812:1;66807:3;66730:84;:::i;:::-;66723:91;;66827:93;66916:3;66827:93;:::i;:::-;66949:1;66944:3;66940:11;66933:18;;66545:416;;;:::o;66971:327::-;67115:66;67111:1;67103:6;67099:14;67092:90;67220:66;67215:2;67207:6;67203:15;67196:91;66971:327;:::o;67308:418::-;67468:3;67493:85;67575:2;67570:3;67493:85;:::i;:::-;67486:92;;67591:93;67680:3;67591:93;:::i;:::-;67713:2;67708:3;67704:12;67697:19;;67308:418;;;:::o;67736:222::-;67880:66;67876:1;67868:6;67864:14;67857:90;67736:222;:::o;67968:418::-;68128:3;68153:85;68235:2;68230:3;68153:85;:::i;:::-;68146:92;;68251:93;68340:3;68251:93;:::i;:::-;68373:2;68368:3;68364:12;68357:19;;67968:418;;;:::o;68396:327::-;68540:66;68536:1;68528:6;68524:14;68517:90;68645:66;68640:2;68632:6;68628:15;68621:91;68396:327;:::o;68733:418::-;68893:3;68918:85;69000:2;68995:3;68918:85;:::i;:::-;68911:92;;69016:93;69105:3;69016:93;:::i;:::-;69138:2;69133:3;69129:12;69122:19;;68733:418;;;:::o;69161:152::-;69301:4;69297:1;69289:6;69285:14;69278:28;69161:152;:::o;69319:400::-;69479:3;69500:84;69582:1;69577:3;69500:84;:::i;:::-;69493:91;;69593:93;69682:3;69593:93;:::i;:::-;69711:1;69706:3;69702:11;69695:18;;69319:400;;;:::o;69725:5373::-;71702:3;71724:148;71868:3;71724:148;:::i;:::-;71717:155;;71889:148;72033:3;71889:148;:::i;:::-;71882:155;;72054:95;72145:3;72136:6;72054:95;:::i;:::-;72047:102;;72166:148;72310:3;72166:148;:::i;:::-;72159:155;;72331:148;72475:3;72331:148;:::i;:::-;72324:155;;72496:92;72584:3;72575:6;72496:92;:::i;:::-;72489:99;;72605:148;72749:3;72605:148;:::i;:::-;72598:155;;72770:95;72861:3;72852:6;72770:95;:::i;:::-;72763:102;;72882:148;73026:3;72882:148;:::i;:::-;72875:155;;73047:148;73191:3;73047:148;:::i;:::-;73040:155;;73212:95;73303:3;73294:6;73212:95;:::i;:::-;73205:102;;73324:148;73468:3;73324:148;:::i;:::-;73317:155;;73489:148;73633:3;73489:148;:::i;:::-;73482:155;;73654:95;73745:3;73736:6;73654:95;:::i;:::-;73647:102;;73766:148;73910:3;73766:148;:::i;:::-;73759:155;;73931:148;74075:3;73931:148;:::i;:::-;73924:155;;74096:95;74187:3;74178:6;74096:95;:::i;:::-;74089:102;;74208:148;74352:3;74208:148;:::i;:::-;74201:155;;74373:148;74517:3;74373:148;:::i;:::-;74366:155;;74538:92;74626:3;74617:6;74538:92;:::i;:::-;74531:99;;74647:148;74791:3;74647:148;:::i;:::-;74640:155;;74812:95;74903:3;74894:6;74812:95;:::i;:::-;74805:102;;74924:148;75068:3;74924:148;:::i;:::-;74917:155;;75089:3;75082:10;;69725:5373;;;;;;;;;;;:::o;75104:179::-;75244:31;75240:1;75232:6;75228:14;75221:55;75104:179;:::o;75289:402::-;75449:3;75470:85;75552:2;75547:3;75470:85;:::i;:::-;75463:92;;75564:93;75653:3;75564:93;:::i;:::-;75682:2;75677:3;75673:12;75666:19;;75289:402;;;:::o;75697:541::-;75930:3;75952:148;76096:3;75952:148;:::i;:::-;75945:155;;76117:95;76208:3;76199:6;76117:95;:::i;:::-;76110:102;;76229:3;76222:10;;75697:541;;;;:::o;76244:169::-;76384:21;76380:1;76372:6;76368:14;76361:45;76244:169;:::o;76419:366::-;76561:3;76582:67;76646:2;76641:3;76582:67;:::i;:::-;76575:74;;76658:93;76747:3;76658:93;:::i;:::-;76776:2;76771:3;76767:12;76760:19;;76419:366;;;:::o;76791:419::-;76957:4;76995:2;76984:9;76980:18;76972:26;;77044:9;77038:4;77034:20;77030:1;77019:9;77015:17;77008:47;77072:131;77198:4;77072:131;:::i;:::-;77064:139;;76791:419;;;:::o;77216:188::-;77254:3;77273:18;77289:1;77273:18;:::i;:::-;77268:23;;77305:18;77321:1;77305:18;:::i;:::-;77300:23;;77346:1;77343;77339:9;77332:16;;77369:4;77364:3;77361:13;77358:39;;;77377:18;;:::i;:::-;77358:39;77216:188;;;;:::o;77410:640::-;77605:4;77643:3;77632:9;77628:19;77620:27;;77657:71;77725:1;77714:9;77710:17;77701:6;77657:71;:::i;:::-;77738:72;77806:2;77795:9;77791:18;77782:6;77738:72;:::i;:::-;77820;77888:2;77877:9;77873:18;77864:6;77820:72;:::i;:::-;77939:9;77933:4;77929:20;77924:2;77913:9;77909:18;77902:48;77967:76;78038:4;78029:6;77967:76;:::i;:::-;77959:84;;77410:640;;;;;;;:::o;78056:141::-;78112:5;78143:6;78137:13;78128:22;;78159:32;78185:5;78159:32;:::i;:::-;78056:141;;;;:::o;78203:349::-;78272:6;78321:2;78309:9;78300:7;78296:23;78292:32;78289:119;;;78327:79;;:::i;:::-;78289:119;78447:1;78472:63;78527:7;78518:6;78507:9;78503:22;78472:63;:::i;:::-;78462:73;;78418:127;78203:349;;;;:::o;78558:157::-;78698:9;78694:1;78686:6;78682:14;78675:33;78558:157;:::o;78721:400::-;78881:3;78902:84;78984:1;78979:3;78902:84;:::i;:::-;78895:91;;78995:93;79084:3;78995:93;:::i;:::-;79113:1;79108:3;79104:11;79097:18;;78721:400;;;:::o;79127:163::-;79267:15;79263:1;79255:6;79251:14;79244:39;79127:163;:::o;79296:402::-;79456:3;79477:85;79559:2;79554:3;79477:85;:::i;:::-;79470:92;;79571:93;79660:3;79571:93;:::i;:::-;79689:2;79684:3;79680:12;79673:19;;79296:402;;;:::o;79704:157::-;79844:9;79840:1;79832:6;79828:14;79821:33;79704:157;:::o;79867:400::-;80027:3;80048:84;80130:1;80125:3;80048:84;:::i;:::-;80041:91;;80141:93;80230:3;80141:93;:::i;:::-;80259:1;80254:3;80250:11;80243:18;;79867:400;;;:::o;80273:158::-;80413:10;80409:1;80401:6;80397:14;80390:34;80273:158;:::o;80437:400::-;80597:3;80618:84;80700:1;80695:3;80618:84;:::i;:::-;80611:91;;80711:93;80800:3;80711:93;:::i;:::-;80829:1;80824:3;80820:11;80813:18;;80437:400;;;:::o;80843:168::-;80983:20;80979:1;80971:6;80967:14;80960:44;80843:168;:::o;81017:402::-;81177:3;81198:85;81280:2;81275:3;81198:85;:::i;:::-;81191:92;;81292:93;81381:3;81292:93;:::i;:::-;81410:2;81405:3;81401:12;81394:19;;81017:402;;;:::o;81425:154::-;81565:6;81561:1;81553:6;81549:14;81542:30;81425:154;:::o;81585:400::-;81745:3;81766:84;81848:1;81843:3;81766:84;:::i;:::-;81759:91;;81859:93;81948:3;81859:93;:::i;:::-;81977:1;81972:3;81968:11;81961:18;;81585:400;;;:::o;81991:2819::-;83011:3;83033:92;83121:3;83112:6;83033:92;:::i;:::-;83026:99;;83142:148;83286:3;83142:148;:::i;:::-;83135:155;;83307:95;83398:3;83389:6;83307:95;:::i;:::-;83300:102;;83419:148;83563:3;83419:148;:::i;:::-;83412:155;;83584:95;83675:3;83666:6;83584:95;:::i;:::-;83577:102;;83696:148;83840:3;83696:148;:::i;:::-;83689:155;;83861:95;83952:3;83943:6;83861:95;:::i;:::-;83854:102;;83973:148;84117:3;83973:148;:::i;:::-;83966:155;;84138:92;84226:3;84217:6;84138:92;:::i;:::-;84131:99;;84247:148;84391:3;84247:148;:::i;:::-;84240:155;;84412:95;84503:3;84494:6;84412:95;:::i;:::-;84405:102;;84524:148;84668:3;84524:148;:::i;:::-;84517:155;;84689:95;84780:3;84771:6;84689:95;:::i;:::-;84682:102;;84801:3;84794:10;;81991:2819;;;;;;;;;;:::o;84816:182::-;84956:34;84952:1;84944:6;84940:14;84933:58;84816:182;:::o;85004:366::-;85146:3;85167:67;85231:2;85226:3;85167:67;:::i;:::-;85160:74;;85243:93;85332:3;85243:93;:::i;:::-;85361:2;85356:3;85352:12;85345:19;;85004:366;;;:::o;85376:419::-;85542:4;85580:2;85569:9;85565:18;85557:26;;85629:9;85623:4;85619:20;85615:1;85604:9;85600:17;85593:47;85657:131;85783:4;85657:131;:::i;:::-;85649:139;;85376:419;;;:::o;85801:178::-;85941:30;85937:1;85929:6;85925:14;85918:54;85801:178;:::o;85985:366::-;86127:3;86148:67;86212:2;86207:3;86148:67;:::i;:::-;86141:74;;86224:93;86313:3;86224:93;:::i;:::-;86342:2;86337:3;86333:12;86326:19;;85985:366;;;:::o;86357:419::-;86523:4;86561:2;86550:9;86546:18;86538:26;;86610:9;86604:4;86600:20;86596:1;86585:9;86581:17;86574:47;86638:131;86764:4;86638:131;:::i;:::-;86630:139;;86357:419;;;:::o

Swarm Source

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