Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
0 3D dinos
Holders
1,196
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
19 3D dinosLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TinyDinos3D
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-17 */ /** *Submitted for verification at Etherscan.io on 2022-04-05 */ // File: contracts/interfaces/ILayerZeroUserApplicationConfig.sol pragma solidity >=0.5.0; interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig( uint16 _version, uint16 _chainId, uint256 _configType, bytes calldata _config ) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; } // File: contracts/interfaces/ILayerZeroEndpoint.sol pragma solidity >=0.5.0; interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination function send( uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams ) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload( uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint256 _gasLimit, bytes calldata _payload ) external; // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees( uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam ) external view returns (uint256 nativeFee, uint256 zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload( uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload ) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig( uint16 _version, uint16 _chainId, address _userApplication, uint256 _configType ) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); } // File: contracts/interfaces/ILayerZeroReceiver.sol pragma solidity >=0.5.0; interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive( uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload ) external; } // 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/Context.sol // 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/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @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/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/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/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/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/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (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"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev 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 {} } // File: contracts/NonblockingReceiver.sol pragma solidity ^0.8.6; abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver { ILayerZeroEndpoint internal endpoint; struct FailedMessages { uint256 payloadLength; bytes32 payloadHash; } mapping(uint16 => mapping(bytes => mapping(uint256 => FailedMessages))) public failedMessages; mapping(uint16 => bytes) public trustedRemoteLookup; event MessageFailed( uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload ); function lzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) external override { require(msg.sender == address(endpoint)); // boilerplate! lzReceive must be called by the endpoint for security require( _srcAddress.length == trustedRemoteLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedRemoteLookup[_srcChainId]), "NonblockingReceiver: invalid source sending contract" ); // try-catch all errors/exceptions // having failed messages does not block messages passing try this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload) { // do nothing } catch { // error / exception failedMessages[_srcChainId][_srcAddress][_nonce] = FailedMessages( _payload.length, keccak256(_payload) ); emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload); } } function onLzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) public { // only internal transaction require( msg.sender == address(this), "NonblockingReceiver: caller must be Bridge." ); // handle incoming message _LzReceive(_srcChainId, _srcAddress, _nonce, _payload); } // abstract function function _LzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual; function _lzSend( uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _txParam ) internal { endpoint.send{value: msg.value}( _dstChainId, trustedRemoteLookup[_dstChainId], _payload, _refundAddress, _zroPaymentAddress, _txParam ); } function retryMessage( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes calldata _payload ) external payable { // assert there is message to retry FailedMessages storage failedMsg = failedMessages[_srcChainId][ _srcAddress ][_nonce]; require( failedMsg.payloadHash != bytes32(0), "NonblockingReceiver: no stored message" ); require( _payload.length == failedMsg.payloadLength && keccak256(_payload) == failedMsg.payloadHash, "LayerZero: invalid payload" ); // clear the stored message failedMsg.payloadLength = 0; failedMsg.payloadHash = bytes32(0); // execute the message. revert if it fails again this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } function setTrustedRemote(uint16 _chainId, bytes calldata _trustedRemote) external onlyOwner { trustedRemoteLookup[_chainId] = _trustedRemote; } } // File: contracts/tinydinos-eth.sol pragma solidity ^0.8.7; contract TinyDinos3D is Ownable, ERC721, NonblockingReceiver { address public _owner; string private baseURI; uint256 nextTokenId = 0; uint256 MAX_MINT_ETHEREUM = 6500; uint256 gasForDestinationLzReceive = 350000; constructor(string memory baseURI_, address _layerZeroEndpoint) ERC721("3D tiny dinos", "3D dinos") { _owner = msg.sender; endpoint = ILayerZeroEndpoint(_layerZeroEndpoint); baseURI = baseURI_; } // mint function // you can choose to mint 1 or 2 // mint is free, but payments are accepted function mint(uint8 numTokens) external payable { require(numTokens < 3, "tiny dinos: Max 2 NFTs per transaction"); require( nextTokenId + numTokens <= MAX_MINT_ETHEREUM, "tiny dinos: Mint exceeds supply" ); _safeMint(msg.sender, ++nextTokenId); if (numTokens == 2) { _safeMint(msg.sender, ++nextTokenId); } } // This function transfers the nft from your address on the // source chain to the same address on the destination chain function traverseChains(uint16 _chainId, uint256 tokenId) public payable { require( msg.sender == ownerOf(tokenId), "You must own the token to traverse" ); require( trustedRemoteLookup[_chainId].length > 0, "This chain is currently unavailable for travel" ); // burn NFT, eliminating it from circulation on src chain _burn(tokenId); // abi.encode() the payload with the values to send bytes memory payload = abi.encode(msg.sender, tokenId); // encode adapterParams to specify more gas for the destination uint16 version = 1; bytes memory adapterParams = abi.encodePacked( version, gasForDestinationLzReceive ); // get the fees we need to pay to LayerZero + Relayer to cover message delivery // you will be refunded for extra gas paid (uint256 messageFee, ) = endpoint.estimateFees( _chainId, address(this), payload, false, adapterParams ); require( msg.value >= messageFee, "tiny dinos: msg.value not enough to cover messageFee. Send gas for message fees" ); endpoint.send{value: msg.value}( _chainId, // destination chainId trustedRemoteLookup[_chainId], // destination address of nft contract payload, // abi.encoded()'ed bytes payable(msg.sender), // refund address address(0x0), // 'zroPaymentAddress' unused for this adapterParams // txParameters ); } function setBaseURI(string memory URI) external onlyOwner { baseURI = URI; } function donate() external payable { // thank you } // This allows the devs to receive kind donations function withdraw(uint256 amt) external onlyOwner { (bool sent, ) = payable(_owner).call{value: amt}(""); require(sent, "tiny dinos: Failed to withdraw Ether"); } // just in case this fixed variable limits us from future integrations function setGasForDestinationLzReceive(uint256 newVal) external onlyOwner { gasForDestinationLzReceive = newVal; } // ------------------ // Internal Functions // ------------------ function _LzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal override { // decode (address toAddr, uint256 tokenId) = abi.decode( _payload, (address, uint256) ); // mint the tokens back into existence on destination chain _safeMint(toAddr, tokenId); } function _baseURI() internal view override returns (string memory) { return baseURI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"address","name":"_layerZeroEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"uint256","name":"payloadLength","type":"uint256"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"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":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numTokens","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"onLzReceive","outputs":[],"stateMutability":"nonpayable","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":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","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":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"setGasForDestinationLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedRemote","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"traverseChains","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600c55611964600d5562055730600e553480156200002357600080fd5b50604051620052e2380380620052e283398181016040528101906200004991906200052a565b6040518060400160405280600d81526020017f33442074696e792064696e6f73000000000000000000000000000000000000008152506040518060400160405280600881526020017f33442064696e6f73000000000000000000000000000000000000000000000000815250620000d5620000c9620001ac60201b60201c565b620001b460201b60201c565b8160019080519060200190620000ed92919062000278565b5080600290805190602001906200010692919062000278565b50505033600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600b9080519060200190620001a392919062000278565b505050620005f5565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200028690620005bf565b90600052602060002090601f016020900481019282620002aa5760008555620002f6565b82601f10620002c557805160ff1916838001178555620002f6565b82800160010185558215620002f6579182015b82811115620002f5578251825591602001919060010190620002d8565b5b50905062000305919062000309565b5090565b5b80821115620003245760008160009055506001016200030a565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003918262000346565b810181811067ffffffffffffffff82111715620003b357620003b262000357565b5b80604052505050565b6000620003c862000328565b9050620003d6828262000386565b919050565b600067ffffffffffffffff821115620003f957620003f862000357565b5b620004048262000346565b9050602081019050919050565b60005b838110156200043157808201518184015260208101905062000414565b8381111562000441576000848401525b50505050565b60006200045e6200045884620003db565b620003bc565b9050828152602081018484840111156200047d576200047c62000341565b5b6200048a84828562000411565b509392505050565b600082601f830112620004aa57620004a96200033c565b5b8151620004bc84826020860162000447565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004f282620004c5565b9050919050565b6200050481620004e5565b81146200051057600080fd5b50565b6000815190506200052481620004f9565b92915050565b6000806040838503121562000544576200054362000332565b5b600083015167ffffffffffffffff81111562000565576200056462000337565b5b620005738582860162000492565b9250506020620005868582860162000513565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005d857607f821691505b60208210811415620005ef57620005ee62000590565b5b50919050565b614cdd80620006056000396000f3fe6080604052600436106101c15760003560e01c80637533d788116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c514610623578063eb8d72b714610660578063ed88c68e14610689578063f2fde38b14610693576101c1565b8063b88d4fde14610585578063c87b56dd146105ae578063cf89fa03146105eb578063d1deba1f14610607576101c1565b8063943fb872116100d1578063943fb872146104dd57806395d89b4114610506578063a22cb46514610531578063b2bdfa7b1461055a576101c1565b80637533d788146104375780638da5cb5b146104745780638ee749121461049f576101c1565b80632e1a7d4d116101645780636352211e1161013e5780636352211e1461038a5780636ecd2306146103c757806370a08231146103e3578063715018a614610420576101c1565b80632e1a7d4d1461030f57806342842e0e1461033857806355f804b314610361576101c1565b8063081812fc116101a0578063081812fc14610257578063095ea7b3146102945780631c37a822146102bd57806323b872dd146102e6576101c1565b80621d3567146101c657806301ffc9a7146101ef57806306fdde031461022c575b600080fd5b3480156101d257600080fd5b506101ed60048036038101906101e89190612d4c565b6106bc565b005b3480156101fb57600080fd5b5061021660048036038101906102119190612e43565b6108fe565b6040516102239190612e8b565b60405180910390f35b34801561023857600080fd5b506102416109e0565b60405161024e9190612f2e565b60405180910390f35b34801561026357600080fd5b5061027e60048036038101906102799190612f86565b610a72565b60405161028b9190612ff4565b60405180910390f35b3480156102a057600080fd5b506102bb60048036038101906102b6919061303b565b610af7565b005b3480156102c957600080fd5b506102e460048036038101906102df9190612d4c565b610c0f565b005b3480156102f257600080fd5b5061030d6004803603810190610308919061307b565b610c8f565b005b34801561031b57600080fd5b5061033660048036038101906103319190612f86565b610cef565b005b34801561034457600080fd5b5061035f600480360381019061035a919061307b565b610e3d565b005b34801561036d57600080fd5b506103886004803603810190610383919061316f565b610e5d565b005b34801561039657600080fd5b506103b160048036038101906103ac9190612f86565b610ef3565b6040516103be9190612ff4565b60405180910390f35b6103e160048036038101906103dc91906131f1565b610fa5565b005b3480156103ef57600080fd5b5061040a6004803603810190610405919061321e565b61108c565b604051610417919061325a565b60405180910390f35b34801561042c57600080fd5b50610435611144565b005b34801561044357600080fd5b5061045e60048036038101906104599190613275565b6111cc565b60405161046b91906132f7565b60405180910390f35b34801561048057600080fd5b5061048961126c565b6040516104969190612ff4565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190613319565b611295565b6040516104d49291906133a1565b60405180910390f35b3480156104e957600080fd5b5061050460048036038101906104ff9190612f86565b6112e9565b005b34801561051257600080fd5b5061051b61136f565b6040516105289190612f2e565b60405180910390f35b34801561053d57600080fd5b50610558600480360381019061055391906133f6565b611401565b005b34801561056657600080fd5b5061056f611417565b60405161057c9190612ff4565b60405180910390f35b34801561059157600080fd5b506105ac60048036038101906105a79190613436565b61143d565b005b3480156105ba57600080fd5b506105d560048036038101906105d09190612f86565b61149f565b6040516105e29190612f2e565b60405180910390f35b610605600480360381019061060091906134b9565b611546565b005b610621600480360381019061061c9190613559565b611839565b005b34801561062f57600080fd5b5061064a600480360381019061064591906135fd565b6119d9565b6040516106579190612e8b565b60405180910390f35b34801561066c57600080fd5b506106876004803603810190610682919061363d565b611a6d565b005b610691611b19565b005b34801561069f57600080fd5b506106ba60048036038101906106b5919061321e565b611b1b565b005b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461071657600080fd5b600960008561ffff1661ffff168152602001908152602001600020805461073c906136cc565b905083511480156107825750600960008561ffff1661ffff168152602001908152602001600020604051610770919061379d565b60405180910390208380519060200120145b6107c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b890613826565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16631c37a822858585856040518563ffffffff1660e01b81526004016108009493929190613864565b600060405180830381600087803b15801561081a57600080fd5b505af192505050801561082b575060015b6108f7576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff1681526020019081526020016000208460405161087591906138e8565b908152602001604051809103902060008467ffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050507fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d848484846040516108ea9493929190613864565b60405180910390a16108f8565b5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109d957506109d882611c13565b5b9050919050565b6060600180546109ef906136cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1b906136cc565b8015610a685780601f10610a3d57610100808354040283529160200191610a68565b820191906000526020600020905b815481529060010190602001808311610a4b57829003601f168201915b5050505050905090565b6000610a7d82611c7d565b610abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab390613971565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0282610ef3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a90613a03565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b92611ce9565b73ffffffffffffffffffffffffffffffffffffffff161480610bc15750610bc081610bbb611ce9565b6119d9565b5b610c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf790613a95565b60405180910390fd5b610c0a8383611cf1565b505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7490613b27565b60405180910390fd5b610c8984848484611daa565b50505050565b610ca0610c9a611ce9565b82611dd7565b610cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd690613bb9565b60405180910390fd5b610cea838383611eb5565b505050565b610cf7611ce9565b73ffffffffffffffffffffffffffffffffffffffff16610d1561126c565b73ffffffffffffffffffffffffffffffffffffffff1614610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6290613c25565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610db390613c6b565b60006040518083038185875af1925050503d8060008114610df0576040519150601f19603f3d011682016040523d82523d6000602084013e610df5565b606091505b5050905080610e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3090613cf2565b60405180910390fd5b5050565b610e588383836040518060200160405280600081525061143d565b505050565b610e65611ce9565b73ffffffffffffffffffffffffffffffffffffffff16610e8361126c565b73ffffffffffffffffffffffffffffffffffffffff1614610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed090613c25565b60405180910390fd5b80600b9080519060200190610eef929190612a4f565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9390613d84565b60405180910390fd5b80915050919050565b60038160ff1610610feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe290613e16565b60405180910390fd5b600d548160ff16600c54610fff9190613e65565b1115611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103790613f07565b60405180910390fd5b61105e33600c6000815461105390613f27565b919050819055612111565b60028160ff1614156110895761108833600c6000815461107d90613f27565b919050819055612111565b5b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f490613fe2565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61114c611ce9565b73ffffffffffffffffffffffffffffffffffffffff1661116a61126c565b73ffffffffffffffffffffffffffffffffffffffff16146111c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b790613c25565b60405180910390fd5b6111ca600061212f565b565b600960205280600052604060002060009150905080546111eb906136cc565b80601f0160208091040260200160405190810160405280929190818152602001828054611217906136cc565b80156112645780601f1061123957610100808354040283529160200191611264565b820191906000526020600020905b81548152906001019060200180831161124757829003601f168201915b505050505081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60086020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050508060000154908060010154905082565b6112f1611ce9565b73ffffffffffffffffffffffffffffffffffffffff1661130f61126c565b73ffffffffffffffffffffffffffffffffffffffff1614611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c90613c25565b60405180910390fd5b80600e8190555050565b60606002805461137e906136cc565b80601f01602080910402602001604051908101604052809291908181526020018280546113aa906136cc565b80156113f75780601f106113cc576101008083540402835291602001916113f7565b820191906000526020600020905b8154815290600101906020018083116113da57829003601f168201915b5050505050905090565b61141361140c611ce9565b83836121f3565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61144e611448611ce9565b83611dd7565b61148d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148490613bb9565b60405180910390fd5b61149984848484612360565b50505050565b60606114aa82611c7d565b6114e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e090614074565b60405180910390fd5b60006114f36123bc565b90506000815111611513576040518060200160405280600081525061153e565b8061151d8461244e565b60405160200161152e9291906140d0565b6040516020818303038152906040525b915050919050565b61154f81610ef3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390614166565b60405180910390fd5b6000600960008461ffff1661ffff16815260200190815260200160002080546115e4906136cc565b905011611626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161d906141f8565b60405180910390fd5b61162f816125af565b60003382604051602001611644929190614218565b6040516020818303038152906040529050600060019050600081600e54604051602001611672929190614298565b60405160208183030381529060405290506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340a7bb108730876000876040518663ffffffff1660e01b81526004016116e99594939291906142c4565b604080518083038186803b15801561170057600080fd5b505afa158015611714573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611738919061433a565b5090508034101561177e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177590614412565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c58031003488600960008b61ffff1661ffff16815260200190815260200160002088336000896040518863ffffffff1660e01b81526004016117ff969594939291906144d3565b6000604051808303818588803b15801561181857600080fd5b505af115801561182c573d6000803e3d6000fd5b5050505050505050505050565b6000600860008761ffff1661ffff1681526020019081526020016000208560405161186491906138e8565b908152602001604051809103902060008567ffffffffffffffff16815260200190815260200160002090506000801b816001015414156118d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d0906145bb565b60405180910390fd5b8060000154838390501480156119095750806001015483836040516118ff929190614600565b6040518091039020145b611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193f90614665565b60405180910390fd5b600081600001819055506000801b81600101819055503073ffffffffffffffffffffffffffffffffffffffff16631c37a82287878787876040518663ffffffff1660e01b815260040161199f9594939291906146b2565b600060405180830381600087803b1580156119b957600080fd5b505af11580156119cd573d6000803e3d6000fd5b50505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a75611ce9565b73ffffffffffffffffffffffffffffffffffffffff16611a9361126c565b73ffffffffffffffffffffffffffffffffffffffff1614611ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae090613c25565b60405180910390fd5b8181600960008661ffff1661ffff1681526020019081526020016000209190611b13929190612ad5565b50505050565b565b611b23611ce9565b73ffffffffffffffffffffffffffffffffffffffff16611b4161126c565b73ffffffffffffffffffffffffffffffffffffffff1614611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e90613c25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfe90614779565b60405180910390fd5b611c108161212f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d6483610ef3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008082806020019051810190611dc191906147c5565b91509150611dcf8282612111565b505050505050565b6000611de282611c7d565b611e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1890614877565b60405180910390fd5b6000611e2c83610ef3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e9b57508373ffffffffffffffffffffffffffffffffffffffff16611e8384610a72565b73ffffffffffffffffffffffffffffffffffffffff16145b80611eac5750611eab81856119d9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ed582610ef3565b73ffffffffffffffffffffffffffffffffffffffff1614611f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2290614909565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f929061499b565b60405180910390fd5b611fa68383836126c0565b611fb1600082611cf1565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461200191906149bb565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120589190613e65565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61212b8282604051806020016040528060008152506126c5565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225990614a3b565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123539190612e8b565b60405180910390a3505050565b61236b848484611eb5565b61237784848484612720565b6123b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ad90614acd565b60405180910390fd5b50505050565b6060600b80546123cb906136cc565b80601f01602080910402602001604051908101604052809291908181526020018280546123f7906136cc565b80156124445780601f1061241957610100808354040283529160200191612444565b820191906000526020600020905b81548152906001019060200180831161242757829003601f168201915b5050505050905090565b60606000821415612496576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125aa565b600082905060005b600082146124c85780806124b190613f27565b915050600a826124c19190614b1c565b915061249e565b60008167ffffffffffffffff8111156124e4576124e3612be1565b5b6040519080825280601f01601f1916602001820160405280156125165781602001600182028036833780820191505090505b5090505b600085146125a35760018261252f91906149bb565b9150600a8561253e9190614b4d565b603061254a9190613e65565b60f81b8183815181106125605761255f614b7e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561259c9190614b1c565b945061251a565b8093505050505b919050565b60006125ba82610ef3565b90506125c8816000846126c0565b6125d3600083611cf1565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461262391906149bb565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6126cf83836128b7565b6126dc6000848484612720565b61271b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271290614acd565b60405180910390fd5b505050565b60006127418473ffffffffffffffffffffffffffffffffffffffff16612a3c565b156128aa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261276a611ce9565b8786866040518563ffffffff1660e01b815260040161278c9493929190614bad565b602060405180830381600087803b1580156127a657600080fd5b505af19250505080156127d757506040513d601f19601f820116820180604052508101906127d49190614c0e565b60015b61285a573d8060008114612807576040519150601f19603f3d011682016040523d82523d6000602084013e61280c565b606091505b50600081511415612852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284990614acd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128af565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291e90614c87565b60405180910390fd5b612933600083836126c0565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129839190613e65565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612a5b906136cc565b90600052602060002090601f016020900481019282612a7d5760008555612ac4565b82601f10612a9657805160ff1916838001178555612ac4565b82800160010185558215612ac4579182015b82811115612ac3578251825591602001919060010190612aa8565b5b509050612ad19190612b5b565b5090565b828054612ae1906136cc565b90600052602060002090601f016020900481019282612b035760008555612b4a565b82601f10612b1c57803560ff1916838001178555612b4a565b82800160010185558215612b4a579182015b82811115612b49578235825591602001919060010190612b2e565b5b509050612b579190612b5b565b5090565b5b80821115612b74576000816000905550600101612b5c565b5090565b6000604051905090565b600080fd5b600080fd5b600061ffff82169050919050565b612ba381612b8c565b8114612bae57600080fd5b50565b600081359050612bc081612b9a565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c1982612bd0565b810181811067ffffffffffffffff82111715612c3857612c37612be1565b5b80604052505050565b6000612c4b612b78565b9050612c578282612c10565b919050565b600067ffffffffffffffff821115612c7757612c76612be1565b5b612c8082612bd0565b9050602081019050919050565b82818337600083830152505050565b6000612caf612caa84612c5c565b612c41565b905082815260208101848484011115612ccb57612cca612bcb565b5b612cd6848285612c8d565b509392505050565b600082601f830112612cf357612cf2612bc6565b5b8135612d03848260208601612c9c565b91505092915050565b600067ffffffffffffffff82169050919050565b612d2981612d0c565b8114612d3457600080fd5b50565b600081359050612d4681612d20565b92915050565b60008060008060808587031215612d6657612d65612b82565b5b6000612d7487828801612bb1565b945050602085013567ffffffffffffffff811115612d9557612d94612b87565b5b612da187828801612cde565b9350506040612db287828801612d37565b925050606085013567ffffffffffffffff811115612dd357612dd2612b87565b5b612ddf87828801612cde565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e2081612deb565b8114612e2b57600080fd5b50565b600081359050612e3d81612e17565b92915050565b600060208284031215612e5957612e58612b82565b5b6000612e6784828501612e2e565b91505092915050565b60008115159050919050565b612e8581612e70565b82525050565b6000602082019050612ea06000830184612e7c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ee0578082015181840152602081019050612ec5565b83811115612eef576000848401525b50505050565b6000612f0082612ea6565b612f0a8185612eb1565b9350612f1a818560208601612ec2565b612f2381612bd0565b840191505092915050565b60006020820190508181036000830152612f488184612ef5565b905092915050565b6000819050919050565b612f6381612f50565b8114612f6e57600080fd5b50565b600081359050612f8081612f5a565b92915050565b600060208284031215612f9c57612f9b612b82565b5b6000612faa84828501612f71565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fde82612fb3565b9050919050565b612fee81612fd3565b82525050565b60006020820190506130096000830184612fe5565b92915050565b61301881612fd3565b811461302357600080fd5b50565b6000813590506130358161300f565b92915050565b6000806040838503121561305257613051612b82565b5b600061306085828601613026565b925050602061307185828601612f71565b9150509250929050565b60008060006060848603121561309457613093612b82565b5b60006130a286828701613026565b93505060206130b386828701613026565b92505060406130c486828701612f71565b9150509250925092565b600067ffffffffffffffff8211156130e9576130e8612be1565b5b6130f282612bd0565b9050602081019050919050565b600061311261310d846130ce565b612c41565b90508281526020810184848401111561312e5761312d612bcb565b5b613139848285612c8d565b509392505050565b600082601f83011261315657613155612bc6565b5b81356131668482602086016130ff565b91505092915050565b60006020828403121561318557613184612b82565b5b600082013567ffffffffffffffff8111156131a3576131a2612b87565b5b6131af84828501613141565b91505092915050565b600060ff82169050919050565b6131ce816131b8565b81146131d957600080fd5b50565b6000813590506131eb816131c5565b92915050565b60006020828403121561320757613206612b82565b5b6000613215848285016131dc565b91505092915050565b60006020828403121561323457613233612b82565b5b600061324284828501613026565b91505092915050565b61325481612f50565b82525050565b600060208201905061326f600083018461324b565b92915050565b60006020828403121561328b5761328a612b82565b5b600061329984828501612bb1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006132c9826132a2565b6132d381856132ad565b93506132e3818560208601612ec2565b6132ec81612bd0565b840191505092915050565b6000602082019050818103600083015261331181846132be565b905092915050565b60008060006060848603121561333257613331612b82565b5b600061334086828701612bb1565b935050602084013567ffffffffffffffff81111561336157613360612b87565b5b61336d86828701612cde565b925050604061337e86828701612f71565b9150509250925092565b6000819050919050565b61339b81613388565b82525050565b60006040820190506133b6600083018561324b565b6133c36020830184613392565b9392505050565b6133d381612e70565b81146133de57600080fd5b50565b6000813590506133f0816133ca565b92915050565b6000806040838503121561340d5761340c612b82565b5b600061341b85828601613026565b925050602061342c858286016133e1565b9150509250929050565b600080600080608085870312156134505761344f612b82565b5b600061345e87828801613026565b945050602061346f87828801613026565b935050604061348087828801612f71565b925050606085013567ffffffffffffffff8111156134a1576134a0612b87565b5b6134ad87828801612cde565b91505092959194509250565b600080604083850312156134d0576134cf612b82565b5b60006134de85828601612bb1565b92505060206134ef85828601612f71565b9150509250929050565b600080fd5b600080fd5b60008083601f84011261351957613518612bc6565b5b8235905067ffffffffffffffff811115613536576135356134f9565b5b602083019150836001820283011115613552576135516134fe565b5b9250929050565b60008060008060006080868803121561357557613574612b82565b5b600061358388828901612bb1565b955050602086013567ffffffffffffffff8111156135a4576135a3612b87565b5b6135b088828901612cde565b94505060406135c188828901612d37565b935050606086013567ffffffffffffffff8111156135e2576135e1612b87565b5b6135ee88828901613503565b92509250509295509295909350565b6000806040838503121561361457613613612b82565b5b600061362285828601613026565b925050602061363385828601613026565b9150509250929050565b60008060006040848603121561365657613655612b82565b5b600061366486828701612bb1565b935050602084013567ffffffffffffffff81111561368557613684612b87565b5b61369186828701613503565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136e457607f821691505b602082108114156136f8576136f761369d565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461372b816136cc565b61373581866136fe565b94506001821660008114613750576001811461376157613794565b60ff19831686528186019350613794565b61376a85613709565b60005b8381101561378c5781548189015260018201915060208101905061376d565b838801955050505b50505092915050565b60006137a9828461371e565b915081905092915050565b7f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f7560008201527f7263652073656e64696e6720636f6e7472616374000000000000000000000000602082015250565b6000613810603483612eb1565b915061381b826137b4565b604082019050919050565b6000602082019050818103600083015261383f81613803565b9050919050565b61384f81612b8c565b82525050565b61385e81612d0c565b82525050565b60006080820190506138796000830187613846565b818103602083015261388b81866132be565b905061389a6040830185613855565b81810360608301526138ac81846132be565b905095945050505050565b60006138c2826132a2565b6138cc81856136fe565b93506138dc818560208601612ec2565b80840191505092915050565b60006138f482846138b7565b915081905092915050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061395b602c83612eb1565b9150613966826138ff565b604082019050919050565b6000602082019050818103600083015261398a8161394e565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006139ed602183612eb1565b91506139f882613991565b604082019050919050565b60006020820190508181036000830152613a1c816139e0565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613a7f603883612eb1565b9150613a8a82613a23565b604082019050919050565b60006020820190508181036000830152613aae81613a72565b9050919050565b7f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460008201527f206265204272696467652e000000000000000000000000000000000000000000602082015250565b6000613b11602b83612eb1565b9150613b1c82613ab5565b604082019050919050565b60006020820190508181036000830152613b4081613b04565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613ba3603183612eb1565b9150613bae82613b47565b604082019050919050565b60006020820190508181036000830152613bd281613b96565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c0f602083612eb1565b9150613c1a82613bd9565b602082019050919050565b60006020820190508181036000830152613c3e81613c02565b9050919050565b50565b6000613c556000836136fe565b9150613c6082613c45565b600082019050919050565b6000613c7682613c48565b9150819050919050565b7f74696e792064696e6f733a204661696c656420746f207769746864726177204560008201527f7468657200000000000000000000000000000000000000000000000000000000602082015250565b6000613cdc602483612eb1565b9150613ce782613c80565b604082019050919050565b60006020820190508181036000830152613d0b81613ccf565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613d6e602983612eb1565b9150613d7982613d12565b604082019050919050565b60006020820190508181036000830152613d9d81613d61565b9050919050565b7f74696e792064696e6f733a204d61782032204e46547320706572207472616e7360008201527f616374696f6e0000000000000000000000000000000000000000000000000000602082015250565b6000613e00602683612eb1565b9150613e0b82613da4565b604082019050919050565b60006020820190508181036000830152613e2f81613df3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e7082612f50565b9150613e7b83612f50565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613eb057613eaf613e36565b5b828201905092915050565b7f74696e792064696e6f733a204d696e74206578636565647320737570706c7900600082015250565b6000613ef1601f83612eb1565b9150613efc82613ebb565b602082019050919050565b60006020820190508181036000830152613f2081613ee4565b9050919050565b6000613f3282612f50565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f6557613f64613e36565b5b600182019050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613fcc602a83612eb1565b9150613fd782613f70565b604082019050919050565b60006020820190508181036000830152613ffb81613fbf565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061405e602f83612eb1565b915061406982614002565b604082019050919050565b6000602082019050818103600083015261408d81614051565b9050919050565b600081905092915050565b60006140aa82612ea6565b6140b48185614094565b93506140c4818560208601612ec2565b80840191505092915050565b60006140dc828561409f565b91506140e8828461409f565b91508190509392505050565b7f596f75206d757374206f776e2074686520746f6b656e20746f2074726176657260008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b6000614150602283612eb1565b915061415b826140f4565b604082019050919050565b6000602082019050818103600083015261417f81614143565b9050919050565b7f5468697320636861696e2069732063757272656e746c7920756e617661696c6160008201527f626c6520666f722074726176656c000000000000000000000000000000000000602082015250565b60006141e2602e83612eb1565b91506141ed82614186565b604082019050919050565b60006020820190508181036000830152614211816141d5565b9050919050565b600060408201905061422d6000830185612fe5565b61423a602083018461324b565b9392505050565b60008160f01b9050919050565b600061425982614241565b9050919050565b61427161426c82612b8c565b61424e565b82525050565b6000819050919050565b61429261428d82612f50565b614277565b82525050565b60006142a48285614260565b6002820191506142b48284614281565b6020820191508190509392505050565b600060a0820190506142d96000830188613846565b6142e66020830187612fe5565b81810360408301526142f881866132be565b90506143076060830185612e7c565b818103608083015261431981846132be565b90509695505050505050565b60008151905061433481612f5a565b92915050565b6000806040838503121561435157614350612b82565b5b600061435f85828601614325565b925050602061437085828601614325565b9150509250929050565b7f74696e792064696e6f733a206d73672e76616c7565206e6f7420656e6f75676860008201527f20746f20636f766572206d6573736167654665652e2053656e6420676173206660208201527f6f72206d65737361676520666565730000000000000000000000000000000000604082015250565b60006143fc604f83612eb1565b91506144078261437a565b606082019050919050565b6000602082019050818103600083015261442b816143ef565b9050919050565b6000815461443f816136cc565b61444981866132ad565b945060018216600081146144645760018114614476576144a9565b60ff19831686526020860193506144a9565b61447f85613709565b60005b838110156144a157815481890152600182019150602081019050614482565b808801955050505b50505092915050565b60006144bd82612fb3565b9050919050565b6144cd816144b2565b82525050565b600060c0820190506144e86000830189613846565b81810360208301526144fa8188614432565b9050818103604083015261450e81876132be565b905061451d60608301866144c4565b61452a6080830185612fe5565b81810360a083015261453c81846132be565b9050979650505050505050565b7f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60008201527f6573736167650000000000000000000000000000000000000000000000000000602082015250565b60006145a5602683612eb1565b91506145b082614549565b604082019050919050565b600060208201905081810360008301526145d481614598565b9050919050565b60006145e783856136fe565b93506145f4838584612c8d565b82840190509392505050565b600061460d8284866145db565b91508190509392505050565b7f4c617965725a65726f3a20696e76616c6964207061796c6f6164000000000000600082015250565b600061464f601a83612eb1565b915061465a82614619565b602082019050919050565b6000602082019050818103600083015261467e81614642565b9050919050565b600061469183856132ad565b935061469e838584612c8d565b6146a783612bd0565b840190509392505050565b60006080820190506146c76000830188613846565b81810360208301526146d981876132be565b90506146e86040830186613855565b81810360608301526146fb818486614685565b90509695505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614763602683612eb1565b915061476e82614707565b604082019050919050565b6000602082019050818103600083015261479281614756565b9050919050565b6147a2816144b2565b81146147ad57600080fd5b50565b6000815190506147bf81614799565b92915050565b600080604083850312156147dc576147db612b82565b5b60006147ea858286016147b0565b92505060206147fb85828601614325565b9150509250929050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614861602c83612eb1565b915061486c82614805565b604082019050919050565b6000602082019050818103600083015261489081614854565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006148f3602983612eb1565b91506148fe82614897565b604082019050919050565b60006020820190508181036000830152614922816148e6565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614985602483612eb1565b915061499082614929565b604082019050919050565b600060208201905081810360008301526149b481614978565b9050919050565b60006149c682612f50565b91506149d183612f50565b9250828210156149e4576149e3613e36565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614a25601983612eb1565b9150614a30826149ef565b602082019050919050565b60006020820190508181036000830152614a5481614a18565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614ab7603283612eb1565b9150614ac282614a5b565b604082019050919050565b60006020820190508181036000830152614ae681614aaa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614b2782612f50565b9150614b3283612f50565b925082614b4257614b41614aed565b5b828204905092915050565b6000614b5882612f50565b9150614b6383612f50565b925082614b7357614b72614aed565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000608082019050614bc26000830187612fe5565b614bcf6020830186612fe5565b614bdc604083018561324b565b8181036060830152614bee81846132be565b905095945050505050565b600081519050614c0881612e17565b92915050565b600060208284031215614c2457614c23612b82565b5b6000614c3284828501614bf9565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614c71602083612eb1565b9150614c7c82614c3b565b602082019050919050565b60006020820190508181036000830152614ca081614c64565b905091905056fea2646970667358221220a26308d94432bf952f70f18f4ef99788a52e0d8c5479f5c21336663bde72828f64736f6c63430008090033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d503163666e696d70364458425877517a51637133575637754c4252437a586b4e66355937647a6b677135736b2f00000000000000000000
Deployed Bytecode
0x6080604052600436106101c15760003560e01c80637533d788116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c514610623578063eb8d72b714610660578063ed88c68e14610689578063f2fde38b14610693576101c1565b8063b88d4fde14610585578063c87b56dd146105ae578063cf89fa03146105eb578063d1deba1f14610607576101c1565b8063943fb872116100d1578063943fb872146104dd57806395d89b4114610506578063a22cb46514610531578063b2bdfa7b1461055a576101c1565b80637533d788146104375780638da5cb5b146104745780638ee749121461049f576101c1565b80632e1a7d4d116101645780636352211e1161013e5780636352211e1461038a5780636ecd2306146103c757806370a08231146103e3578063715018a614610420576101c1565b80632e1a7d4d1461030f57806342842e0e1461033857806355f804b314610361576101c1565b8063081812fc116101a0578063081812fc14610257578063095ea7b3146102945780631c37a822146102bd57806323b872dd146102e6576101c1565b80621d3567146101c657806301ffc9a7146101ef57806306fdde031461022c575b600080fd5b3480156101d257600080fd5b506101ed60048036038101906101e89190612d4c565b6106bc565b005b3480156101fb57600080fd5b5061021660048036038101906102119190612e43565b6108fe565b6040516102239190612e8b565b60405180910390f35b34801561023857600080fd5b506102416109e0565b60405161024e9190612f2e565b60405180910390f35b34801561026357600080fd5b5061027e60048036038101906102799190612f86565b610a72565b60405161028b9190612ff4565b60405180910390f35b3480156102a057600080fd5b506102bb60048036038101906102b6919061303b565b610af7565b005b3480156102c957600080fd5b506102e460048036038101906102df9190612d4c565b610c0f565b005b3480156102f257600080fd5b5061030d6004803603810190610308919061307b565b610c8f565b005b34801561031b57600080fd5b5061033660048036038101906103319190612f86565b610cef565b005b34801561034457600080fd5b5061035f600480360381019061035a919061307b565b610e3d565b005b34801561036d57600080fd5b506103886004803603810190610383919061316f565b610e5d565b005b34801561039657600080fd5b506103b160048036038101906103ac9190612f86565b610ef3565b6040516103be9190612ff4565b60405180910390f35b6103e160048036038101906103dc91906131f1565b610fa5565b005b3480156103ef57600080fd5b5061040a6004803603810190610405919061321e565b61108c565b604051610417919061325a565b60405180910390f35b34801561042c57600080fd5b50610435611144565b005b34801561044357600080fd5b5061045e60048036038101906104599190613275565b6111cc565b60405161046b91906132f7565b60405180910390f35b34801561048057600080fd5b5061048961126c565b6040516104969190612ff4565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190613319565b611295565b6040516104d49291906133a1565b60405180910390f35b3480156104e957600080fd5b5061050460048036038101906104ff9190612f86565b6112e9565b005b34801561051257600080fd5b5061051b61136f565b6040516105289190612f2e565b60405180910390f35b34801561053d57600080fd5b50610558600480360381019061055391906133f6565b611401565b005b34801561056657600080fd5b5061056f611417565b60405161057c9190612ff4565b60405180910390f35b34801561059157600080fd5b506105ac60048036038101906105a79190613436565b61143d565b005b3480156105ba57600080fd5b506105d560048036038101906105d09190612f86565b61149f565b6040516105e29190612f2e565b60405180910390f35b610605600480360381019061060091906134b9565b611546565b005b610621600480360381019061061c9190613559565b611839565b005b34801561062f57600080fd5b5061064a600480360381019061064591906135fd565b6119d9565b6040516106579190612e8b565b60405180910390f35b34801561066c57600080fd5b506106876004803603810190610682919061363d565b611a6d565b005b610691611b19565b005b34801561069f57600080fd5b506106ba60048036038101906106b5919061321e565b611b1b565b005b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461071657600080fd5b600960008561ffff1661ffff168152602001908152602001600020805461073c906136cc565b905083511480156107825750600960008561ffff1661ffff168152602001908152602001600020604051610770919061379d565b60405180910390208380519060200120145b6107c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b890613826565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16631c37a822858585856040518563ffffffff1660e01b81526004016108009493929190613864565b600060405180830381600087803b15801561081a57600080fd5b505af192505050801561082b575060015b6108f7576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff1681526020019081526020016000208460405161087591906138e8565b908152602001604051809103902060008467ffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050507fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d848484846040516108ea9493929190613864565b60405180910390a16108f8565b5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109d957506109d882611c13565b5b9050919050565b6060600180546109ef906136cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1b906136cc565b8015610a685780601f10610a3d57610100808354040283529160200191610a68565b820191906000526020600020905b815481529060010190602001808311610a4b57829003601f168201915b5050505050905090565b6000610a7d82611c7d565b610abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab390613971565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0282610ef3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a90613a03565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b92611ce9565b73ffffffffffffffffffffffffffffffffffffffff161480610bc15750610bc081610bbb611ce9565b6119d9565b5b610c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf790613a95565b60405180910390fd5b610c0a8383611cf1565b505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7490613b27565b60405180910390fd5b610c8984848484611daa565b50505050565b610ca0610c9a611ce9565b82611dd7565b610cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd690613bb9565b60405180910390fd5b610cea838383611eb5565b505050565b610cf7611ce9565b73ffffffffffffffffffffffffffffffffffffffff16610d1561126c565b73ffffffffffffffffffffffffffffffffffffffff1614610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6290613c25565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610db390613c6b565b60006040518083038185875af1925050503d8060008114610df0576040519150601f19603f3d011682016040523d82523d6000602084013e610df5565b606091505b5050905080610e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3090613cf2565b60405180910390fd5b5050565b610e588383836040518060200160405280600081525061143d565b505050565b610e65611ce9565b73ffffffffffffffffffffffffffffffffffffffff16610e8361126c565b73ffffffffffffffffffffffffffffffffffffffff1614610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed090613c25565b60405180910390fd5b80600b9080519060200190610eef929190612a4f565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9390613d84565b60405180910390fd5b80915050919050565b60038160ff1610610feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe290613e16565b60405180910390fd5b600d548160ff16600c54610fff9190613e65565b1115611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103790613f07565b60405180910390fd5b61105e33600c6000815461105390613f27565b919050819055612111565b60028160ff1614156110895761108833600c6000815461107d90613f27565b919050819055612111565b5b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f490613fe2565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61114c611ce9565b73ffffffffffffffffffffffffffffffffffffffff1661116a61126c565b73ffffffffffffffffffffffffffffffffffffffff16146111c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b790613c25565b60405180910390fd5b6111ca600061212f565b565b600960205280600052604060002060009150905080546111eb906136cc565b80601f0160208091040260200160405190810160405280929190818152602001828054611217906136cc565b80156112645780601f1061123957610100808354040283529160200191611264565b820191906000526020600020905b81548152906001019060200180831161124757829003601f168201915b505050505081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60086020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050508060000154908060010154905082565b6112f1611ce9565b73ffffffffffffffffffffffffffffffffffffffff1661130f61126c565b73ffffffffffffffffffffffffffffffffffffffff1614611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c90613c25565b60405180910390fd5b80600e8190555050565b60606002805461137e906136cc565b80601f01602080910402602001604051908101604052809291908181526020018280546113aa906136cc565b80156113f75780601f106113cc576101008083540402835291602001916113f7565b820191906000526020600020905b8154815290600101906020018083116113da57829003601f168201915b5050505050905090565b61141361140c611ce9565b83836121f3565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61144e611448611ce9565b83611dd7565b61148d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148490613bb9565b60405180910390fd5b61149984848484612360565b50505050565b60606114aa82611c7d565b6114e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e090614074565b60405180910390fd5b60006114f36123bc565b90506000815111611513576040518060200160405280600081525061153e565b8061151d8461244e565b60405160200161152e9291906140d0565b6040516020818303038152906040525b915050919050565b61154f81610ef3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390614166565b60405180910390fd5b6000600960008461ffff1661ffff16815260200190815260200160002080546115e4906136cc565b905011611626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161d906141f8565b60405180910390fd5b61162f816125af565b60003382604051602001611644929190614218565b6040516020818303038152906040529050600060019050600081600e54604051602001611672929190614298565b60405160208183030381529060405290506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340a7bb108730876000876040518663ffffffff1660e01b81526004016116e99594939291906142c4565b604080518083038186803b15801561170057600080fd5b505afa158015611714573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611738919061433a565b5090508034101561177e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177590614412565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c58031003488600960008b61ffff1661ffff16815260200190815260200160002088336000896040518863ffffffff1660e01b81526004016117ff969594939291906144d3565b6000604051808303818588803b15801561181857600080fd5b505af115801561182c573d6000803e3d6000fd5b5050505050505050505050565b6000600860008761ffff1661ffff1681526020019081526020016000208560405161186491906138e8565b908152602001604051809103902060008567ffffffffffffffff16815260200190815260200160002090506000801b816001015414156118d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d0906145bb565b60405180910390fd5b8060000154838390501480156119095750806001015483836040516118ff929190614600565b6040518091039020145b611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193f90614665565b60405180910390fd5b600081600001819055506000801b81600101819055503073ffffffffffffffffffffffffffffffffffffffff16631c37a82287878787876040518663ffffffff1660e01b815260040161199f9594939291906146b2565b600060405180830381600087803b1580156119b957600080fd5b505af11580156119cd573d6000803e3d6000fd5b50505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a75611ce9565b73ffffffffffffffffffffffffffffffffffffffff16611a9361126c565b73ffffffffffffffffffffffffffffffffffffffff1614611ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae090613c25565b60405180910390fd5b8181600960008661ffff1661ffff1681526020019081526020016000209190611b13929190612ad5565b50505050565b565b611b23611ce9565b73ffffffffffffffffffffffffffffffffffffffff16611b4161126c565b73ffffffffffffffffffffffffffffffffffffffff1614611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e90613c25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfe90614779565b60405180910390fd5b611c108161212f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d6483610ef3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008082806020019051810190611dc191906147c5565b91509150611dcf8282612111565b505050505050565b6000611de282611c7d565b611e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1890614877565b60405180910390fd5b6000611e2c83610ef3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e9b57508373ffffffffffffffffffffffffffffffffffffffff16611e8384610a72565b73ffffffffffffffffffffffffffffffffffffffff16145b80611eac5750611eab81856119d9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ed582610ef3565b73ffffffffffffffffffffffffffffffffffffffff1614611f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2290614909565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f929061499b565b60405180910390fd5b611fa68383836126c0565b611fb1600082611cf1565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461200191906149bb565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120589190613e65565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61212b8282604051806020016040528060008152506126c5565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225990614a3b565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123539190612e8b565b60405180910390a3505050565b61236b848484611eb5565b61237784848484612720565b6123b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ad90614acd565b60405180910390fd5b50505050565b6060600b80546123cb906136cc565b80601f01602080910402602001604051908101604052809291908181526020018280546123f7906136cc565b80156124445780601f1061241957610100808354040283529160200191612444565b820191906000526020600020905b81548152906001019060200180831161242757829003601f168201915b5050505050905090565b60606000821415612496576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125aa565b600082905060005b600082146124c85780806124b190613f27565b915050600a826124c19190614b1c565b915061249e565b60008167ffffffffffffffff8111156124e4576124e3612be1565b5b6040519080825280601f01601f1916602001820160405280156125165781602001600182028036833780820191505090505b5090505b600085146125a35760018261252f91906149bb565b9150600a8561253e9190614b4d565b603061254a9190613e65565b60f81b8183815181106125605761255f614b7e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561259c9190614b1c565b945061251a565b8093505050505b919050565b60006125ba82610ef3565b90506125c8816000846126c0565b6125d3600083611cf1565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461262391906149bb565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6126cf83836128b7565b6126dc6000848484612720565b61271b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271290614acd565b60405180910390fd5b505050565b60006127418473ffffffffffffffffffffffffffffffffffffffff16612a3c565b156128aa578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261276a611ce9565b8786866040518563ffffffff1660e01b815260040161278c9493929190614bad565b602060405180830381600087803b1580156127a657600080fd5b505af19250505080156127d757506040513d601f19601f820116820180604052508101906127d49190614c0e565b60015b61285a573d8060008114612807576040519150601f19603f3d011682016040523d82523d6000602084013e61280c565b606091505b50600081511415612852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284990614acd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128af565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291e90614c87565b60405180910390fd5b612933600083836126c0565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129839190613e65565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612a5b906136cc565b90600052602060002090601f016020900481019282612a7d5760008555612ac4565b82601f10612a9657805160ff1916838001178555612ac4565b82800160010185558215612ac4579182015b82811115612ac3578251825591602001919060010190612aa8565b5b509050612ad19190612b5b565b5090565b828054612ae1906136cc565b90600052602060002090601f016020900481019282612b035760008555612b4a565b82601f10612b1c57803560ff1916838001178555612b4a565b82800160010185558215612b4a579182015b82811115612b49578235825591602001919060010190612b2e565b5b509050612b579190612b5b565b5090565b5b80821115612b74576000816000905550600101612b5c565b5090565b6000604051905090565b600080fd5b600080fd5b600061ffff82169050919050565b612ba381612b8c565b8114612bae57600080fd5b50565b600081359050612bc081612b9a565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c1982612bd0565b810181811067ffffffffffffffff82111715612c3857612c37612be1565b5b80604052505050565b6000612c4b612b78565b9050612c578282612c10565b919050565b600067ffffffffffffffff821115612c7757612c76612be1565b5b612c8082612bd0565b9050602081019050919050565b82818337600083830152505050565b6000612caf612caa84612c5c565b612c41565b905082815260208101848484011115612ccb57612cca612bcb565b5b612cd6848285612c8d565b509392505050565b600082601f830112612cf357612cf2612bc6565b5b8135612d03848260208601612c9c565b91505092915050565b600067ffffffffffffffff82169050919050565b612d2981612d0c565b8114612d3457600080fd5b50565b600081359050612d4681612d20565b92915050565b60008060008060808587031215612d6657612d65612b82565b5b6000612d7487828801612bb1565b945050602085013567ffffffffffffffff811115612d9557612d94612b87565b5b612da187828801612cde565b9350506040612db287828801612d37565b925050606085013567ffffffffffffffff811115612dd357612dd2612b87565b5b612ddf87828801612cde565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e2081612deb565b8114612e2b57600080fd5b50565b600081359050612e3d81612e17565b92915050565b600060208284031215612e5957612e58612b82565b5b6000612e6784828501612e2e565b91505092915050565b60008115159050919050565b612e8581612e70565b82525050565b6000602082019050612ea06000830184612e7c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ee0578082015181840152602081019050612ec5565b83811115612eef576000848401525b50505050565b6000612f0082612ea6565b612f0a8185612eb1565b9350612f1a818560208601612ec2565b612f2381612bd0565b840191505092915050565b60006020820190508181036000830152612f488184612ef5565b905092915050565b6000819050919050565b612f6381612f50565b8114612f6e57600080fd5b50565b600081359050612f8081612f5a565b92915050565b600060208284031215612f9c57612f9b612b82565b5b6000612faa84828501612f71565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fde82612fb3565b9050919050565b612fee81612fd3565b82525050565b60006020820190506130096000830184612fe5565b92915050565b61301881612fd3565b811461302357600080fd5b50565b6000813590506130358161300f565b92915050565b6000806040838503121561305257613051612b82565b5b600061306085828601613026565b925050602061307185828601612f71565b9150509250929050565b60008060006060848603121561309457613093612b82565b5b60006130a286828701613026565b93505060206130b386828701613026565b92505060406130c486828701612f71565b9150509250925092565b600067ffffffffffffffff8211156130e9576130e8612be1565b5b6130f282612bd0565b9050602081019050919050565b600061311261310d846130ce565b612c41565b90508281526020810184848401111561312e5761312d612bcb565b5b613139848285612c8d565b509392505050565b600082601f83011261315657613155612bc6565b5b81356131668482602086016130ff565b91505092915050565b60006020828403121561318557613184612b82565b5b600082013567ffffffffffffffff8111156131a3576131a2612b87565b5b6131af84828501613141565b91505092915050565b600060ff82169050919050565b6131ce816131b8565b81146131d957600080fd5b50565b6000813590506131eb816131c5565b92915050565b60006020828403121561320757613206612b82565b5b6000613215848285016131dc565b91505092915050565b60006020828403121561323457613233612b82565b5b600061324284828501613026565b91505092915050565b61325481612f50565b82525050565b600060208201905061326f600083018461324b565b92915050565b60006020828403121561328b5761328a612b82565b5b600061329984828501612bb1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006132c9826132a2565b6132d381856132ad565b93506132e3818560208601612ec2565b6132ec81612bd0565b840191505092915050565b6000602082019050818103600083015261331181846132be565b905092915050565b60008060006060848603121561333257613331612b82565b5b600061334086828701612bb1565b935050602084013567ffffffffffffffff81111561336157613360612b87565b5b61336d86828701612cde565b925050604061337e86828701612f71565b9150509250925092565b6000819050919050565b61339b81613388565b82525050565b60006040820190506133b6600083018561324b565b6133c36020830184613392565b9392505050565b6133d381612e70565b81146133de57600080fd5b50565b6000813590506133f0816133ca565b92915050565b6000806040838503121561340d5761340c612b82565b5b600061341b85828601613026565b925050602061342c858286016133e1565b9150509250929050565b600080600080608085870312156134505761344f612b82565b5b600061345e87828801613026565b945050602061346f87828801613026565b935050604061348087828801612f71565b925050606085013567ffffffffffffffff8111156134a1576134a0612b87565b5b6134ad87828801612cde565b91505092959194509250565b600080604083850312156134d0576134cf612b82565b5b60006134de85828601612bb1565b92505060206134ef85828601612f71565b9150509250929050565b600080fd5b600080fd5b60008083601f84011261351957613518612bc6565b5b8235905067ffffffffffffffff811115613536576135356134f9565b5b602083019150836001820283011115613552576135516134fe565b5b9250929050565b60008060008060006080868803121561357557613574612b82565b5b600061358388828901612bb1565b955050602086013567ffffffffffffffff8111156135a4576135a3612b87565b5b6135b088828901612cde565b94505060406135c188828901612d37565b935050606086013567ffffffffffffffff8111156135e2576135e1612b87565b5b6135ee88828901613503565b92509250509295509295909350565b6000806040838503121561361457613613612b82565b5b600061362285828601613026565b925050602061363385828601613026565b9150509250929050565b60008060006040848603121561365657613655612b82565b5b600061366486828701612bb1565b935050602084013567ffffffffffffffff81111561368557613684612b87565b5b61369186828701613503565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136e457607f821691505b602082108114156136f8576136f761369d565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461372b816136cc565b61373581866136fe565b94506001821660008114613750576001811461376157613794565b60ff19831686528186019350613794565b61376a85613709565b60005b8381101561378c5781548189015260018201915060208101905061376d565b838801955050505b50505092915050565b60006137a9828461371e565b915081905092915050565b7f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f7560008201527f7263652073656e64696e6720636f6e7472616374000000000000000000000000602082015250565b6000613810603483612eb1565b915061381b826137b4565b604082019050919050565b6000602082019050818103600083015261383f81613803565b9050919050565b61384f81612b8c565b82525050565b61385e81612d0c565b82525050565b60006080820190506138796000830187613846565b818103602083015261388b81866132be565b905061389a6040830185613855565b81810360608301526138ac81846132be565b905095945050505050565b60006138c2826132a2565b6138cc81856136fe565b93506138dc818560208601612ec2565b80840191505092915050565b60006138f482846138b7565b915081905092915050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061395b602c83612eb1565b9150613966826138ff565b604082019050919050565b6000602082019050818103600083015261398a8161394e565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006139ed602183612eb1565b91506139f882613991565b604082019050919050565b60006020820190508181036000830152613a1c816139e0565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613a7f603883612eb1565b9150613a8a82613a23565b604082019050919050565b60006020820190508181036000830152613aae81613a72565b9050919050565b7f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460008201527f206265204272696467652e000000000000000000000000000000000000000000602082015250565b6000613b11602b83612eb1565b9150613b1c82613ab5565b604082019050919050565b60006020820190508181036000830152613b4081613b04565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613ba3603183612eb1565b9150613bae82613b47565b604082019050919050565b60006020820190508181036000830152613bd281613b96565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c0f602083612eb1565b9150613c1a82613bd9565b602082019050919050565b60006020820190508181036000830152613c3e81613c02565b9050919050565b50565b6000613c556000836136fe565b9150613c6082613c45565b600082019050919050565b6000613c7682613c48565b9150819050919050565b7f74696e792064696e6f733a204661696c656420746f207769746864726177204560008201527f7468657200000000000000000000000000000000000000000000000000000000602082015250565b6000613cdc602483612eb1565b9150613ce782613c80565b604082019050919050565b60006020820190508181036000830152613d0b81613ccf565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613d6e602983612eb1565b9150613d7982613d12565b604082019050919050565b60006020820190508181036000830152613d9d81613d61565b9050919050565b7f74696e792064696e6f733a204d61782032204e46547320706572207472616e7360008201527f616374696f6e0000000000000000000000000000000000000000000000000000602082015250565b6000613e00602683612eb1565b9150613e0b82613da4565b604082019050919050565b60006020820190508181036000830152613e2f81613df3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e7082612f50565b9150613e7b83612f50565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613eb057613eaf613e36565b5b828201905092915050565b7f74696e792064696e6f733a204d696e74206578636565647320737570706c7900600082015250565b6000613ef1601f83612eb1565b9150613efc82613ebb565b602082019050919050565b60006020820190508181036000830152613f2081613ee4565b9050919050565b6000613f3282612f50565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f6557613f64613e36565b5b600182019050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613fcc602a83612eb1565b9150613fd782613f70565b604082019050919050565b60006020820190508181036000830152613ffb81613fbf565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061405e602f83612eb1565b915061406982614002565b604082019050919050565b6000602082019050818103600083015261408d81614051565b9050919050565b600081905092915050565b60006140aa82612ea6565b6140b48185614094565b93506140c4818560208601612ec2565b80840191505092915050565b60006140dc828561409f565b91506140e8828461409f565b91508190509392505050565b7f596f75206d757374206f776e2074686520746f6b656e20746f2074726176657260008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b6000614150602283612eb1565b915061415b826140f4565b604082019050919050565b6000602082019050818103600083015261417f81614143565b9050919050565b7f5468697320636861696e2069732063757272656e746c7920756e617661696c6160008201527f626c6520666f722074726176656c000000000000000000000000000000000000602082015250565b60006141e2602e83612eb1565b91506141ed82614186565b604082019050919050565b60006020820190508181036000830152614211816141d5565b9050919050565b600060408201905061422d6000830185612fe5565b61423a602083018461324b565b9392505050565b60008160f01b9050919050565b600061425982614241565b9050919050565b61427161426c82612b8c565b61424e565b82525050565b6000819050919050565b61429261428d82612f50565b614277565b82525050565b60006142a48285614260565b6002820191506142b48284614281565b6020820191508190509392505050565b600060a0820190506142d96000830188613846565b6142e66020830187612fe5565b81810360408301526142f881866132be565b90506143076060830185612e7c565b818103608083015261431981846132be565b90509695505050505050565b60008151905061433481612f5a565b92915050565b6000806040838503121561435157614350612b82565b5b600061435f85828601614325565b925050602061437085828601614325565b9150509250929050565b7f74696e792064696e6f733a206d73672e76616c7565206e6f7420656e6f75676860008201527f20746f20636f766572206d6573736167654665652e2053656e6420676173206660208201527f6f72206d65737361676520666565730000000000000000000000000000000000604082015250565b60006143fc604f83612eb1565b91506144078261437a565b606082019050919050565b6000602082019050818103600083015261442b816143ef565b9050919050565b6000815461443f816136cc565b61444981866132ad565b945060018216600081146144645760018114614476576144a9565b60ff19831686526020860193506144a9565b61447f85613709565b60005b838110156144a157815481890152600182019150602081019050614482565b808801955050505b50505092915050565b60006144bd82612fb3565b9050919050565b6144cd816144b2565b82525050565b600060c0820190506144e86000830189613846565b81810360208301526144fa8188614432565b9050818103604083015261450e81876132be565b905061451d60608301866144c4565b61452a6080830185612fe5565b81810360a083015261453c81846132be565b9050979650505050505050565b7f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60008201527f6573736167650000000000000000000000000000000000000000000000000000602082015250565b60006145a5602683612eb1565b91506145b082614549565b604082019050919050565b600060208201905081810360008301526145d481614598565b9050919050565b60006145e783856136fe565b93506145f4838584612c8d565b82840190509392505050565b600061460d8284866145db565b91508190509392505050565b7f4c617965725a65726f3a20696e76616c6964207061796c6f6164000000000000600082015250565b600061464f601a83612eb1565b915061465a82614619565b602082019050919050565b6000602082019050818103600083015261467e81614642565b9050919050565b600061469183856132ad565b935061469e838584612c8d565b6146a783612bd0565b840190509392505050565b60006080820190506146c76000830188613846565b81810360208301526146d981876132be565b90506146e86040830186613855565b81810360608301526146fb818486614685565b90509695505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614763602683612eb1565b915061476e82614707565b604082019050919050565b6000602082019050818103600083015261479281614756565b9050919050565b6147a2816144b2565b81146147ad57600080fd5b50565b6000815190506147bf81614799565b92915050565b600080604083850312156147dc576147db612b82565b5b60006147ea858286016147b0565b92505060206147fb85828601614325565b9150509250929050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614861602c83612eb1565b915061486c82614805565b604082019050919050565b6000602082019050818103600083015261489081614854565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006148f3602983612eb1565b91506148fe82614897565b604082019050919050565b60006020820190508181036000830152614922816148e6565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614985602483612eb1565b915061499082614929565b604082019050919050565b600060208201905081810360008301526149b481614978565b9050919050565b60006149c682612f50565b91506149d183612f50565b9250828210156149e4576149e3613e36565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614a25601983612eb1565b9150614a30826149ef565b602082019050919050565b60006020820190508181036000830152614a5481614a18565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614ab7603283612eb1565b9150614ac282614a5b565b604082019050919050565b60006020820190508181036000830152614ae681614aaa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614b2782612f50565b9150614b3283612f50565b925082614b4257614b41614aed565b5b828204905092915050565b6000614b5882612f50565b9150614b6383612f50565b925082614b7357614b72614aed565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000608082019050614bc26000830187612fe5565b614bcf6020830186612fe5565b614bdc604083018561324b565b8181036060830152614bee81846132be565b905095945050505050565b600081519050614c0881612e17565b92915050565b600060208284031215614c2457614c23612b82565b5b6000614c3284828501614bf9565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614c71602083612eb1565b9150614c7c82614c3b565b602082019050919050565b60006020820190508181036000830152614ca081614c64565b905091905056fea2646970667358221220a26308d94432bf952f70f18f4ef99788a52e0d8c5479f5c21336663bde72828f64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d503163666e696d70364458425877517a51637133575637754c4252437a586b4e66355937647a6b677135736b2f00000000000000000000
-----Decoded View---------------
Arg [0] : baseURI_ (string): ipfs://QmP1cfnimp6DXBXwQzQcq3WV7uLBRCzXkNf5Y7dzkgq5sk/
Arg [1] : _layerZeroEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d503163666e696d70364458425877517a51637133575637
Arg [4] : 754c4252437a586b4e66355937647a6b677135736b2f00000000000000000000
Deployed Bytecode Sourcemap
50202:4108:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46822:1098;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32887:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34056:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35749:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35272:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47928:435;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36668:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53287:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53061:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33663:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50807:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33306:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13199:103;;;;;;;;;;;;;:::i;:::-;;46621:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12548:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46512:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;53556:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34225:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36129:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50270:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37371:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34400:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51353:1700;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49023:916;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36387:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49947:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53159:65;;;:::i;:::-;;13457:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46822:1098;47027:8;;;;;;;;;;;47005:31;;:10;:31;;;46997:40;;;;;;47162:19;:32;47182:11;47162:32;;;;;;;;;;;;;;;:39;;;;;:::i;:::-;;;47140:11;:18;:61;:168;;;;;47275:19;:32;47295:11;47275:32;;;;;;;;;;;;;;;47265:43;;;;;;:::i;:::-;;;;;;;;47232:11;47222:22;;;;;;:86;47140:168;47118:270;;;;;;;;;;;;:::i;:::-;;;;;;;;;47516:4;:16;;;47533:11;47546;47559:6;47567:8;47516:60;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47512:401;;47723:101;;;;;;;;47756:8;:15;47723:101;;;;47800:8;47790:19;;;;;;47723:101;;;47672:14;:27;47687:11;47672:27;;;;;;;;;;;;;;;47700:11;47672:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;47713:6;47672:48;;;;;;;;;;;;;:152;;;;;;;;;;;;;;;;;;;47844:57;47858:11;47871;47884:6;47892:8;47844:57;;;;;;;;;:::i;:::-;;;;;;;;47512:401;;;;46822:1098;;;;:::o;32887:355::-;33034:4;33091:25;33076:40;;;:11;:40;;;;:105;;;;33148:33;33133:48;;;:11;:48;;;;33076:105;:158;;;;33198:36;33222:11;33198:23;:36::i;:::-;33076:158;33056:178;;32887:355;;;:::o;34056:100::-;34110:13;34143:5;34136:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34056:100;:::o;35749:308::-;35870:7;35917:16;35925:7;35917;:16::i;:::-;35895:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;36025:15;:24;36041:7;36025:24;;;;;;;;;;;;;;;;;;;;;36018:31;;35749:308;;;:::o;35272:411::-;35353:13;35369:23;35384:7;35369:14;:23::i;:::-;35353:39;;35417:5;35411:11;;:2;:11;;;;35403:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35511:5;35495:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35520:37;35537:5;35544:12;:10;:12::i;:::-;35520:16;:37::i;:::-;35495:62;35473:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;35654:21;35663:2;35667:7;35654:8;:21::i;:::-;35342:341;35272:411;;:::o;47928:435::-;48176:4;48154:27;;:10;:27;;;48132:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;48301:54;48312:11;48325;48338:6;48346:8;48301:10;:54::i;:::-;47928:435;;;;:::o;36668:376::-;36877:41;36896:12;:10;:12::i;:::-;36910:7;36877:18;:41::i;:::-;36855:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;37008:28;37018:4;37024:2;37028:7;37008:9;:28::i;:::-;36668:376;;;:::o;53287:185::-;12779:12;:10;:12::i;:::-;12768:23;;:7;:5;:7::i;:::-;:23;;;12760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53349:9:::1;53372:6;;;;;;;;;;;53364:20;;53392:3;53364:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53348:52;;;53419:4;53411:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;53337:135;53287:185:::0;:::o;37115:::-;37253:39;37270:4;37276:2;37280:7;37253:39;;;;;;;;;;;;:16;:39::i;:::-;37115:185;;;:::o;53061:90::-;12779:12;:10;:12::i;:::-;12768:23;;:7;:5;:7::i;:::-;:23;;;12760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53140:3:::1;53130:7;:13;;;;;;;;;;;;:::i;:::-;;53061:90:::0;:::o;33663:326::-;33780:7;33805:13;33821:7;:16;33829:7;33821:16;;;;;;;;;;;;;;;;;;;;;33805:32;;33887:1;33870:19;;:5;:19;;;;33848:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;33976:5;33969:12;;;33663:326;;;:::o;50807:407::-;50886:1;50874:9;:13;;;50866:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50990:17;;50977:9;50963:23;;:11;;:23;;;;:::i;:::-;:44;;50941:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;51077:36;51087:10;51101:11;;51099:13;;;;;:::i;:::-;;;;;;;51077:9;:36::i;:::-;51141:1;51128:9;:14;;;51124:83;;;51159:36;51169:10;51183:11;;51181:13;;;;;:::i;:::-;;;;;;;51159:9;:36::i;:::-;51124:83;50807:407;:::o;33306:295::-;33423:7;33487:1;33470:19;;:5;:19;;;;33448:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;33577:9;:16;33587:5;33577:16;;;;;;;;;;;;;;;;33570:23;;33306:295;;;:::o;13199:103::-;12779:12;:10;:12::i;:::-;12768:23;;:7;:5;:7::i;:::-;:23;;;12760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13264:30:::1;13291:1;13264:18;:30::i;:::-;13199:103::o:0;46621:51::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12548:87::-;12594:7;12621:6;;;;;;;;;;;12614:13;;12548:87;:::o;46512:102::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53556:128::-;12779:12;:10;:12::i;:::-;12768:23;;:7;:5;:7::i;:::-;:23;;;12760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53670:6:::1;53641:26;:35;;;;53556:128:::0;:::o;34225:104::-;34281:13;34314:7;34307:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34225:104;:::o;36129:187::-;36256:52;36275:12;:10;:12::i;:::-;36289:8;36299;36256:18;:52::i;:::-;36129:187;;:::o;50270:21::-;;;;;;;;;;;;;:::o;37371:365::-;37560:41;37579:12;:10;:12::i;:::-;37593:7;37560:18;:41::i;:::-;37538:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;37689:39;37703:4;37709:2;37713:7;37722:5;37689:13;:39::i;:::-;37371:365;;;;:::o;34400:468::-;34518:13;34571:16;34579:7;34571;:16::i;:::-;34549:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;34675:21;34699:10;:8;:10::i;:::-;34675:34;;34764:1;34746:7;34740:21;:25;:120;;;;;;;;;;;;;;;;;34809:7;34818:18;:7;:16;:18::i;:::-;34792:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34740:120;34720:140;;;34400:468;;;:::o;51353:1700::-;51473:16;51481:7;51473;:16::i;:::-;51459:30;;:10;:30;;;51437:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;51623:1;51584:19;:29;51604:8;51584:29;;;;;;;;;;;;;;;:36;;;;;:::i;:::-;;;:40;51562:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;51778:14;51784:7;51778:5;:14::i;:::-;51866:20;51900:10;51912:7;51889:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51866:54;;52006:14;52023:1;52006:18;;52035:26;52095:7;52117:26;;52064:90;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52035:119;;52309:18;52333:8;;;;;;;;;;;:21;;;52369:8;52400:4;52420:7;52442:5;52462:13;52333:153;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52308:178;;;52534:10;52521:9;:23;;52499:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;52664:8;;;;;;;;;;;:13;;;52685:9;52710:8;52756:19;:29;52776:8;52756:29;;;;;;;;;;;;;;;52839:7;52895:10;52947:3;53005:13;52664:381;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51426:1627;;;;51353:1700;;:::o;49023:916::-;49247:32;49282:14;:27;49297:11;49282:27;;;;;;;;;;;;;;;49324:11;49282:64;;;;;;:::i;:::-;;;;;;;;;;;;;:72;49347:6;49282:72;;;;;;;;;;;;;49247:107;;49420:1;49412:10;;49387:9;:21;;;:35;;49365:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;49540:9;:23;;;49521:8;;:15;;:42;:107;;;;;49607:9;:21;;;49594:8;;49584:19;;;;;;;:::i;:::-;;;;;;;;:44;49521:107;49499:183;;;;;;;;;;;;:::i;:::-;;;;;;;;;49756:1;49730:9;:23;;:27;;;;49800:1;49792:10;;49768:9;:21;;:34;;;;49871:4;:16;;;49888:11;49901;49914:6;49922:8;;49871:60;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49191:748;49023:916;;;;;:::o;36387:214::-;36529:4;36558:18;:25;36577:5;36558:25;;;;;;;;;;;;;;;:35;36584:8;36558:35;;;;;;;;;;;;;;;;;;;;;;;;;36551:42;;36387:214;;;;:::o;49947:181::-;12779:12;:10;:12::i;:::-;12768:23;;:7;:5;:7::i;:::-;:23;;;12760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50106:14:::1;;50074:19;:29;50094:8;50074:29;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;49947:181:::0;;;:::o;53159:65::-;:::o;13457:238::-;12779:12;:10;:12::i;:::-;12768:23;;:7;:5;:7::i;:::-;:23;;;12760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13580:1:::1;13560:22;;:8;:22;;;;13538:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;13659:28;13678:8;13659:18;:28::i;:::-;13457:238:::0;:::o;25474:207::-;25604:4;25648:25;25633:40;;;:11;:40;;;;25626:47;;25474:207;;;:::o;39283:127::-;39348:4;39400:1;39372:30;;:7;:16;39380:7;39372:16;;;;;;;;;;;;;;;;;;;;;:30;;;;39365:37;;39283:127;;;:::o;11251:98::-;11304:7;11331:10;11324:17;;11251:98;:::o;43337:174::-;43439:2;43412:15;:24;43428:7;43412:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43495:7;43491:2;43457:46;;43466:23;43481:7;43466:14;:23::i;:::-;43457:46;;;;;;;;;;;;43337:174;;:::o;53775:424::-;53971:14;53987:15;54031:8;54006:77;;;;;;;;;;;;:::i;:::-;53970:113;;;;54165:26;54175:6;54183:7;54165:9;:26::i;:::-;53940:259;;53775:424;;;;:::o;39577:452::-;39706:4;39750:16;39758:7;39750;:16::i;:::-;39728:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;39849:13;39865:23;39880:7;39865:14;:23::i;:::-;39849:39;;39918:5;39907:16;;:7;:16;;;:64;;;;39964:7;39940:31;;:20;39952:7;39940:11;:20::i;:::-;:31;;;39907:64;:113;;;;39988:32;40005:5;40012:7;39988:16;:32::i;:::-;39907:113;39899:122;;;39577:452;;;;:::o;42604:615::-;42777:4;42750:31;;:23;42765:7;42750:14;:23::i;:::-;:31;;;42728:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;42883:1;42869:16;;:2;:16;;;;42861:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42939:39;42960:4;42966:2;42970:7;42939:20;:39::i;:::-;43043:29;43060:1;43064:7;43043:8;:29::i;:::-;43104:1;43085:9;:15;43095:4;43085:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43133:1;43116:9;:13;43126:2;43116:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43164:2;43145:7;:16;43153:7;43145:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43203:7;43199:2;43184:27;;43193:4;43184:27;;;;;;;;;;;;42604:615;;;:::o;40371:110::-;40447:26;40457:2;40461:7;40447:26;;;;;;;;;;;;:9;:26::i;:::-;40371:110;;:::o;13855:191::-;13929:16;13948:6;;;;;;;;;;;13929:25;;13974:8;13965:6;;:17;;;;;;;;;;;;;;;;;;14029:8;13998:40;;14019:8;13998:40;;;;;;;;;;;;13918:128;13855:191;:::o;43653:315::-;43808:8;43799:17;;:5;:17;;;;43791:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;43895:8;43857:18;:25;43876:5;43857:25;;;;;;;;;;;;;;;:35;43883:8;43857:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;43941:8;43919:41;;43934:5;43919:41;;;43951:8;43919:41;;;;;;:::i;:::-;;;;;;;;43653:315;;;:::o;38618:352::-;38775:28;38785:4;38791:2;38795:7;38775:9;:28::i;:::-;38836:48;38859:4;38865:2;38869:7;38878:5;38836:22;:48::i;:::-;38814:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;38618:352;;;;:::o;54207:100::-;54259:13;54292:7;54285:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54207:100;:::o;8783:723::-;8839:13;9069:1;9060:5;:10;9056:53;;;9087:10;;;;;;;;;;;;;;;;;;;;;9056:53;9119:12;9134:5;9119:20;;9150:14;9175:78;9190:1;9182:4;:9;9175:78;;9208:8;;;;;:::i;:::-;;;;9239:2;9231:10;;;;;:::i;:::-;;;9175:78;;;9263:19;9295:6;9285:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9263:39;;9313:154;9329:1;9320:5;:10;9313:154;;9357:1;9347:11;;;;;:::i;:::-;;;9424:2;9416:5;:10;;;;:::i;:::-;9403:2;:24;;;;:::i;:::-;9390:39;;9373:6;9380;9373:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9453:2;9444:11;;;;;:::i;:::-;;;9313:154;;;9491:6;9477:21;;;;;8783:723;;;;:::o;41907:360::-;41967:13;41983:23;41998:7;41983:14;:23::i;:::-;41967:39;;42019:48;42040:5;42055:1;42059:7;42019:20;:48::i;:::-;42108:29;42125:1;42129:7;42108:8;:29::i;:::-;42170:1;42150:9;:16;42160:5;42150:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;42189:7;:16;42197:7;42189:16;;;;;;;;;;;;42182:23;;;;;;;;;;;42251:7;42247:1;42223:36;;42232:5;42223:36;;;;;;;;;;;;41956:311;41907:360;:::o;46085:126::-;;;;:::o;40708:321::-;40838:18;40844:2;40848:7;40838:5;:18::i;:::-;40889:54;40920:1;40924:2;40928:7;40937:5;40889:22;:54::i;:::-;40867:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;40708:321;;;:::o;44533:980::-;44688:4;44709:15;:2;:13;;;:15::i;:::-;44705:801;;;44778:2;44762:36;;;44821:12;:10;:12::i;:::-;44856:4;44883:7;44913:5;44762:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44741:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45137:1;45120:6;:13;:18;45116:320;;;45163:108;;;;;;;;;;:::i;:::-;;;;;;;;45116:320;45386:6;45380:13;45371:6;45367:2;45363:15;45356:38;44741:710;45011:41;;;45001:51;;;:6;:51;;;;44994:58;;;;;44705:801;45490:4;45483:11;;44533:980;;;;;;;:::o;41365:313::-;41459:1;41445:16;;:2;:16;;;;41437:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41511:45;41540:1;41544:2;41548:7;41511:20;:45::i;:::-;41586:1;41569:9;:13;41579:2;41569:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41617:2;41598:7;:16;41606:7;41598:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41662:7;41658:2;41637:33;;41654:1;41637:33;;;;;;;;;;;;41365:313;;:::o;14871:387::-;14931:4;15139:12;15206:7;15194:20;15186:28;;15249:1;15242:4;:8;15235:15;;;14871:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::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:89;370:7;410:6;403:5;399:18;388:29;;334:89;;;:::o;429:120::-;501:23;518:5;501:23;:::i;:::-;494:5;491:34;481:62;;539:1;536;529:12;481:62;429:120;:::o;555:137::-;600:5;638:6;625:20;616:29;;654:32;680:5;654:32;:::i;:::-;555:137;;;;:::o;698:117::-;807:1;804;797:12;821:117;930:1;927;920:12;944:102;985:6;1036:2;1032:7;1027:2;1020:5;1016:14;1012:28;1002:38;;944:102;;;:::o;1052:180::-;1100:77;1097:1;1090:88;1197:4;1194:1;1187:15;1221:4;1218:1;1211:15;1238:281;1321:27;1343:4;1321:27;:::i;:::-;1313:6;1309:40;1451:6;1439:10;1436:22;1415:18;1403:10;1400:34;1397:62;1394:88;;;1462:18;;:::i;:::-;1394:88;1502:10;1498:2;1491:22;1281:238;1238:281;;:::o;1525:129::-;1559:6;1586:20;;:::i;:::-;1576:30;;1615:33;1643:4;1635:6;1615:33;:::i;:::-;1525:129;;;:::o;1660:307::-;1721:4;1811:18;1803:6;1800:30;1797:56;;;1833:18;;:::i;:::-;1797:56;1871:29;1893:6;1871:29;:::i;:::-;1863:37;;1955:4;1949;1945:15;1937:23;;1660:307;;;:::o;1973:154::-;2057:6;2052:3;2047;2034:30;2119:1;2110:6;2105:3;2101:16;2094:27;1973:154;;;:::o;2133:410::-;2210:5;2235:65;2251:48;2292:6;2251:48;:::i;:::-;2235:65;:::i;:::-;2226:74;;2323:6;2316:5;2309:21;2361:4;2354:5;2350:16;2399:3;2390:6;2385:3;2381:16;2378:25;2375:112;;;2406:79;;:::i;:::-;2375:112;2496:41;2530:6;2525:3;2520;2496:41;:::i;:::-;2216:327;2133:410;;;;;:::o;2562:338::-;2617:5;2666:3;2659:4;2651:6;2647:17;2643:27;2633:122;;2674:79;;:::i;:::-;2633:122;2791:6;2778:20;2816:78;2890:3;2882:6;2875:4;2867:6;2863:17;2816:78;:::i;:::-;2807:87;;2623:277;2562:338;;;;:::o;2906:101::-;2942:7;2982:18;2975:5;2971:30;2960:41;;2906:101;;;:::o;3013:120::-;3085:23;3102:5;3085:23;:::i;:::-;3078:5;3075:34;3065:62;;3123:1;3120;3113:12;3065:62;3013:120;:::o;3139:137::-;3184:5;3222:6;3209:20;3200:29;;3238:32;3264:5;3238:32;:::i;:::-;3139:137;;;;:::o;3282:1117::-;3384:6;3392;3400;3408;3457:3;3445:9;3436:7;3432:23;3428:33;3425:120;;;3464:79;;:::i;:::-;3425:120;3584:1;3609:52;3653:7;3644:6;3633:9;3629:22;3609:52;:::i;:::-;3599:62;;3555:116;3738:2;3727:9;3723:18;3710:32;3769:18;3761:6;3758:30;3755:117;;;3791:79;;:::i;:::-;3755:117;3896:62;3950:7;3941:6;3930:9;3926:22;3896:62;:::i;:::-;3886:72;;3681:287;4007:2;4033:52;4077:7;4068:6;4057:9;4053:22;4033:52;:::i;:::-;4023:62;;3978:117;4162:2;4151:9;4147:18;4134:32;4193:18;4185:6;4182:30;4179:117;;;4215:79;;:::i;:::-;4179:117;4320:62;4374:7;4365:6;4354:9;4350:22;4320:62;:::i;:::-;4310:72;;4105:287;3282:1117;;;;;;;:::o;4405:149::-;4441:7;4481:66;4474:5;4470:78;4459:89;;4405:149;;;:::o;4560:120::-;4632:23;4649:5;4632:23;:::i;:::-;4625:5;4622:34;4612:62;;4670:1;4667;4660:12;4612:62;4560:120;:::o;4686:137::-;4731:5;4769:6;4756:20;4747:29;;4785:32;4811:5;4785:32;:::i;:::-;4686:137;;;;:::o;4829:327::-;4887:6;4936:2;4924:9;4915:7;4911:23;4907:32;4904:119;;;4942:79;;:::i;:::-;4904:119;5062:1;5087:52;5131:7;5122:6;5111:9;5107:22;5087:52;:::i;:::-;5077:62;;5033:116;4829:327;;;;:::o;5162:90::-;5196:7;5239:5;5232:13;5225:21;5214:32;;5162:90;;;:::o;5258:109::-;5339:21;5354:5;5339:21;:::i;:::-;5334:3;5327:34;5258:109;;:::o;5373:210::-;5460:4;5498:2;5487:9;5483:18;5475:26;;5511:65;5573:1;5562:9;5558:17;5549:6;5511:65;:::i;:::-;5373:210;;;;:::o;5589:99::-;5641:6;5675:5;5669:12;5659:22;;5589:99;;;:::o;5694:169::-;5778:11;5812:6;5807:3;5800:19;5852:4;5847:3;5843:14;5828:29;;5694:169;;;;:::o;5869:307::-;5937:1;5947:113;5961:6;5958:1;5955:13;5947:113;;;6046:1;6041:3;6037:11;6031:18;6027:1;6022:3;6018:11;6011:39;5983:2;5980:1;5976:10;5971:15;;5947:113;;;6078:6;6075:1;6072:13;6069:101;;;6158:1;6149:6;6144:3;6140:16;6133:27;6069:101;5918:258;5869:307;;;:::o;6182:364::-;6270:3;6298:39;6331:5;6298:39;:::i;:::-;6353:71;6417:6;6412:3;6353:71;:::i;:::-;6346:78;;6433:52;6478:6;6473:3;6466:4;6459:5;6455:16;6433:52;:::i;:::-;6510:29;6532:6;6510:29;:::i;:::-;6505:3;6501:39;6494:46;;6274:272;6182:364;;;;:::o;6552:313::-;6665:4;6703:2;6692:9;6688:18;6680:26;;6752:9;6746:4;6742:20;6738:1;6727:9;6723:17;6716:47;6780:78;6853:4;6844:6;6780:78;:::i;:::-;6772:86;;6552:313;;;;:::o;6871:77::-;6908:7;6937:5;6926:16;;6871:77;;;:::o;6954:122::-;7027:24;7045:5;7027:24;:::i;:::-;7020:5;7017:35;7007:63;;7066:1;7063;7056:12;7007:63;6954:122;:::o;7082:139::-;7128:5;7166:6;7153:20;7144:29;;7182:33;7209:5;7182:33;:::i;:::-;7082:139;;;;:::o;7227:329::-;7286:6;7335:2;7323:9;7314:7;7310:23;7306:32;7303:119;;;7341:79;;:::i;:::-;7303:119;7461:1;7486:53;7531:7;7522:6;7511:9;7507:22;7486:53;:::i;:::-;7476:63;;7432:117;7227:329;;;;:::o;7562:126::-;7599:7;7639:42;7632:5;7628:54;7617:65;;7562:126;;;:::o;7694:96::-;7731:7;7760:24;7778:5;7760:24;:::i;:::-;7749:35;;7694:96;;;:::o;7796:118::-;7883:24;7901:5;7883:24;:::i;:::-;7878:3;7871:37;7796:118;;:::o;7920:222::-;8013:4;8051:2;8040:9;8036:18;8028:26;;8064:71;8132:1;8121:9;8117:17;8108:6;8064:71;:::i;:::-;7920:222;;;;:::o;8148:122::-;8221:24;8239:5;8221:24;:::i;:::-;8214:5;8211:35;8201:63;;8260:1;8257;8250:12;8201:63;8148:122;:::o;8276:139::-;8322:5;8360:6;8347:20;8338:29;;8376:33;8403:5;8376:33;:::i;:::-;8276:139;;;;:::o;8421:474::-;8489:6;8497;8546:2;8534:9;8525:7;8521:23;8517:32;8514:119;;;8552:79;;:::i;:::-;8514:119;8672:1;8697:53;8742:7;8733:6;8722:9;8718:22;8697:53;:::i;:::-;8687:63;;8643:117;8799:2;8825:53;8870:7;8861:6;8850:9;8846:22;8825:53;:::i;:::-;8815:63;;8770:118;8421:474;;;;;:::o;8901:619::-;8978:6;8986;8994;9043:2;9031:9;9022:7;9018:23;9014:32;9011:119;;;9049:79;;:::i;:::-;9011:119;9169:1;9194:53;9239:7;9230:6;9219:9;9215:22;9194:53;:::i;:::-;9184:63;;9140:117;9296:2;9322:53;9367:7;9358:6;9347:9;9343:22;9322:53;:::i;:::-;9312:63;;9267:118;9424:2;9450:53;9495:7;9486:6;9475:9;9471:22;9450:53;:::i;:::-;9440:63;;9395:118;8901:619;;;;;:::o;9526:308::-;9588:4;9678:18;9670:6;9667:30;9664:56;;;9700:18;;:::i;:::-;9664:56;9738:29;9760:6;9738:29;:::i;:::-;9730:37;;9822:4;9816;9812:15;9804:23;;9526:308;;;:::o;9840:412::-;9918:5;9943:66;9959:49;10001:6;9959:49;:::i;:::-;9943:66;:::i;:::-;9934:75;;10032:6;10025:5;10018:21;10070:4;10063:5;10059:16;10108:3;10099:6;10094:3;10090:16;10087:25;10084:112;;;10115:79;;:::i;:::-;10084:112;10205:41;10239:6;10234:3;10229;10205:41;:::i;:::-;9924:328;9840:412;;;;;:::o;10272:340::-;10328:5;10377:3;10370:4;10362:6;10358:17;10354:27;10344:122;;10385:79;;:::i;:::-;10344:122;10502:6;10489:20;10527:79;10602:3;10594:6;10587:4;10579:6;10575:17;10527:79;:::i;:::-;10518:88;;10334:278;10272:340;;;;:::o;10618:509::-;10687:6;10736:2;10724:9;10715:7;10711:23;10707:32;10704:119;;;10742:79;;:::i;:::-;10704:119;10890:1;10879:9;10875:17;10862:31;10920:18;10912:6;10909:30;10906:117;;;10942:79;;:::i;:::-;10906:117;11047:63;11102:7;11093:6;11082:9;11078:22;11047:63;:::i;:::-;11037:73;;10833:287;10618:509;;;;:::o;11133:86::-;11168:7;11208:4;11201:5;11197:16;11186:27;;11133:86;;;:::o;11225:118::-;11296:22;11312:5;11296:22;:::i;:::-;11289:5;11286:33;11276:61;;11333:1;11330;11323:12;11276:61;11225:118;:::o;11349:135::-;11393:5;11431:6;11418:20;11409:29;;11447:31;11472:5;11447:31;:::i;:::-;11349:135;;;;:::o;11490:325::-;11547:6;11596:2;11584:9;11575:7;11571:23;11567:32;11564:119;;;11602:79;;:::i;:::-;11564:119;11722:1;11747:51;11790:7;11781:6;11770:9;11766:22;11747:51;:::i;:::-;11737:61;;11693:115;11490:325;;;;:::o;11821:329::-;11880:6;11929:2;11917:9;11908:7;11904:23;11900:32;11897:119;;;11935:79;;:::i;:::-;11897:119;12055:1;12080:53;12125:7;12116:6;12105:9;12101:22;12080:53;:::i;:::-;12070:63;;12026:117;11821:329;;;;:::o;12156:118::-;12243:24;12261:5;12243:24;:::i;:::-;12238:3;12231:37;12156:118;;:::o;12280:222::-;12373:4;12411:2;12400:9;12396:18;12388:26;;12424:71;12492:1;12481:9;12477:17;12468:6;12424:71;:::i;:::-;12280:222;;;;:::o;12508:327::-;12566:6;12615:2;12603:9;12594:7;12590:23;12586:32;12583:119;;;12621:79;;:::i;:::-;12583:119;12741:1;12766:52;12810:7;12801:6;12790:9;12786:22;12766:52;:::i;:::-;12756:62;;12712:116;12508:327;;;;:::o;12841:98::-;12892:6;12926:5;12920:12;12910:22;;12841:98;;;:::o;12945:168::-;13028:11;13062:6;13057:3;13050:19;13102:4;13097:3;13093:14;13078:29;;12945:168;;;;:::o;13119:360::-;13205:3;13233:38;13265:5;13233:38;:::i;:::-;13287:70;13350:6;13345:3;13287:70;:::i;:::-;13280:77;;13366:52;13411:6;13406:3;13399:4;13392:5;13388:16;13366:52;:::i;:::-;13443:29;13465:6;13443:29;:::i;:::-;13438:3;13434:39;13427:46;;13209:270;13119:360;;;;:::o;13485:309::-;13596:4;13634:2;13623:9;13619:18;13611:26;;13683:9;13677:4;13673:20;13669:1;13658:9;13654:17;13647:47;13711:76;13782:4;13773:6;13711:76;:::i;:::-;13703:84;;13485:309;;;;:::o;13800:795::-;13885:6;13893;13901;13950:2;13938:9;13929:7;13925:23;13921:32;13918:119;;;13956:79;;:::i;:::-;13918:119;14076:1;14101:52;14145:7;14136:6;14125:9;14121:22;14101:52;:::i;:::-;14091:62;;14047:116;14230:2;14219:9;14215:18;14202:32;14261:18;14253:6;14250:30;14247:117;;;14283:79;;:::i;:::-;14247:117;14388:62;14442:7;14433:6;14422:9;14418:22;14388:62;:::i;:::-;14378:72;;14173:287;14499:2;14525:53;14570:7;14561:6;14550:9;14546:22;14525:53;:::i;:::-;14515:63;;14470:118;13800:795;;;;;:::o;14601:77::-;14638:7;14667:5;14656:16;;14601:77;;;:::o;14684:118::-;14771:24;14789:5;14771:24;:::i;:::-;14766:3;14759:37;14684:118;;:::o;14808:332::-;14929:4;14967:2;14956:9;14952:18;14944:26;;14980:71;15048:1;15037:9;15033:17;15024:6;14980:71;:::i;:::-;15061:72;15129:2;15118:9;15114:18;15105:6;15061:72;:::i;:::-;14808:332;;;;;:::o;15146:116::-;15216:21;15231:5;15216:21;:::i;:::-;15209:5;15206:32;15196:60;;15252:1;15249;15242:12;15196:60;15146:116;:::o;15268:133::-;15311:5;15349:6;15336:20;15327:29;;15365:30;15389:5;15365:30;:::i;:::-;15268:133;;;;:::o;15407:468::-;15472:6;15480;15529:2;15517:9;15508:7;15504:23;15500:32;15497:119;;;15535:79;;:::i;:::-;15497:119;15655:1;15680:53;15725:7;15716:6;15705:9;15701:22;15680:53;:::i;:::-;15670:63;;15626:117;15782:2;15808:50;15850:7;15841:6;15830:9;15826:22;15808:50;:::i;:::-;15798:60;;15753:115;15407:468;;;;;:::o;15881:943::-;15976:6;15984;15992;16000;16049:3;16037:9;16028:7;16024:23;16020:33;16017:120;;;16056:79;;:::i;:::-;16017:120;16176:1;16201:53;16246:7;16237:6;16226:9;16222:22;16201:53;:::i;:::-;16191:63;;16147:117;16303:2;16329:53;16374:7;16365:6;16354:9;16350:22;16329:53;:::i;:::-;16319:63;;16274:118;16431:2;16457:53;16502:7;16493:6;16482:9;16478:22;16457:53;:::i;:::-;16447:63;;16402:118;16587:2;16576:9;16572:18;16559:32;16618:18;16610:6;16607:30;16604:117;;;16640:79;;:::i;:::-;16604:117;16745:62;16799:7;16790:6;16779:9;16775:22;16745:62;:::i;:::-;16735:72;;16530:287;15881:943;;;;;;;:::o;16830:472::-;16897:6;16905;16954:2;16942:9;16933:7;16929:23;16925:32;16922:119;;;16960:79;;:::i;:::-;16922:119;17080:1;17105:52;17149:7;17140:6;17129:9;17125:22;17105:52;:::i;:::-;17095:62;;17051:116;17206:2;17232:53;17277:7;17268:6;17257:9;17253:22;17232:53;:::i;:::-;17222:63;;17177:118;16830:472;;;;;:::o;17308:117::-;17417:1;17414;17407:12;17431:117;17540:1;17537;17530:12;17567:552;17624:8;17634:6;17684:3;17677:4;17669:6;17665:17;17661:27;17651:122;;17692:79;;:::i;:::-;17651:122;17805:6;17792:20;17782:30;;17835:18;17827:6;17824:30;17821:117;;;17857:79;;:::i;:::-;17821:117;17971:4;17963:6;17959:17;17947:29;;18025:3;18017:4;18009:6;18005:17;17995:8;17991:32;17988:41;17985:128;;;18032:79;;:::i;:::-;17985:128;17567:552;;;;;:::o;18125:1137::-;18229:6;18237;18245;18253;18261;18310:3;18298:9;18289:7;18285:23;18281:33;18278:120;;;18317:79;;:::i;:::-;18278:120;18437:1;18462:52;18506:7;18497:6;18486:9;18482:22;18462:52;:::i;:::-;18452:62;;18408:116;18591:2;18580:9;18576:18;18563:32;18622:18;18614:6;18611:30;18608:117;;;18644:79;;:::i;:::-;18608:117;18749:62;18803:7;18794:6;18783:9;18779:22;18749:62;:::i;:::-;18739:72;;18534:287;18860:2;18886:52;18930:7;18921:6;18910:9;18906:22;18886:52;:::i;:::-;18876:62;;18831:117;19015:2;19004:9;19000:18;18987:32;19046:18;19038:6;19035:30;19032:117;;;19068:79;;:::i;:::-;19032:117;19181:64;19237:7;19228:6;19217:9;19213:22;19181:64;:::i;:::-;19163:82;;;;18958:297;18125:1137;;;;;;;;:::o;19268:474::-;19336:6;19344;19393:2;19381:9;19372:7;19368:23;19364:32;19361:119;;;19399:79;;:::i;:::-;19361:119;19519:1;19544:53;19589:7;19580:6;19569:9;19565:22;19544:53;:::i;:::-;19534:63;;19490:117;19646:2;19672:53;19717:7;19708:6;19697:9;19693:22;19672:53;:::i;:::-;19662:63;;19617:118;19268:474;;;;;:::o;19748:670::-;19826:6;19834;19842;19891:2;19879:9;19870:7;19866:23;19862:32;19859:119;;;19897:79;;:::i;:::-;19859:119;20017:1;20042:52;20086:7;20077:6;20066:9;20062:22;20042:52;:::i;:::-;20032:62;;19988:116;20171:2;20160:9;20156:18;20143:32;20202:18;20194:6;20191:30;20188:117;;;20224:79;;:::i;:::-;20188:117;20337:64;20393:7;20384:6;20373:9;20369:22;20337:64;:::i;:::-;20319:82;;;;20114:297;19748:670;;;;;:::o;20424:180::-;20472:77;20469:1;20462:88;20569:4;20566:1;20559:15;20593:4;20590:1;20583:15;20610:320;20654:6;20691:1;20685:4;20681:12;20671:22;;20738:1;20732:4;20728:12;20759:18;20749:81;;20815:4;20807:6;20803:17;20793:27;;20749:81;20877:2;20869:6;20866:14;20846:18;20843:38;20840:84;;;20896:18;;:::i;:::-;20840:84;20661:269;20610:320;;;:::o;20936:147::-;21037:11;21074:3;21059:18;;20936:147;;;;:::o;21089:140::-;21137:4;21160:3;21152:11;;21183:3;21180:1;21173:14;21217:4;21214:1;21204:18;21196:26;;21089:140;;;:::o;21257:841::-;21358:3;21395:5;21389:12;21424:36;21450:9;21424:36;:::i;:::-;21476:88;21557:6;21552:3;21476:88;:::i;:::-;21469:95;;21595:1;21584:9;21580:17;21611:1;21606:137;;;;21757:1;21752:340;;;;21573:519;;21606:137;21690:4;21686:9;21675;21671:25;21666:3;21659:38;21726:6;21721:3;21717:16;21710:23;;21606:137;;21752:340;21819:37;21850:5;21819:37;:::i;:::-;21878:1;21892:154;21906:6;21903:1;21900:13;21892:154;;;21980:7;21974:14;21970:1;21965:3;21961:11;21954:35;22030:1;22021:7;22017:15;22006:26;;21928:4;21925:1;21921:12;21916:17;;21892:154;;;22075:6;22070:3;22066:16;22059:23;;21759:333;;21573:519;;21362:736;;21257:841;;;;:::o;22104:265::-;22231:3;22253:90;22339:3;22330:6;22253:90;:::i;:::-;22246:97;;22360:3;22353:10;;22104:265;;;;:::o;22375:239::-;22515:34;22511:1;22503:6;22499:14;22492:58;22584:22;22579:2;22571:6;22567:15;22560:47;22375:239;:::o;22620:366::-;22762:3;22783:67;22847:2;22842:3;22783:67;:::i;:::-;22776:74;;22859:93;22948:3;22859:93;:::i;:::-;22977:2;22972:3;22968:12;22961:19;;22620:366;;;:::o;22992:419::-;23158:4;23196:2;23185:9;23181:18;23173:26;;23245:9;23239:4;23235:20;23231:1;23220:9;23216:17;23209:47;23273:131;23399:4;23273:131;:::i;:::-;23265:139;;22992:419;;;:::o;23417:115::-;23502:23;23519:5;23502:23;:::i;:::-;23497:3;23490:36;23417:115;;:::o;23538:::-;23623:23;23640:5;23623:23;:::i;:::-;23618:3;23611:36;23538:115;;:::o;23659:719::-;23868:4;23906:3;23895:9;23891:19;23883:27;;23920:69;23986:1;23975:9;23971:17;23962:6;23920:69;:::i;:::-;24036:9;24030:4;24026:20;24021:2;24010:9;24006:18;23999:48;24064:76;24135:4;24126:6;24064:76;:::i;:::-;24056:84;;24150:70;24216:2;24205:9;24201:18;24192:6;24150:70;:::i;:::-;24267:9;24261:4;24257:20;24252:2;24241:9;24237:18;24230:48;24295:76;24366:4;24357:6;24295:76;:::i;:::-;24287:84;;23659:719;;;;;;;:::o;24384:373::-;24488:3;24516:38;24548:5;24516:38;:::i;:::-;24570:88;24651:6;24646:3;24570:88;:::i;:::-;24563:95;;24667:52;24712:6;24707:3;24700:4;24693:5;24689:16;24667:52;:::i;:::-;24744:6;24739:3;24735:16;24728:23;;24492:265;24384:373;;;;:::o;24763:271::-;24893:3;24915:93;25004:3;24995:6;24915:93;:::i;:::-;24908:100;;25025:3;25018:10;;24763:271;;;;:::o;25040:231::-;25180:34;25176:1;25168:6;25164:14;25157:58;25249:14;25244:2;25236:6;25232:15;25225:39;25040:231;:::o;25277:366::-;25419:3;25440:67;25504:2;25499:3;25440:67;:::i;:::-;25433:74;;25516:93;25605:3;25516:93;:::i;:::-;25634:2;25629:3;25625:12;25618:19;;25277:366;;;:::o;25649:419::-;25815:4;25853:2;25842:9;25838:18;25830:26;;25902:9;25896:4;25892:20;25888:1;25877:9;25873:17;25866:47;25930:131;26056:4;25930:131;:::i;:::-;25922:139;;25649:419;;;:::o;26074:220::-;26214:34;26210:1;26202:6;26198:14;26191:58;26283:3;26278:2;26270:6;26266:15;26259:28;26074:220;:::o;26300:366::-;26442:3;26463:67;26527:2;26522:3;26463:67;:::i;:::-;26456:74;;26539:93;26628:3;26539:93;:::i;:::-;26657:2;26652:3;26648:12;26641:19;;26300:366;;;:::o;26672:419::-;26838:4;26876:2;26865:9;26861:18;26853:26;;26925:9;26919:4;26915:20;26911:1;26900:9;26896:17;26889:47;26953:131;27079:4;26953:131;:::i;:::-;26945:139;;26672:419;;;:::o;27097:243::-;27237:34;27233:1;27225:6;27221:14;27214:58;27306:26;27301:2;27293:6;27289:15;27282:51;27097:243;:::o;27346:366::-;27488:3;27509:67;27573:2;27568:3;27509:67;:::i;:::-;27502:74;;27585:93;27674:3;27585:93;:::i;:::-;27703:2;27698:3;27694:12;27687:19;;27346:366;;;:::o;27718:419::-;27884:4;27922:2;27911:9;27907:18;27899:26;;27971:9;27965:4;27961:20;27957:1;27946:9;27942:17;27935:47;27999:131;28125:4;27999:131;:::i;:::-;27991:139;;27718:419;;;:::o;28143:230::-;28283:34;28279:1;28271:6;28267:14;28260:58;28352:13;28347:2;28339:6;28335:15;28328:38;28143:230;:::o;28379:366::-;28521:3;28542:67;28606:2;28601:3;28542:67;:::i;:::-;28535:74;;28618:93;28707:3;28618:93;:::i;:::-;28736:2;28731:3;28727:12;28720:19;;28379:366;;;:::o;28751:419::-;28917:4;28955:2;28944:9;28940:18;28932:26;;29004:9;28998:4;28994:20;28990:1;28979:9;28975:17;28968:47;29032:131;29158:4;29032:131;:::i;:::-;29024:139;;28751:419;;;:::o;29176:236::-;29316:34;29312:1;29304:6;29300:14;29293:58;29385:19;29380:2;29372:6;29368:15;29361:44;29176:236;:::o;29418:366::-;29560:3;29581:67;29645:2;29640:3;29581:67;:::i;:::-;29574:74;;29657:93;29746:3;29657:93;:::i;:::-;29775:2;29770:3;29766:12;29759:19;;29418:366;;;:::o;29790:419::-;29956:4;29994:2;29983:9;29979:18;29971:26;;30043:9;30037:4;30033:20;30029:1;30018:9;30014:17;30007:47;30071:131;30197:4;30071:131;:::i;:::-;30063:139;;29790:419;;;:::o;30215:182::-;30355:34;30351:1;30343:6;30339:14;30332:58;30215:182;:::o;30403:366::-;30545:3;30566:67;30630:2;30625:3;30566:67;:::i;:::-;30559:74;;30642:93;30731:3;30642:93;:::i;:::-;30760:2;30755:3;30751:12;30744:19;;30403:366;;;:::o;30775:419::-;30941:4;30979:2;30968:9;30964:18;30956:26;;31028:9;31022:4;31018:20;31014:1;31003:9;30999:17;30992:47;31056:131;31182:4;31056:131;:::i;:::-;31048:139;;30775:419;;;:::o;31200:114::-;;:::o;31320:398::-;31479:3;31500:83;31581:1;31576:3;31500:83;:::i;:::-;31493:90;;31592:93;31681:3;31592:93;:::i;:::-;31710:1;31705:3;31701:11;31694:18;;31320:398;;;:::o;31724:379::-;31908:3;31930:147;32073:3;31930:147;:::i;:::-;31923:154;;32094:3;32087:10;;31724:379;;;:::o;32109:223::-;32249:34;32245:1;32237:6;32233:14;32226:58;32318:6;32313:2;32305:6;32301:15;32294:31;32109:223;:::o;32338:366::-;32480:3;32501:67;32565:2;32560:3;32501:67;:::i;:::-;32494:74;;32577:93;32666:3;32577:93;:::i;:::-;32695:2;32690:3;32686:12;32679:19;;32338:366;;;:::o;32710:419::-;32876:4;32914:2;32903:9;32899:18;32891:26;;32963:9;32957:4;32953:20;32949:1;32938:9;32934:17;32927:47;32991:131;33117:4;32991:131;:::i;:::-;32983:139;;32710:419;;;:::o;33135:228::-;33275:34;33271:1;33263:6;33259:14;33252:58;33344:11;33339:2;33331:6;33327:15;33320:36;33135:228;:::o;33369:366::-;33511:3;33532:67;33596:2;33591:3;33532:67;:::i;:::-;33525:74;;33608:93;33697:3;33608:93;:::i;:::-;33726:2;33721:3;33717:12;33710:19;;33369:366;;;:::o;33741:419::-;33907:4;33945:2;33934:9;33930:18;33922:26;;33994:9;33988:4;33984:20;33980:1;33969:9;33965:17;33958:47;34022:131;34148:4;34022:131;:::i;:::-;34014:139;;33741:419;;;:::o;34166:225::-;34306:34;34302:1;34294:6;34290:14;34283:58;34375:8;34370:2;34362:6;34358:15;34351:33;34166:225;:::o;34397:366::-;34539:3;34560:67;34624:2;34619:3;34560:67;:::i;:::-;34553:74;;34636:93;34725:3;34636:93;:::i;:::-;34754:2;34749:3;34745:12;34738:19;;34397:366;;;:::o;34769:419::-;34935:4;34973:2;34962:9;34958:18;34950:26;;35022:9;35016:4;35012:20;35008:1;34997:9;34993:17;34986:47;35050:131;35176:4;35050:131;:::i;:::-;35042:139;;34769:419;;;:::o;35194:180::-;35242:77;35239:1;35232:88;35339:4;35336:1;35329:15;35363:4;35360:1;35353:15;35380:305;35420:3;35439:20;35457:1;35439:20;:::i;:::-;35434:25;;35473:20;35491:1;35473:20;:::i;:::-;35468:25;;35627:1;35559:66;35555:74;35552:1;35549:81;35546:107;;;35633:18;;:::i;:::-;35546:107;35677:1;35674;35670:9;35663:16;;35380:305;;;;:::o;35691:181::-;35831:33;35827:1;35819:6;35815:14;35808:57;35691:181;:::o;35878:366::-;36020:3;36041:67;36105:2;36100:3;36041:67;:::i;:::-;36034:74;;36117:93;36206:3;36117:93;:::i;:::-;36235:2;36230:3;36226:12;36219:19;;35878:366;;;:::o;36250:419::-;36416:4;36454:2;36443:9;36439:18;36431:26;;36503:9;36497:4;36493:20;36489:1;36478:9;36474:17;36467:47;36531:131;36657:4;36531:131;:::i;:::-;36523:139;;36250:419;;;:::o;36675:233::-;36714:3;36737:24;36755:5;36737:24;:::i;:::-;36728:33;;36783:66;36776:5;36773:77;36770:103;;;36853:18;;:::i;:::-;36770:103;36900:1;36893:5;36889:13;36882:20;;36675:233;;;:::o;36914:229::-;37054:34;37050:1;37042:6;37038:14;37031:58;37123:12;37118:2;37110:6;37106:15;37099:37;36914:229;:::o;37149:366::-;37291:3;37312:67;37376:2;37371:3;37312:67;:::i;:::-;37305:74;;37388:93;37477:3;37388:93;:::i;:::-;37506:2;37501:3;37497:12;37490:19;;37149:366;;;:::o;37521:419::-;37687:4;37725:2;37714:9;37710:18;37702:26;;37774:9;37768:4;37764:20;37760:1;37749:9;37745:17;37738:47;37802:131;37928:4;37802:131;:::i;:::-;37794:139;;37521:419;;;:::o;37946:234::-;38086:34;38082:1;38074:6;38070:14;38063:58;38155:17;38150:2;38142:6;38138:15;38131:42;37946:234;:::o;38186:366::-;38328:3;38349:67;38413:2;38408:3;38349:67;:::i;:::-;38342:74;;38425:93;38514:3;38425:93;:::i;:::-;38543:2;38538:3;38534:12;38527:19;;38186:366;;;:::o;38558:419::-;38724:4;38762:2;38751:9;38747:18;38739:26;;38811:9;38805:4;38801:20;38797:1;38786:9;38782:17;38775:47;38839:131;38965:4;38839:131;:::i;:::-;38831:139;;38558:419;;;:::o;38983:148::-;39085:11;39122:3;39107:18;;38983:148;;;;:::o;39137:377::-;39243:3;39271:39;39304:5;39271:39;:::i;:::-;39326:89;39408:6;39403:3;39326:89;:::i;:::-;39319:96;;39424:52;39469:6;39464:3;39457:4;39450:5;39446:16;39424:52;:::i;:::-;39501:6;39496:3;39492:16;39485:23;;39247:267;39137:377;;;;:::o;39520:435::-;39700:3;39722:95;39813:3;39804:6;39722:95;:::i;:::-;39715:102;;39834:95;39925:3;39916:6;39834:95;:::i;:::-;39827:102;;39946:3;39939:10;;39520:435;;;;;:::o;39961:221::-;40101:34;40097:1;40089:6;40085:14;40078:58;40170:4;40165:2;40157:6;40153:15;40146:29;39961:221;:::o;40188:366::-;40330:3;40351:67;40415:2;40410:3;40351:67;:::i;:::-;40344:74;;40427:93;40516:3;40427:93;:::i;:::-;40545:2;40540:3;40536:12;40529:19;;40188:366;;;:::o;40560:419::-;40726:4;40764:2;40753:9;40749:18;40741:26;;40813:9;40807:4;40803:20;40799:1;40788:9;40784:17;40777:47;40841:131;40967:4;40841:131;:::i;:::-;40833:139;;40560:419;;;:::o;40985:233::-;41125:34;41121:1;41113:6;41109:14;41102:58;41194:16;41189:2;41181:6;41177:15;41170:41;40985:233;:::o;41224:366::-;41366:3;41387:67;41451:2;41446:3;41387:67;:::i;:::-;41380:74;;41463:93;41552:3;41463:93;:::i;:::-;41581:2;41576:3;41572:12;41565:19;;41224:366;;;:::o;41596:419::-;41762:4;41800:2;41789:9;41785:18;41777:26;;41849:9;41843:4;41839:20;41835:1;41824:9;41820:17;41813:47;41877:131;42003:4;41877:131;:::i;:::-;41869:139;;41596:419;;;:::o;42021:332::-;42142:4;42180:2;42169:9;42165:18;42157:26;;42193:71;42261:1;42250:9;42246:17;42237:6;42193:71;:::i;:::-;42274:72;42342:2;42331:9;42327:18;42318:6;42274:72;:::i;:::-;42021:332;;;;;:::o;42359:96::-;42393:8;42442:5;42437:3;42433:15;42412:36;;42359:96;;;:::o;42461:94::-;42499:7;42528:21;42543:5;42528:21;:::i;:::-;42517:32;;42461:94;;;:::o;42561:153::-;42664:43;42683:23;42700:5;42683:23;:::i;:::-;42664:43;:::i;:::-;42659:3;42652:56;42561:153;;:::o;42720:79::-;42759:7;42788:5;42777:16;;42720:79;;;:::o;42805:157::-;42910:45;42930:24;42948:5;42930:24;:::i;:::-;42910:45;:::i;:::-;42905:3;42898:58;42805:157;;:::o;42968:392::-;43106:3;43121:73;43190:3;43181:6;43121:73;:::i;:::-;43219:1;43214:3;43210:11;43203:18;;43231:75;43302:3;43293:6;43231:75;:::i;:::-;43331:2;43326:3;43322:12;43315:19;;43351:3;43344:10;;42968:392;;;;;:::o;43366:822::-;43599:4;43637:3;43626:9;43622:19;43614:27;;43651:69;43717:1;43706:9;43702:17;43693:6;43651:69;:::i;:::-;43730:72;43798:2;43787:9;43783:18;43774:6;43730:72;:::i;:::-;43849:9;43843:4;43839:20;43834:2;43823:9;43819:18;43812:48;43877:76;43948:4;43939:6;43877:76;:::i;:::-;43869:84;;43963:66;44025:2;44014:9;44010:18;44001:6;43963:66;:::i;:::-;44077:9;44071:4;44067:20;44061:3;44050:9;44046:19;44039:49;44105:76;44176:4;44167:6;44105:76;:::i;:::-;44097:84;;43366:822;;;;;;;;:::o;44194:143::-;44251:5;44282:6;44276:13;44267:22;;44298:33;44325:5;44298:33;:::i;:::-;44194:143;;;;:::o;44343:507::-;44422:6;44430;44479:2;44467:9;44458:7;44454:23;44450:32;44447:119;;;44485:79;;:::i;:::-;44447:119;44605:1;44630:64;44686:7;44677:6;44666:9;44662:22;44630:64;:::i;:::-;44620:74;;44576:128;44743:2;44769:64;44825:7;44816:6;44805:9;44801:22;44769:64;:::i;:::-;44759:74;;44714:129;44343:507;;;;;:::o;44856:303::-;44996:34;44992:1;44984:6;44980:14;44973:58;45065:34;45060:2;45052:6;45048:15;45041:59;45134:17;45129:2;45121:6;45117:15;45110:42;44856:303;:::o;45165:366::-;45307:3;45328:67;45392:2;45387:3;45328:67;:::i;:::-;45321:74;;45404:93;45493:3;45404:93;:::i;:::-;45522:2;45517:3;45513:12;45506:19;;45165:366;;;:::o;45537:419::-;45703:4;45741:2;45730:9;45726:18;45718:26;;45790:9;45784:4;45780:20;45776:1;45765:9;45761:17;45754:47;45818:131;45944:4;45818:131;:::i;:::-;45810:139;;45537:419;;;:::o;45984:798::-;46067:3;46104:5;46098:12;46133:36;46159:9;46133:36;:::i;:::-;46185:70;46248:6;46243:3;46185:70;:::i;:::-;46178:77;;46286:1;46275:9;46271:17;46302:1;46297:135;;;;46446:1;46441:335;;;;46264:512;;46297:135;46381:4;46377:9;46366;46362:25;46357:3;46350:38;46417:4;46412:3;46408:14;46401:21;;46297:135;;46441:335;46508:37;46539:5;46508:37;:::i;:::-;46567:1;46581:154;46595:6;46592:1;46589:13;46581:154;;;46669:7;46663:14;46659:1;46654:3;46650:11;46643:35;46719:1;46710:7;46706:15;46695:26;;46617:4;46614:1;46610:12;46605:17;;46581:154;;;46764:1;46759:3;46755:11;46748:18;;46448:328;;46264:512;;46071:711;;45984:798;;;;:::o;46788:104::-;46833:7;46862:24;46880:5;46862:24;:::i;:::-;46851:35;;46788:104;;;:::o;46898:142::-;47001:32;47027:5;47001:32;:::i;:::-;46996:3;46989:45;46898:142;;:::o;47046:1058::-;47344:4;47382:3;47371:9;47367:19;47359:27;;47396:69;47462:1;47451:9;47447:17;47438:6;47396:69;:::i;:::-;47512:9;47506:4;47502:20;47497:2;47486:9;47482:18;47475:48;47540:73;47608:4;47599:6;47540:73;:::i;:::-;47532:81;;47660:9;47654:4;47650:20;47645:2;47634:9;47630:18;47623:48;47688:76;47759:4;47750:6;47688:76;:::i;:::-;47680:84;;47774:88;47858:2;47847:9;47843:18;47834:6;47774:88;:::i;:::-;47872:73;47940:3;47929:9;47925:19;47916:6;47872:73;:::i;:::-;47993:9;47987:4;47983:20;47977:3;47966:9;47962:19;47955:49;48021:76;48092:4;48083:6;48021:76;:::i;:::-;48013:84;;47046:1058;;;;;;;;;:::o;48110:225::-;48250:34;48246:1;48238:6;48234:14;48227:58;48319:8;48314:2;48306:6;48302:15;48295:33;48110:225;:::o;48341:366::-;48483:3;48504:67;48568:2;48563:3;48504:67;:::i;:::-;48497:74;;48580:93;48669:3;48580:93;:::i;:::-;48698:2;48693:3;48689:12;48682:19;;48341:366;;;:::o;48713:419::-;48879:4;48917:2;48906:9;48902:18;48894:26;;48966:9;48960:4;48956:20;48952:1;48941:9;48937:17;48930:47;48994:131;49120:4;48994:131;:::i;:::-;48986:139;;48713:419;;;:::o;49160:314::-;49274:3;49295:88;49376:6;49371:3;49295:88;:::i;:::-;49288:95;;49393:43;49429:6;49424:3;49417:5;49393:43;:::i;:::-;49461:6;49456:3;49452:16;49445:23;;49160:314;;;;;:::o;49480:291::-;49620:3;49642:103;49741:3;49732:6;49724;49642:103;:::i;:::-;49635:110;;49762:3;49755:10;;49480:291;;;;;:::o;49777:176::-;49917:28;49913:1;49905:6;49901:14;49894:52;49777:176;:::o;49959:366::-;50101:3;50122:67;50186:2;50181:3;50122:67;:::i;:::-;50115:74;;50198:93;50287:3;50198:93;:::i;:::-;50316:2;50311:3;50307:12;50300:19;;49959:366;;;:::o;50331:419::-;50497:4;50535:2;50524:9;50520:18;50512:26;;50584:9;50578:4;50574:20;50570:1;50559:9;50555:17;50548:47;50612:131;50738:4;50612:131;:::i;:::-;50604:139;;50331:419;;;:::o;50778:301::-;50874:3;50895:70;50958:6;50953:3;50895:70;:::i;:::-;50888:77;;50975:43;51011:6;51006:3;50999:5;50975:43;:::i;:::-;51043:29;51065:6;51043:29;:::i;:::-;51038:3;51034:39;51027:46;;50778:301;;;;;:::o;51085:739::-;51304:4;51342:3;51331:9;51327:19;51319:27;;51356:69;51422:1;51411:9;51407:17;51398:6;51356:69;:::i;:::-;51472:9;51466:4;51462:20;51457:2;51446:9;51442:18;51435:48;51500:76;51571:4;51562:6;51500:76;:::i;:::-;51492:84;;51586:70;51652:2;51641:9;51637:18;51628:6;51586:70;:::i;:::-;51703:9;51697:4;51693:20;51688:2;51677:9;51673:18;51666:48;51731:86;51812:4;51803:6;51795;51731:86;:::i;:::-;51723:94;;51085:739;;;;;;;;:::o;51830:225::-;51970:34;51966:1;51958:6;51954:14;51947:58;52039:8;52034:2;52026:6;52022:15;52015:33;51830:225;:::o;52061:366::-;52203:3;52224:67;52288:2;52283:3;52224:67;:::i;:::-;52217:74;;52300:93;52389:3;52300:93;:::i;:::-;52418:2;52413:3;52409:12;52402:19;;52061:366;;;:::o;52433:419::-;52599:4;52637:2;52626:9;52622:18;52614:26;;52686:9;52680:4;52676:20;52672:1;52661:9;52657:17;52650:47;52714:131;52840:4;52714:131;:::i;:::-;52706:139;;52433:419;;;:::o;52858:138::-;52939:32;52965:5;52939:32;:::i;:::-;52932:5;52929:43;52919:71;;52986:1;52983;52976:12;52919:71;52858:138;:::o;53002:159::-;53067:5;53098:6;53092:13;53083:22;;53114:41;53149:5;53114:41;:::i;:::-;53002:159;;;;:::o;53167:523::-;53254:6;53262;53311:2;53299:9;53290:7;53286:23;53282:32;53279:119;;;53317:79;;:::i;:::-;53279:119;53437:1;53462:72;53526:7;53517:6;53506:9;53502:22;53462:72;:::i;:::-;53452:82;;53408:136;53583:2;53609:64;53665:7;53656:6;53645:9;53641:22;53609:64;:::i;:::-;53599:74;;53554:129;53167:523;;;;;:::o;53696:231::-;53836:34;53832:1;53824:6;53820:14;53813:58;53905:14;53900:2;53892:6;53888:15;53881:39;53696:231;:::o;53933:366::-;54075:3;54096:67;54160:2;54155:3;54096:67;:::i;:::-;54089:74;;54172:93;54261:3;54172:93;:::i;:::-;54290:2;54285:3;54281:12;54274:19;;53933:366;;;:::o;54305:419::-;54471:4;54509:2;54498:9;54494:18;54486:26;;54558:9;54552:4;54548:20;54544:1;54533:9;54529:17;54522:47;54586:131;54712:4;54586:131;:::i;:::-;54578:139;;54305:419;;;:::o;54730:228::-;54870:34;54866:1;54858:6;54854:14;54847:58;54939:11;54934:2;54926:6;54922:15;54915:36;54730:228;:::o;54964:366::-;55106:3;55127:67;55191:2;55186:3;55127:67;:::i;:::-;55120:74;;55203:93;55292:3;55203:93;:::i;:::-;55321:2;55316:3;55312:12;55305:19;;54964:366;;;:::o;55336:419::-;55502:4;55540:2;55529:9;55525:18;55517:26;;55589:9;55583:4;55579:20;55575:1;55564:9;55560:17;55553:47;55617:131;55743:4;55617:131;:::i;:::-;55609:139;;55336:419;;;:::o;55761:223::-;55901:34;55897:1;55889:6;55885:14;55878:58;55970:6;55965:2;55957:6;55953:15;55946:31;55761:223;:::o;55990:366::-;56132:3;56153:67;56217:2;56212:3;56153:67;:::i;:::-;56146:74;;56229:93;56318:3;56229:93;:::i;:::-;56347:2;56342:3;56338:12;56331:19;;55990:366;;;:::o;56362:419::-;56528:4;56566:2;56555:9;56551:18;56543:26;;56615:9;56609:4;56605:20;56601:1;56590:9;56586:17;56579:47;56643:131;56769:4;56643:131;:::i;:::-;56635:139;;56362:419;;;:::o;56787:191::-;56827:4;56847:20;56865:1;56847:20;:::i;:::-;56842:25;;56881:20;56899:1;56881:20;:::i;:::-;56876:25;;56920:1;56917;56914:8;56911:34;;;56925:18;;:::i;:::-;56911:34;56970:1;56967;56963:9;56955:17;;56787:191;;;;:::o;56984:175::-;57124:27;57120:1;57112:6;57108:14;57101:51;56984:175;:::o;57165:366::-;57307:3;57328:67;57392:2;57387:3;57328:67;:::i;:::-;57321:74;;57404:93;57493:3;57404:93;:::i;:::-;57522:2;57517:3;57513:12;57506:19;;57165:366;;;:::o;57537:419::-;57703:4;57741:2;57730:9;57726:18;57718:26;;57790:9;57784:4;57780:20;57776:1;57765:9;57761:17;57754:47;57818:131;57944:4;57818:131;:::i;:::-;57810:139;;57537:419;;;:::o;57962:237::-;58102:34;58098:1;58090:6;58086:14;58079:58;58171:20;58166:2;58158:6;58154:15;58147:45;57962:237;:::o;58205:366::-;58347:3;58368:67;58432:2;58427:3;58368:67;:::i;:::-;58361:74;;58444:93;58533:3;58444:93;:::i;:::-;58562:2;58557:3;58553:12;58546:19;;58205:366;;;:::o;58577:419::-;58743:4;58781:2;58770:9;58766:18;58758:26;;58830:9;58824:4;58820:20;58816:1;58805:9;58801:17;58794:47;58858:131;58984:4;58858:131;:::i;:::-;58850:139;;58577:419;;;:::o;59002:180::-;59050:77;59047:1;59040:88;59147:4;59144:1;59137:15;59171:4;59168:1;59161:15;59188:185;59228:1;59245:20;59263:1;59245:20;:::i;:::-;59240:25;;59279:20;59297:1;59279:20;:::i;:::-;59274:25;;59318:1;59308:35;;59323:18;;:::i;:::-;59308:35;59365:1;59362;59358:9;59353:14;;59188:185;;;;:::o;59379:176::-;59411:1;59428:20;59446:1;59428:20;:::i;:::-;59423:25;;59462:20;59480:1;59462:20;:::i;:::-;59457:25;;59501:1;59491:35;;59506:18;;:::i;:::-;59491:35;59547:1;59544;59540:9;59535:14;;59379:176;;;;:::o;59561:180::-;59609:77;59606:1;59599:88;59706:4;59703:1;59696:15;59730:4;59727:1;59720:15;59747:640;59942:4;59980:3;59969:9;59965:19;59957:27;;59994:71;60062:1;60051:9;60047:17;60038:6;59994:71;:::i;:::-;60075:72;60143:2;60132:9;60128:18;60119:6;60075:72;:::i;:::-;60157;60225:2;60214:9;60210:18;60201:6;60157:72;:::i;:::-;60276:9;60270:4;60266:20;60261:2;60250:9;60246:18;60239:48;60304:76;60375:4;60366:6;60304:76;:::i;:::-;60296:84;;59747:640;;;;;;;:::o;60393:141::-;60449:5;60480:6;60474:13;60465:22;;60496:32;60522:5;60496:32;:::i;:::-;60393:141;;;;:::o;60540:349::-;60609:6;60658:2;60646:9;60637:7;60633:23;60629:32;60626:119;;;60664:79;;:::i;:::-;60626:119;60784:1;60809:63;60864:7;60855:6;60844:9;60840:22;60809:63;:::i;:::-;60799:73;;60755:127;60540:349;;;;:::o;60895:182::-;61035:34;61031:1;61023:6;61019:14;61012:58;60895:182;:::o;61083:366::-;61225:3;61246:67;61310:2;61305:3;61246:67;:::i;:::-;61239:74;;61322:93;61411:3;61322:93;:::i;:::-;61440:2;61435:3;61431:12;61424:19;;61083:366;;;:::o;61455:419::-;61621:4;61659:2;61648:9;61644:18;61636:26;;61708:9;61702:4;61698:20;61694:1;61683:9;61679:17;61672:47;61736:131;61862:4;61736:131;:::i;:::-;61728:139;;61455:419;;;:::o
Swarm Source
ipfs://a26308d94432bf952f70f18f4ef99788a52e0d8c5479f5c21336663bde72828f
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.