Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
0 KTNFT
Holders
505
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 KTNFTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
KnightsTemplarNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-21 */ // SPDX-License-Identifier: BUSL-1.1 // 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(), ".json")) : ""; } /** * @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/KnightsTemplarNFT.sol pragma solidity ^0.8.7; contract KnightsTemplarNFT is Ownable, ERC721, NonblockingReceiver { address public _owner; string private baseURI; uint256 nextTokenId = 1000; uint256 MAX_MINT_Amount = 2000; uint256 gasForDestinationLzReceive = 350000; bool public paused = true; constructor(string memory baseURI_, address _layerZeroEndpoint) ERC721("KnightsNFT", "KTNFT") { _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(!paused, "Sale hasn't not started yet"); require(balanceOf(msg.sender) < 2, "Each address may only own 2 NFTs"); require(numTokens < 3, "Knights Templar NFT: Max 2 NFTs per transaction"); require( nextTokenId + numTokens <= MAX_MINT_Amount, "Knights Templar NFT: Mint exceeds supply" ); _safeMint(msg.sender, ++nextTokenId); if (numTokens == 2) { _safeMint(msg.sender, ++nextTokenId); } //!cost checking requirement // if(msg.sender != _owner){ // require(msg.value >= cost * numTokens, "Transaction Failed - (Mint Cost: 0.01 ETH)"); // } } // 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, "Knights Templar NFT: 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, "Knights Templar NFT: Failed to withdraw"); } // 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; } function pause(bool _state) public onlyOwner { paused = _state; } }
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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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
60806040526103e8600c556107d0600d5562055730600e55600f805460ff191660011790553480156200003157600080fd5b5060405162002f2338038062002f2383398101604081905262000054916200023b565b6040518060400160405280600a81526020016912db9a59da1d1cd3919560b21b8152506040518060400160405280600581526020016412d513919560da1b815250620000af620000a96200012460201b60201c565b62000128565b8151620000c490600190602085019062000178565b508051620000da90600290602084019062000178565b5050600a8054336001600160a01b031991821617909155600780549091166001600160a01b0384161790555081516200011b90600b90602085019062000178565b5050506200037f565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000186906200032c565b90600052602060002090601f016020900481019282620001aa5760008555620001f5565b82601f10620001c557805160ff1916838001178555620001f5565b82800160010185558215620001f5579182015b82811115620001f5578251825591602001919060010190620001d8565b506200020392915062000207565b5090565b5b8082111562000203576000815560010162000208565b80516001600160a01b03811681146200023657600080fd5b919050565b600080604083850312156200024f57600080fd5b82516001600160401b03808211156200026757600080fd5b818501915085601f8301126200027c57600080fd5b81518181111562000291576200029162000369565b604051601f8201601f19908116603f01168101908382118183101715620002bc57620002bc62000369565b81604052828152602093508884848701011115620002d957600080fd5b600091505b82821015620002fd5784820184015181830185015290830190620002de565b828211156200030f5760008484830101525b9550620003219150508582016200021e565b925050509250929050565b600181811c908216806200034157607f821691505b602082108114156200036357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612b94806200038f6000396000f3fe6080604052600436106101d75760003560e01c8063715018a611610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c514610581578063eb8d72b7146105ca578063ed88c68e146101fc578063f2fde38b146105ea57600080fd5b8063b88d4fde1461051b578063c87b56dd1461053b578063cf89fa031461055b578063d1deba1f1461056e57600080fd5b8063943fb872116100d1578063943fb872146104a657806395d89b41146104c6578063a22cb465146104db578063b2bdfa7b146104fb57600080fd5b8063715018a6146103e85780637533d788146103fd5780638da5cb5b1461041d5780638ee749121461043b57600080fd5b806323b872dd1161017a5780635c975abb116101495780635c975abb1461036d5780636352211e146103875780636ecd2306146103a757806370a08231146103ba57600080fd5b806323b872dd146102ed5780632e1a7d4d1461030d57806342842e0e1461032d57806355f804b31461034d57600080fd5b806306fdde03116101b657806306fdde0314610253578063081812fc14610275578063095ea7b3146102ad5780631c37a822146102cd57600080fd5b80621d3567146101dc57806301ffc9a7146101fe57806302329a2914610233575b600080fd5b3480156101e857600080fd5b506101fc6101f73660046124ff565b61060a565b005b34801561020a57600080fd5b5061021e61021936600461232f565b610804565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b506101fc61024e366004612314565b610856565b34801561025f57600080fd5b50610268610893565b60405161022a9190612739565b34801561028157600080fd5b50610295610290366004612593565b610925565b6040516001600160a01b03909116815260200161022a565b3480156102b957600080fd5b506101fc6102c83660046122e8565b6109ba565b3480156102d957600080fd5b506101fc6102e83660046124ff565b610ad0565b3480156102f957600080fd5b506101fc610308366004612207565b610b3f565b34801561031957600080fd5b506101fc610328366004612593565b610b70565b34801561033957600080fd5b506101fc610348366004612207565b610c51565b34801561035957600080fd5b506101fc610368366004612369565b610c6c565b34801561037957600080fd5b50600f5461021e9060ff1681565b34801561039357600080fd5b506102956103a2366004612593565b610ca9565b6101fc6103b53660046125d0565b610d20565b3480156103c657600080fd5b506103da6103d5366004612183565b610ee8565b60405190815260200161022a565b3480156103f457600080fd5b506101fc610f6f565b34801561040957600080fd5b506102686104183660046123b1565b610fa5565b34801561042957600080fd5b506000546001600160a01b0316610295565b34801561044757600080fd5b5061049161045636600461241e565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b6040805192835260208301919091520161022a565b3480156104b257600080fd5b506101fc6104c1366004612593565b61103f565b3480156104d257600080fd5b5061026861106e565b3480156104e757600080fd5b506101fc6104f63660046122b3565b61107d565b34801561050757600080fd5b50600a54610295906001600160a01b031681565b34801561052757600080fd5b506101fc610536366004612248565b611088565b34801561054757600080fd5b50610268610556366004612593565b6110ba565b6101fc610569366004612577565b611195565b6101fc61057c366004612474565b61148c565b34801561058d57600080fd5b5061021e61059c3660046121ce565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156105d657600080fd5b506101fc6105e53660046123cc565b611619565b3480156105f657600080fd5b506101fc610605366004612183565b611661565b6007546001600160a01b0316331461062157600080fd5b61ffff84166000908152600960205260409020805461063f90612a71565b9050835114801561067e575061ffff841660009081526009602052604090819020905161066c919061264b565b60405180910390208380519060200120145b6106ec5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906107159087908790879087906004016128d9565b600060405180830381600087803b15801561072f57600080fd5b505af1925050508015610740575060015b6107fe576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff1681526020019081526020016000208460405161078a919061262f565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d906107f59086908690869086906128d9565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b148061083557506001600160e01b03198216635b5e139f60e01b145b8061085057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146108805760405162461bcd60e51b81526004016106e39061279e565b600f805460ff1916911515919091179055565b6060600180546108a290612a71565b80601f01602080910402602001604051908101604052809291908181526020018280546108ce90612a71565b801561091b5780601f106108f05761010080835404028352916020019161091b565b820191906000526020600020905b8154815290600101906020018083116108fe57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b031661099e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106e3565b506000908152600560205260409020546001600160a01b031690565b60006109c582610ca9565b9050806001600160a01b0316836001600160a01b03161415610a335760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106e3565b336001600160a01b0382161480610a4f5750610a4f813361059c565b610ac15760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106e3565b610acb83836116f9565b505050565b333014610b335760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b60648201526084016106e3565b6107fe84848484611767565b610b493382611794565b610b655760405162461bcd60e51b81526004016106e3906127d3565b610acb83838361188b565b6000546001600160a01b03163314610b9a5760405162461bcd60e51b81526004016106e39061279e565b600a546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610be7576040519150601f19603f3d011682016040523d82523d6000602084013e610bec565b606091505b5050905080610c4d5760405162461bcd60e51b815260206004820152602760248201527f4b6e69676874732054656d706c6172204e46543a204661696c656420746f20776044820152666974686472617760c81b60648201526084016106e3565b5050565b610acb83838360405180602001604052806000815250611088565b6000546001600160a01b03163314610c965760405162461bcd60e51b81526004016106e39061279e565b8051610c4d90600b906020840190611f5b565b6000818152600360205260408120546001600160a01b0316806108505760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106e3565b600f5460ff1615610d735760405162461bcd60e51b815260206004820152601b60248201527f53616c65206861736e2774206e6f74207374617274656420796574000000000060448201526064016106e3565b6002610d7e33610ee8565b10610dcb5760405162461bcd60e51b815260206004820181905260248201527f456163682061646472657373206d6179206f6e6c79206f776e2032204e46547360448201526064016106e3565b60038160ff1610610e365760405162461bcd60e51b815260206004820152602f60248201527f4b6e69676874732054656d706c6172204e46543a204d61782032204e4654732060448201526e3832b9103a3930b739b0b1ba34b7b760891b60648201526084016106e3565b600d548160ff16600c54610e4a9190612a02565b1115610ea95760405162461bcd60e51b815260206004820152602860248201527f4b6e69676874732054656d706c6172204e46543a204d696e74206578636565646044820152677320737570706c7960c01b60648201526084016106e3565b610ec633600c60008154610ebc90612aac565b9182905550611a2b565b8060ff1660021415610ee557610ee533600c60008154610ebc90612aac565b50565b60006001600160a01b038216610f535760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106e3565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610f995760405162461bcd60e51b81526004016106e39061279e565b610fa36000611a45565b565b60096020526000908152604090208054610fbe90612a71565b80601f0160208091040260200160405190810160405280929190818152602001828054610fea90612a71565b80156110375780601f1061100c57610100808354040283529160200191611037565b820191906000526020600020905b81548152906001019060200180831161101a57829003601f168201915b505050505081565b6000546001600160a01b031633146110695760405162461bcd60e51b81526004016106e39061279e565b600e55565b6060600280546108a290612a71565b610c4d338383611a95565b6110923383611794565b6110ae5760405162461bcd60e51b81526004016106e3906127d3565b6107fe84848484611b64565b6000818152600360205260409020546060906001600160a01b03166111395760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106e3565b6000611143611b97565b90506000815111611163576040518060200160405280600081525061118e565b8061116d84611ba6565b60405160200161117e9291906126bd565b6040516020818303038152906040525b9392505050565b61119e81610ca9565b6001600160a01b0316336001600160a01b0316146112095760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b60648201526084016106e3565b61ffff82166000908152600960205260408120805461122790612a71565b90501161128d5760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b60648201526084016106e3565b61129681611ca3565b60408051336020820152808201839052815180820383018152606082018352600e54600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb1090611319908990309089908790899060a601612824565b604080518083038186803b15801561133057600080fd5b505afa158015611344573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136891906125ac565b509050803410156114075760405162461bcd60e51b815260206004820152605860248201527f4b6e69676874732054656d706c6172204e46543a206d73672e76616c7565206e60448201527f6f7420656e6f75676820746f20636f766572206d6573736167654665652e205360648201527f656e642067617320666f72206d65737361676520666565730000000000000000608482015260a4016106e3565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c5803100923492611452928c928b913391908b90600401612922565b6000604051808303818588803b15801561146b57600080fd5b505af115801561147f573d6000803e3d6000fd5b5050505050505050505050565b61ffff851660009081526008602052604080822090516114ad90879061262f565b90815260408051602092819003830190206001600160401b03871660009081529252902060018101549091506115345760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b60648201526084016106e3565b80548214801561155e57508060010154838360405161155492919061261f565b6040518091039020145b6115aa5760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f616400000000000060448201526064016106e3565b60008082556001820155604051630e1bd41160e11b81523090631c37a822906115df9089908990899089908990600401612878565b600060405180830381600087803b1580156115f957600080fd5b505af115801561160d573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b031633146116435760405162461bcd60e51b81526004016106e39061279e565b61ffff831660009081526009602052604090206107fe908383611fdf565b6000546001600160a01b0316331461168b5760405162461bcd60e51b81526004016106e39061279e565b6001600160a01b0381166116f05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106e3565b610ee581611a45565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061172e82610ca9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000808280602001905181019061177e91906121a0565b9150915061178c8282611a2b565b505050505050565b6000818152600360205260408120546001600160a01b031661180d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106e3565b600061181883610ca9565b9050806001600160a01b0316846001600160a01b031614806118535750836001600160a01b031661184884610925565b6001600160a01b0316145b8061188357506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661189e82610ca9565b6001600160a01b0316146119065760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106e3565b6001600160a01b0382166119685760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106e3565b6119736000826116f9565b6001600160a01b038316600090815260046020526040812080546001929061199c908490612a2e565b90915550506001600160a01b03821660009081526004602052604081208054600192906119ca908490612a02565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610c4d828260405180602001604052806000815250611d3e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611af75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106e3565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611b6f84848461188b565b611b7b84848484611d71565b6107fe5760405162461bcd60e51b81526004016106e39061274c565b6060600b80546108a290612a71565b606081611bca5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611bf45780611bde81612aac565b9150611bed9050600a83612a1a565b9150611bce565b6000816001600160401b03811115611c0e57611c0e612b1d565b6040519080825280601f01601f191660200182016040528015611c38576020820181803683370190505b5090505b841561188357611c4d600183612a2e565b9150611c5a600a86612ac7565b611c65906030612a02565b60f81b818381518110611c7a57611c7a612b07565b60200101906001600160f81b031916908160001a905350611c9c600a86612a1a565b9450611c3c565b6000611cae82610ca9565b9050611cbb6000836116f9565b6001600160a01b0381166000908152600460205260408120805460019290611ce4908490612a2e565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611d488383611e7e565b611d556000848484611d71565b610acb5760405162461bcd60e51b81526004016106e39061274c565b60006001600160a01b0384163b15611e7357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611db59033908990889088906004016126fc565b602060405180830381600087803b158015611dcf57600080fd5b505af1925050508015611dff575060408051601f3d908101601f19168201909252611dfc9181019061234c565b60015b611e59573d808015611e2d576040519150601f19603f3d011682016040523d82523d6000602084013e611e32565b606091505b508051611e515760405162461bcd60e51b81526004016106e39061274c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611883565b506001949350505050565b6001600160a01b038216611ed45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106e3565b6001600160a01b0382166000908152600460205260408120805460019290611efd908490612a02565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611f6790612a71565b90600052602060002090601f016020900481019282611f895760008555611fcf565b82601f10611fa257805160ff1916838001178555611fcf565b82800160010185558215611fcf579182015b82811115611fcf578251825591602001919060010190611fb4565b50611fdb929150612053565b5090565b828054611feb90612a71565b90600052602060002090601f01602090048101928261200d5760008555611fcf565b82601f106120265782800160ff19823516178555611fcf565b82800160010185558215611fcf579182015b82811115611fcf578235825591602001919060010190612038565b5b80821115611fdb5760008155600101612054565b60006001600160401b038084111561208257612082612b1d565b604051601f8501601f19908116603f011681019082821181831017156120aa576120aa612b1d565b816040528093508581528686860111156120c357600080fd5b858560208301376000602087830101525050509392505050565b803580151581146120ed57600080fd5b919050565b60008083601f84011261210457600080fd5b5081356001600160401b0381111561211b57600080fd5b60208301915083602082850101111561213357600080fd5b9250929050565b600082601f83011261214b57600080fd5b61118e83833560208501612068565b803561ffff811681146120ed57600080fd5b80356001600160401b03811681146120ed57600080fd5b60006020828403121561219557600080fd5b813561118e81612b33565b600080604083850312156121b357600080fd5b82516121be81612b33565b6020939093015192949293505050565b600080604083850312156121e157600080fd5b82356121ec81612b33565b915060208301356121fc81612b33565b809150509250929050565b60008060006060848603121561221c57600080fd5b833561222781612b33565b9250602084013561223781612b33565b929592945050506040919091013590565b6000806000806080858703121561225e57600080fd5b843561226981612b33565b9350602085013561227981612b33565b92506040850135915060608501356001600160401b0381111561229b57600080fd5b6122a78782880161213a565b91505092959194509250565b600080604083850312156122c657600080fd5b82356122d181612b33565b91506122df602084016120dd565b90509250929050565b600080604083850312156122fb57600080fd5b823561230681612b33565b946020939093013593505050565b60006020828403121561232657600080fd5b61118e826120dd565b60006020828403121561234157600080fd5b813561118e81612b48565b60006020828403121561235e57600080fd5b815161118e81612b48565b60006020828403121561237b57600080fd5b81356001600160401b0381111561239157600080fd5b8201601f810184136123a257600080fd5b61188384823560208401612068565b6000602082840312156123c357600080fd5b61118e8261215a565b6000806000604084860312156123e157600080fd5b6123ea8461215a565b925060208401356001600160401b0381111561240557600080fd5b612411868287016120f2565b9497909650939450505050565b60008060006060848603121561243357600080fd5b61243c8461215a565b925060208401356001600160401b0381111561245757600080fd5b6124638682870161213a565b925050604084013590509250925092565b60008060008060006080868803121561248c57600080fd5b6124958661215a565b945060208601356001600160401b03808211156124b157600080fd5b6124bd89838a0161213a565b95506124cb6040890161216c565b945060608801359150808211156124e157600080fd5b506124ee888289016120f2565b969995985093965092949392505050565b6000806000806080858703121561251557600080fd5b61251e8561215a565b935060208501356001600160401b038082111561253a57600080fd5b6125468883890161213a565b94506125546040880161216c565b9350606087013591508082111561256a57600080fd5b506122a78782880161213a565b6000806040838503121561258a57600080fd5b6123068361215a565b6000602082840312156125a557600080fd5b5035919050565b600080604083850312156125bf57600080fd5b505080516020909101519092909150565b6000602082840312156125e257600080fd5b813560ff8116811461118e57600080fd5b6000815180845261260b816020860160208601612a45565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b60008251612641818460208701612a45565b9190910192915050565b600080835461265981612a71565b600182811680156126715760018114612682576126b1565b60ff198416875282870194506126b1565b8760005260208060002060005b858110156126a85781548a82015290840190820161268f565b50505082870194505b50929695505050505050565b600083516126cf818460208801612a45565b8351908301906126e3818360208801612a45565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061272f908301846125f3565b9695505050505050565b60208152600061118e60208301846125f3565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b61ffff861681526001600160a01b038516602082015260a060408201819052600090612852908301866125f3565b8415156060840152828103608084015261286c81856125f3565b98975050505050505050565b61ffff8616815260806020820152600061289560808301876125f3565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff851681526080602082015260006128f660808301866125f3565b6001600160401b0385166040840152828103606084015261291781856125f3565b979650505050505050565b61ffff871681526000602060c0818401526000885461294081612a71565b8060c087015260e06001808416600081146129625760018114612977576129a5565b60ff19851689840152610100890195506129a5565b8d6000528660002060005b8581101561299d5781548b8201860152908301908801612982565b8a0184019650505b505050505083810360408501526129bc81896125f3565b9150506129d460608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a08401526129f581856125f3565b9998505050505050505050565b60008219821115612a1557612a15612adb565b500190565b600082612a2957612a29612af1565b500490565b600082821015612a4057612a40612adb565b500390565b60005b83811015612a60578181015183820152602001612a48565b838111156107fe5750506000910152565b600181811c90821680612a8557607f821691505b60208210811415612aa657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ac057612ac0612adb565b5060010190565b600082612ad657612ad6612af1565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ee557600080fd5b6001600160e01b031981168114610ee557600080fdfea26469706673582212208d7f77cee5d9a1d724001edcbf497c580d9e14425591f10c9a71f75838a7df6b64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d596557675954536e69376f43587474453372544e385356317236373769677a694e34417143456658574648562f00000000000000000000
Deployed Bytecode
0x6080604052600436106101d75760003560e01c8063715018a611610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c514610581578063eb8d72b7146105ca578063ed88c68e146101fc578063f2fde38b146105ea57600080fd5b8063b88d4fde1461051b578063c87b56dd1461053b578063cf89fa031461055b578063d1deba1f1461056e57600080fd5b8063943fb872116100d1578063943fb872146104a657806395d89b41146104c6578063a22cb465146104db578063b2bdfa7b146104fb57600080fd5b8063715018a6146103e85780637533d788146103fd5780638da5cb5b1461041d5780638ee749121461043b57600080fd5b806323b872dd1161017a5780635c975abb116101495780635c975abb1461036d5780636352211e146103875780636ecd2306146103a757806370a08231146103ba57600080fd5b806323b872dd146102ed5780632e1a7d4d1461030d57806342842e0e1461032d57806355f804b31461034d57600080fd5b806306fdde03116101b657806306fdde0314610253578063081812fc14610275578063095ea7b3146102ad5780631c37a822146102cd57600080fd5b80621d3567146101dc57806301ffc9a7146101fe57806302329a2914610233575b600080fd5b3480156101e857600080fd5b506101fc6101f73660046124ff565b61060a565b005b34801561020a57600080fd5b5061021e61021936600461232f565b610804565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b506101fc61024e366004612314565b610856565b34801561025f57600080fd5b50610268610893565b60405161022a9190612739565b34801561028157600080fd5b50610295610290366004612593565b610925565b6040516001600160a01b03909116815260200161022a565b3480156102b957600080fd5b506101fc6102c83660046122e8565b6109ba565b3480156102d957600080fd5b506101fc6102e83660046124ff565b610ad0565b3480156102f957600080fd5b506101fc610308366004612207565b610b3f565b34801561031957600080fd5b506101fc610328366004612593565b610b70565b34801561033957600080fd5b506101fc610348366004612207565b610c51565b34801561035957600080fd5b506101fc610368366004612369565b610c6c565b34801561037957600080fd5b50600f5461021e9060ff1681565b34801561039357600080fd5b506102956103a2366004612593565b610ca9565b6101fc6103b53660046125d0565b610d20565b3480156103c657600080fd5b506103da6103d5366004612183565b610ee8565b60405190815260200161022a565b3480156103f457600080fd5b506101fc610f6f565b34801561040957600080fd5b506102686104183660046123b1565b610fa5565b34801561042957600080fd5b506000546001600160a01b0316610295565b34801561044757600080fd5b5061049161045636600461241e565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b6040805192835260208301919091520161022a565b3480156104b257600080fd5b506101fc6104c1366004612593565b61103f565b3480156104d257600080fd5b5061026861106e565b3480156104e757600080fd5b506101fc6104f63660046122b3565b61107d565b34801561050757600080fd5b50600a54610295906001600160a01b031681565b34801561052757600080fd5b506101fc610536366004612248565b611088565b34801561054757600080fd5b50610268610556366004612593565b6110ba565b6101fc610569366004612577565b611195565b6101fc61057c366004612474565b61148c565b34801561058d57600080fd5b5061021e61059c3660046121ce565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156105d657600080fd5b506101fc6105e53660046123cc565b611619565b3480156105f657600080fd5b506101fc610605366004612183565b611661565b6007546001600160a01b0316331461062157600080fd5b61ffff84166000908152600960205260409020805461063f90612a71565b9050835114801561067e575061ffff841660009081526009602052604090819020905161066c919061264b565b60405180910390208380519060200120145b6106ec5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906107159087908790879087906004016128d9565b600060405180830381600087803b15801561072f57600080fd5b505af1925050508015610740575060015b6107fe576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff1681526020019081526020016000208460405161078a919061262f565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d906107f59086908690869086906128d9565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b148061083557506001600160e01b03198216635b5e139f60e01b145b8061085057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146108805760405162461bcd60e51b81526004016106e39061279e565b600f805460ff1916911515919091179055565b6060600180546108a290612a71565b80601f01602080910402602001604051908101604052809291908181526020018280546108ce90612a71565b801561091b5780601f106108f05761010080835404028352916020019161091b565b820191906000526020600020905b8154815290600101906020018083116108fe57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b031661099e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106e3565b506000908152600560205260409020546001600160a01b031690565b60006109c582610ca9565b9050806001600160a01b0316836001600160a01b03161415610a335760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106e3565b336001600160a01b0382161480610a4f5750610a4f813361059c565b610ac15760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106e3565b610acb83836116f9565b505050565b333014610b335760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b60648201526084016106e3565b6107fe84848484611767565b610b493382611794565b610b655760405162461bcd60e51b81526004016106e3906127d3565b610acb83838361188b565b6000546001600160a01b03163314610b9a5760405162461bcd60e51b81526004016106e39061279e565b600a546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610be7576040519150601f19603f3d011682016040523d82523d6000602084013e610bec565b606091505b5050905080610c4d5760405162461bcd60e51b815260206004820152602760248201527f4b6e69676874732054656d706c6172204e46543a204661696c656420746f20776044820152666974686472617760c81b60648201526084016106e3565b5050565b610acb83838360405180602001604052806000815250611088565b6000546001600160a01b03163314610c965760405162461bcd60e51b81526004016106e39061279e565b8051610c4d90600b906020840190611f5b565b6000818152600360205260408120546001600160a01b0316806108505760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106e3565b600f5460ff1615610d735760405162461bcd60e51b815260206004820152601b60248201527f53616c65206861736e2774206e6f74207374617274656420796574000000000060448201526064016106e3565b6002610d7e33610ee8565b10610dcb5760405162461bcd60e51b815260206004820181905260248201527f456163682061646472657373206d6179206f6e6c79206f776e2032204e46547360448201526064016106e3565b60038160ff1610610e365760405162461bcd60e51b815260206004820152602f60248201527f4b6e69676874732054656d706c6172204e46543a204d61782032204e4654732060448201526e3832b9103a3930b739b0b1ba34b7b760891b60648201526084016106e3565b600d548160ff16600c54610e4a9190612a02565b1115610ea95760405162461bcd60e51b815260206004820152602860248201527f4b6e69676874732054656d706c6172204e46543a204d696e74206578636565646044820152677320737570706c7960c01b60648201526084016106e3565b610ec633600c60008154610ebc90612aac565b9182905550611a2b565b8060ff1660021415610ee557610ee533600c60008154610ebc90612aac565b50565b60006001600160a01b038216610f535760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106e3565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610f995760405162461bcd60e51b81526004016106e39061279e565b610fa36000611a45565b565b60096020526000908152604090208054610fbe90612a71565b80601f0160208091040260200160405190810160405280929190818152602001828054610fea90612a71565b80156110375780601f1061100c57610100808354040283529160200191611037565b820191906000526020600020905b81548152906001019060200180831161101a57829003601f168201915b505050505081565b6000546001600160a01b031633146110695760405162461bcd60e51b81526004016106e39061279e565b600e55565b6060600280546108a290612a71565b610c4d338383611a95565b6110923383611794565b6110ae5760405162461bcd60e51b81526004016106e3906127d3565b6107fe84848484611b64565b6000818152600360205260409020546060906001600160a01b03166111395760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106e3565b6000611143611b97565b90506000815111611163576040518060200160405280600081525061118e565b8061116d84611ba6565b60405160200161117e9291906126bd565b6040516020818303038152906040525b9392505050565b61119e81610ca9565b6001600160a01b0316336001600160a01b0316146112095760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b60648201526084016106e3565b61ffff82166000908152600960205260408120805461122790612a71565b90501161128d5760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b60648201526084016106e3565b61129681611ca3565b60408051336020820152808201839052815180820383018152606082018352600e54600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb1090611319908990309089908790899060a601612824565b604080518083038186803b15801561133057600080fd5b505afa158015611344573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136891906125ac565b509050803410156114075760405162461bcd60e51b815260206004820152605860248201527f4b6e69676874732054656d706c6172204e46543a206d73672e76616c7565206e60448201527f6f7420656e6f75676820746f20636f766572206d6573736167654665652e205360648201527f656e642067617320666f72206d65737361676520666565730000000000000000608482015260a4016106e3565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c5803100923492611452928c928b913391908b90600401612922565b6000604051808303818588803b15801561146b57600080fd5b505af115801561147f573d6000803e3d6000fd5b5050505050505050505050565b61ffff851660009081526008602052604080822090516114ad90879061262f565b90815260408051602092819003830190206001600160401b03871660009081529252902060018101549091506115345760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b60648201526084016106e3565b80548214801561155e57508060010154838360405161155492919061261f565b6040518091039020145b6115aa5760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f616400000000000060448201526064016106e3565b60008082556001820155604051630e1bd41160e11b81523090631c37a822906115df9089908990899089908990600401612878565b600060405180830381600087803b1580156115f957600080fd5b505af115801561160d573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b031633146116435760405162461bcd60e51b81526004016106e39061279e565b61ffff831660009081526009602052604090206107fe908383611fdf565b6000546001600160a01b0316331461168b5760405162461bcd60e51b81526004016106e39061279e565b6001600160a01b0381166116f05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106e3565b610ee581611a45565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061172e82610ca9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000808280602001905181019061177e91906121a0565b9150915061178c8282611a2b565b505050505050565b6000818152600360205260408120546001600160a01b031661180d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106e3565b600061181883610ca9565b9050806001600160a01b0316846001600160a01b031614806118535750836001600160a01b031661184884610925565b6001600160a01b0316145b8061188357506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661189e82610ca9565b6001600160a01b0316146119065760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106e3565b6001600160a01b0382166119685760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106e3565b6119736000826116f9565b6001600160a01b038316600090815260046020526040812080546001929061199c908490612a2e565b90915550506001600160a01b03821660009081526004602052604081208054600192906119ca908490612a02565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610c4d828260405180602001604052806000815250611d3e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611af75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106e3565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611b6f84848461188b565b611b7b84848484611d71565b6107fe5760405162461bcd60e51b81526004016106e39061274c565b6060600b80546108a290612a71565b606081611bca5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611bf45780611bde81612aac565b9150611bed9050600a83612a1a565b9150611bce565b6000816001600160401b03811115611c0e57611c0e612b1d565b6040519080825280601f01601f191660200182016040528015611c38576020820181803683370190505b5090505b841561188357611c4d600183612a2e565b9150611c5a600a86612ac7565b611c65906030612a02565b60f81b818381518110611c7a57611c7a612b07565b60200101906001600160f81b031916908160001a905350611c9c600a86612a1a565b9450611c3c565b6000611cae82610ca9565b9050611cbb6000836116f9565b6001600160a01b0381166000908152600460205260408120805460019290611ce4908490612a2e565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611d488383611e7e565b611d556000848484611d71565b610acb5760405162461bcd60e51b81526004016106e39061274c565b60006001600160a01b0384163b15611e7357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611db59033908990889088906004016126fc565b602060405180830381600087803b158015611dcf57600080fd5b505af1925050508015611dff575060408051601f3d908101601f19168201909252611dfc9181019061234c565b60015b611e59573d808015611e2d576040519150601f19603f3d011682016040523d82523d6000602084013e611e32565b606091505b508051611e515760405162461bcd60e51b81526004016106e39061274c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611883565b506001949350505050565b6001600160a01b038216611ed45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106e3565b6001600160a01b0382166000908152600460205260408120805460019290611efd908490612a02565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611f6790612a71565b90600052602060002090601f016020900481019282611f895760008555611fcf565b82601f10611fa257805160ff1916838001178555611fcf565b82800160010185558215611fcf579182015b82811115611fcf578251825591602001919060010190611fb4565b50611fdb929150612053565b5090565b828054611feb90612a71565b90600052602060002090601f01602090048101928261200d5760008555611fcf565b82601f106120265782800160ff19823516178555611fcf565b82800160010185558215611fcf579182015b82811115611fcf578235825591602001919060010190612038565b5b80821115611fdb5760008155600101612054565b60006001600160401b038084111561208257612082612b1d565b604051601f8501601f19908116603f011681019082821181831017156120aa576120aa612b1d565b816040528093508581528686860111156120c357600080fd5b858560208301376000602087830101525050509392505050565b803580151581146120ed57600080fd5b919050565b60008083601f84011261210457600080fd5b5081356001600160401b0381111561211b57600080fd5b60208301915083602082850101111561213357600080fd5b9250929050565b600082601f83011261214b57600080fd5b61118e83833560208501612068565b803561ffff811681146120ed57600080fd5b80356001600160401b03811681146120ed57600080fd5b60006020828403121561219557600080fd5b813561118e81612b33565b600080604083850312156121b357600080fd5b82516121be81612b33565b6020939093015192949293505050565b600080604083850312156121e157600080fd5b82356121ec81612b33565b915060208301356121fc81612b33565b809150509250929050565b60008060006060848603121561221c57600080fd5b833561222781612b33565b9250602084013561223781612b33565b929592945050506040919091013590565b6000806000806080858703121561225e57600080fd5b843561226981612b33565b9350602085013561227981612b33565b92506040850135915060608501356001600160401b0381111561229b57600080fd5b6122a78782880161213a565b91505092959194509250565b600080604083850312156122c657600080fd5b82356122d181612b33565b91506122df602084016120dd565b90509250929050565b600080604083850312156122fb57600080fd5b823561230681612b33565b946020939093013593505050565b60006020828403121561232657600080fd5b61118e826120dd565b60006020828403121561234157600080fd5b813561118e81612b48565b60006020828403121561235e57600080fd5b815161118e81612b48565b60006020828403121561237b57600080fd5b81356001600160401b0381111561239157600080fd5b8201601f810184136123a257600080fd5b61188384823560208401612068565b6000602082840312156123c357600080fd5b61118e8261215a565b6000806000604084860312156123e157600080fd5b6123ea8461215a565b925060208401356001600160401b0381111561240557600080fd5b612411868287016120f2565b9497909650939450505050565b60008060006060848603121561243357600080fd5b61243c8461215a565b925060208401356001600160401b0381111561245757600080fd5b6124638682870161213a565b925050604084013590509250925092565b60008060008060006080868803121561248c57600080fd5b6124958661215a565b945060208601356001600160401b03808211156124b157600080fd5b6124bd89838a0161213a565b95506124cb6040890161216c565b945060608801359150808211156124e157600080fd5b506124ee888289016120f2565b969995985093965092949392505050565b6000806000806080858703121561251557600080fd5b61251e8561215a565b935060208501356001600160401b038082111561253a57600080fd5b6125468883890161213a565b94506125546040880161216c565b9350606087013591508082111561256a57600080fd5b506122a78782880161213a565b6000806040838503121561258a57600080fd5b6123068361215a565b6000602082840312156125a557600080fd5b5035919050565b600080604083850312156125bf57600080fd5b505080516020909101519092909150565b6000602082840312156125e257600080fd5b813560ff8116811461118e57600080fd5b6000815180845261260b816020860160208601612a45565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b60008251612641818460208701612a45565b9190910192915050565b600080835461265981612a71565b600182811680156126715760018114612682576126b1565b60ff198416875282870194506126b1565b8760005260208060002060005b858110156126a85781548a82015290840190820161268f565b50505082870194505b50929695505050505050565b600083516126cf818460208801612a45565b8351908301906126e3818360208801612a45565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061272f908301846125f3565b9695505050505050565b60208152600061118e60208301846125f3565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b61ffff861681526001600160a01b038516602082015260a060408201819052600090612852908301866125f3565b8415156060840152828103608084015261286c81856125f3565b98975050505050505050565b61ffff8616815260806020820152600061289560808301876125f3565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff851681526080602082015260006128f660808301866125f3565b6001600160401b0385166040840152828103606084015261291781856125f3565b979650505050505050565b61ffff871681526000602060c0818401526000885461294081612a71565b8060c087015260e06001808416600081146129625760018114612977576129a5565b60ff19851689840152610100890195506129a5565b8d6000528660002060005b8581101561299d5781548b8201860152908301908801612982565b8a0184019650505b505050505083810360408501526129bc81896125f3565b9150506129d460608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a08401526129f581856125f3565b9998505050505050505050565b60008219821115612a1557612a15612adb565b500190565b600082612a2957612a29612af1565b500490565b600082821015612a4057612a40612adb565b500390565b60005b83811015612a60578181015183820152602001612a48565b838111156107fe5750506000910152565b600181811c90821680612a8557607f821691505b60208210811415612aa657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ac057612ac0612adb565b5060010190565b600082612ad657612ad6612af1565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ee557600080fd5b6001600160e01b031981168114610ee557600080fdfea26469706673582212208d7f77cee5d9a1d724001edcbf497c580d9e14425591f10c9a71f75838a7df6b64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d596557675954536e69376f43587474453372544e385356317236373769677a694e34417143456658574648562f00000000000000000000
-----Decoded View---------------
Arg [0] : baseURI_ (string): ipfs://QmYeWgYTSni7oCXttE3rTN8SV1r677igziN4AqCEfXWFHV/
Arg [1] : _layerZeroEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d596557675954536e69376f43587474453372544e385356
Arg [4] : 317236373769677a694e34417143456658574648562f00000000000000000000
Deployed Bytecode Sourcemap
50188:4591:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46804:1098;;;;;;;;;;-1:-1:-1;46804:1098:0;;;;;:::i;:::-;;:::i;:::-;;32852:355;;;;;;;;;;-1:-1:-1;32852:355:0;;;;;:::i;:::-;;:::i;:::-;;;13218:14:1;;13211:22;13193:41;;13181:2;13166:18;32852:355:0;;;;;;;;54697:79;;;;;;;;;;-1:-1:-1;54697:79:0;;;;;:::i;:::-;;:::i;34021:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35731:308::-;;;;;;;;;;-1:-1:-1;35731:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;12237:32:1;;;12219:51;;12207:2;12192:18;35731:308:0;12073:203:1;35254:411:0;;;;;;;;;;-1:-1:-1;35254:411:0;;;;;:::i;:::-;;:::i;47910:435::-;;;;;;;;;;-1:-1:-1;47910:435:0;;;;;:::i;:::-;;:::i;36650:376::-;;;;;;;;;;-1:-1:-1;36650:376:0;;;;;:::i;:::-;;:::i;53666:188::-;;;;;;;;;;-1:-1:-1;53666:188:0;;;;;:::i;:::-;;:::i;37097:185::-;;;;;;;;;;-1:-1:-1;37097:185:0;;;;;:::i;:::-;;:::i;53434:90::-;;;;;;;;;;-1:-1:-1;53434:90:0;;;;;:::i;:::-;;:::i;50439:25::-;;;;;;;;;;-1:-1:-1;50439:25:0;;;;;;;;33628:326;;;;;;;;;;-1:-1:-1;33628:326:0;;;;;:::i;:::-;;:::i;50824:754::-;;;;;;:::i;:::-;;:::i;33271:295::-;;;;;;;;;;-1:-1:-1;33271:295:0;;;;;:::i;:::-;;:::i;:::-;;;28152:25:1;;;28140:2;28125:18;33271:295:0;28006:177:1;13164:103:0;;;;;;;;;;;;;:::i;46603:51::-;;;;;;;;;;-1:-1:-1;46603:51:0;;;;;:::i;:::-;;:::i;12513:87::-;;;;;;;;;;-1:-1:-1;12559:7:0;12586:6;-1:-1:-1;;;;;12586:6:0;12513:87;;46494:102;;;;;;;;;;-1:-1:-1;46494:102:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28362:25:1;;;28418:2;28403:18;;28396:34;;;;28335:18;46494:102:0;28188:248:1;53938:128:0;;;;;;;;;;-1:-1:-1;53938:128:0;;;;;:::i;:::-;;:::i;34190:104::-;;;;;;;;;;;;;:::i;36111:187::-;;;;;;;;;;-1:-1:-1;36111:187:0;;;;;:::i;:::-;;:::i;50262:21::-;;;;;;;;;;-1:-1:-1;50262:21:0;;;;-1:-1:-1;;;;;50262:21:0;;;37353:365;;;;;;;;;;-1:-1:-1;37353:365:0;;;;;:::i;:::-;;:::i;34365:485::-;;;;;;;;;;-1:-1:-1;34365:485:0;;;;;:::i;:::-;;:::i;51717:1709::-;;;;;;:::i;:::-;;:::i;49005:916::-;;;;;;:::i;:::-;;:::i;36369:214::-;;;;;;;;;;-1:-1:-1;36369:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;36540:25:0;;;36511:4;36540:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;36369:214;49929:181;;;;;;;;;;-1:-1:-1;49929:181:0;;;;;:::i;:::-;;:::i;13422:238::-;;;;;;;;;;-1:-1:-1;13422:238:0;;;;;:::i;:::-;;:::i;46804:1098::-;47009:8;;-1:-1:-1;;;;;47009:8:0;46987:10;:31;46979:40;;;;;;47144:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;47122:11;:18;:61;:168;;;;-1:-1:-1;47257:32:0;;;;;;;:19;:32;;;;;;;47247:43;;;;47257:32;47247:43;:::i;:::-;;;;;;;;47214:11;47204:22;;;;;;:86;47122:168;47100:270;;;;-1:-1:-1;;;47100:270:0;;20266:2:1;47100:270:0;;;20248:21:1;20305:2;20285:18;;;20278:30;20344:34;20324:18;;;20317:62;-1:-1:-1;;;20395:18:1;;;20388:50;20455:19;;47100:270:0;;;;;;;;;47498:60;;-1:-1:-1;;;47498:60:0;;:4;;:16;;:60;;47515:11;;47528;;47541:6;;47549:8;;47498:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47494:401;;47705:101;;;;;;;;47738:8;:15;47705:101;;;;47782:8;47772:19;;;;;;47705:101;;;47654:14;:27;47669:11;47654:27;;;;;;;;;;;;;;;47682:11;47654:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47654:48:0;;;;;;;;;;;;;:152;;;;;;;;;;;;;;;47826:57;;;;47840:11;;47853;;47695:6;;47874:8;;47826:57;:::i;:::-;;;;;;;;47494:401;46804:1098;;;;:::o;32852:355::-;32999:4;-1:-1:-1;;;;;;33041:40:0;;-1:-1:-1;;;33041:40:0;;:105;;-1:-1:-1;;;;;;;33098:48:0;;-1:-1:-1;;;33098:48:0;33041:105;:158;;;-1:-1:-1;;;;;;;;;;25598:40:0;;;33163:36;33021:178;32852:355;-1:-1:-1;;32852:355:0:o;54697:79::-;12559:7;12586:6;-1:-1:-1;;;;;12586:6:0;11296:10;12733:23;12725:68;;;;-1:-1:-1;;;12725:68:0;;;;;;;:::i;:::-;54753:6:::1;:15:::0;;-1:-1:-1;;54753:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54697:79::o;34021:100::-;34075:13;34108:5;34101:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34021:100;:::o;35731:308::-;35852:7;39354:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39354:16:0;35877:110;;;;-1:-1:-1;;;35877:110:0;;19492:2:1;35877:110:0;;;19474:21:1;19531:2;19511:18;;;19504:30;19570:34;19550:18;;;19543:62;-1:-1:-1;;;19621:18:1;;;19614:42;19673:19;;35877:110:0;19290:408:1;35877:110:0;-1:-1:-1;36007:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;36007:24:0;;35731:308::o;35254:411::-;35335:13;35351:23;35366:7;35351:14;:23::i;:::-;35335:39;;35399:5;-1:-1:-1;;;;;35393:11:0;:2;-1:-1:-1;;;;;35393:11:0;;;35385:57;;;;-1:-1:-1;;;35385:57:0;;21921:2:1;35385:57:0;;;21903:21:1;21960:2;21940:18;;;21933:30;21999:34;21979:18;;;21972:62;-1:-1:-1;;;22050:18:1;;;22043:31;22091:19;;35385:57:0;21719:397:1;35385:57:0;11296:10;-1:-1:-1;;;;;35477:21:0;;;;:62;;-1:-1:-1;35502:37:0;35519:5;11296:10;36369:214;:::i;35502:37::-;35455:168;;;;-1:-1:-1;;;35455:168:0;;17473:2:1;35455:168:0;;;17455:21:1;17512:2;17492:18;;;17485:30;17551:34;17531:18;;;17524:62;17622:26;17602:18;;;17595:54;17666:19;;35455:168:0;17271:420:1;35455:168:0;35636:21;35645:2;35649:7;35636:8;:21::i;:::-;35324:341;35254:411;;:::o;47910:435::-;48136:10;48158:4;48136:27;48114:120;;;;-1:-1:-1;;;48114:120:0;;18719:2:1;48114:120:0;;;18701:21:1;18758:2;18738:18;;;18731:30;18797:34;18777:18;;;18770:62;-1:-1:-1;;;18848:18:1;;;18841:41;18899:19;;48114:120:0;18517:407:1;48114:120:0;48283:54;48294:11;48307;48320:6;48328:8;48283:10;:54::i;36650:376::-;36859:41;11296:10;36892:7;36859:18;:41::i;:::-;36837:140;;;;-1:-1:-1;;;36837:140:0;;;;;;;:::i;:::-;36990:28;37000:4;37006:2;37010:7;36990:9;:28::i;53666:188::-;12559:7;12586:6;-1:-1:-1;;;;;12586:6:0;11296:10;12733:23;12725:68;;;;-1:-1:-1;;;12725:68:0;;;;;;;:::i;:::-;53751:6:::1;::::0;53743:36:::1;::::0;53728:9:::1;::::0;-1:-1:-1;;;;;53751:6:0::1;::::0;53771:3;;53728:9;53743:36;53728:9;53743:36;53771:3;53751:6;53743:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53727:52;;;53798:4;53790:56;;;::::0;-1:-1:-1;;;53790:56:0;;20687:2:1;53790:56:0::1;::::0;::::1;20669:21:1::0;20726:2;20706:18;;;20699:30;20765:34;20745:18;;;20738:62;-1:-1:-1;;;20816:18:1;;;20809:37;20863:19;;53790:56:0::1;20485:403:1::0;53790:56:0::1;53716:138;53666:188:::0;:::o;37097:185::-;37235:39;37252:4;37258:2;37262:7;37235:39;;;;;;;;;;;;:16;:39::i;53434:90::-;12559:7;12586:6;-1:-1:-1;;;;;12586:6:0;11296:10;12733:23;12725:68;;;;-1:-1:-1;;;12725:68:0;;;;;;;:::i;:::-;53503:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;33628:326::-:0;33745:7;33786:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33786:16:0;33835:19;33813:110;;;;-1:-1:-1;;;33813:110:0;;18309:2:1;33813:110:0;;;18291:21:1;18348:2;18328:18;;;18321:30;18387:34;18367:18;;;18360:62;-1:-1:-1;;;18438:18:1;;;18431:39;18487:19;;33813:110:0;18107:405:1;50824:754:0;50892:6;;;;50891:7;50883:47;;;;-1:-1:-1;;;50883:47:0;;22741:2:1;50883:47:0;;;22723:21:1;22780:2;22760:18;;;22753:30;22819:29;22799:18;;;22792:57;22866:18;;50883:47:0;22539:351:1;50883:47:0;50973:1;50949:21;50959:10;50949:9;:21::i;:::-;:25;50941:70;;;;-1:-1:-1;;;50941:70:0;;24417:2:1;50941:70:0;;;24399:21:1;;;24436:18;;;24429:30;24495:34;24475:18;;;24468:62;24547:18;;50941:70:0;24215:356:1;50941:70:0;51042:1;51030:9;:13;;;51022:73;;;;-1:-1:-1;;;51022:73:0;;24001:2:1;51022:73:0;;;23983:21:1;24040:2;24020:18;;;24013:30;24079:34;24059:18;;;24052:62;-1:-1:-1;;;24130:18:1;;;24123:45;24185:19;;51022:73:0;23799:411:1;51022:73:0;51155:15;;51142:9;51128:23;;:11;;:23;;;;:::i;:::-;:42;;51106:132;;;;-1:-1:-1;;;51106:132:0;;13893:2:1;51106:132:0;;;13875:21:1;13932:2;13912:18;;;13905:30;13971:34;13951:18;;;13944:62;-1:-1:-1;;;14022:18:1;;;14015:38;14070:19;;51106:132:0;13691:404:1;51106:132:0;51249:36;51259:10;51273:11;;51271:13;;;;;:::i;:::-;;;;;-1:-1:-1;51249:9:0;:36::i;:::-;51300:9;:14;;51313:1;51300:14;51296:83;;;51331:36;51341:10;51355:11;;51353:13;;;;;:::i;51331:36::-;50824:754;:::o;33271:295::-;33388:7;-1:-1:-1;;;;;33435:19:0;;33413:111;;;;-1:-1:-1;;;33413:111:0;;17898:2:1;33413:111:0;;;17880:21:1;17937:2;17917:18;;;17910:30;17976:34;17956:18;;;17949:62;-1:-1:-1;;;18027:18:1;;;18020:40;18077:19;;33413:111:0;17696:406:1;33413:111:0;-1:-1:-1;;;;;;33542:16:0;;;;;:9;:16;;;;;;;33271:295::o;13164:103::-;12559:7;12586:6;-1:-1:-1;;;;;12586:6:0;11296:10;12733:23;12725:68;;;;-1:-1:-1;;;12725:68:0;;;;;;;:::i;:::-;13229:30:::1;13256:1;13229:18;:30::i;:::-;13164:103::o:0;46603:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53938:128::-;12559:7;12586:6;-1:-1:-1;;;;;12586:6:0;11296:10;12733:23;12725:68;;;;-1:-1:-1;;;12725:68:0;;;;;;;:::i;:::-;54023:26:::1;:35:::0;53938:128::o;34190:104::-;34246:13;34279:7;34272:14;;;;;:::i;36111:187::-;36238:52;11296:10;36271:8;36281;36238:18;:52::i;37353:365::-;37542:41;11296:10;37575:7;37542:18;:41::i;:::-;37520:140;;;;-1:-1:-1;;;37520:140:0;;;;;;;:::i;:::-;37671:39;37685:4;37691:2;37695:7;37704:5;37671:13;:39::i;34365:485::-;39330:4;39354:16;;;:7;:16;;;;;;34483:13;;-1:-1:-1;;;;;39354:16:0;34514:113;;;;-1:-1:-1;;;34514:113:0;;21505:2:1;34514:113:0;;;21487:21:1;21544:2;21524:18;;;21517:30;21583:34;21563:18;;;21556:62;-1:-1:-1;;;21634:18:1;;;21627:45;21689:19;;34514:113:0;21303:411:1;34514:113:0;34648:21;34672:10;:8;:10::i;:::-;34648:34;;34737:1;34719:7;34713:21;:25;:129;;;;;;;;;;;;;;;;;34782:7;34791:18;:7;:16;:18::i;:::-;34765:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34713:129;34693:149;34365:485;-1:-1:-1;;;34365:485:0:o;51717:1709::-;51837:16;51845:7;51837;:16::i;:::-;-1:-1:-1;;;;;51823:30:0;:10;-1:-1:-1;;;;;51823:30:0;;51801:114;;;;-1:-1:-1;;;51801:114:0;;16657:2:1;51801:114:0;;;16639:21:1;16696:2;16676:18;;;16669:30;16735:34;16715:18;;;16708:62;-1:-1:-1;;;16786:18:1;;;16779:32;16828:19;;51801:114:0;16455:398:1;51801:114:0;51948:29;;;51987:1;51948:29;;;:19;:29;;;;;:36;;;;;:::i;:::-;;;:40;51926:136;;;;-1:-1:-1;;;51926:136:0;;15887:2:1;51926:136:0;;;15869:21:1;15926:2;15906:18;;;15899:30;15965:34;15945:18;;;15938:62;-1:-1:-1;;;16016:18:1;;;16009:44;16070:19;;51926:136:0;15685:410:1;51926:136:0;52142:14;52148:7;52142:5;:14::i;:::-;52253:31;;;52264:10;52253:31;;;12948:51:1;13015:18;;;13008:34;;;52253:31:0;;;;;;;;;12921:18:1;;;52253:31:0;;52481:26;;-1:-1:-1;;;52428:90:0;;;11947:51:1;12014:11;;;;12007:27;;;;52428:90:0;;;;;;;;;;12050:12:1;;;52428:90:0;;;;52697:8;;-1:-1:-1;;;52697:153:0;;;52253:31;;52387:1;;-1:-1:-1;;;;;;;52697:8:0;;:21;;:153;;52733:8;;52764:4;;52253:31;;-1:-1:-1;;52428:90:0;;52697:153;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52672:178;;;52898:10;52885:9;:23;;52863:161;;;;-1:-1:-1;;;52863:161:0;;23504:2:1;52863:161:0;;;23486:21:1;23543:2;23523:18;;;23516:30;23582:34;23562:18;;;23555:62;23653:34;23633:18;;;23626:62;23725:26;23704:19;;;23697:55;23769:19;;52863:161:0;23302:492:1;52863:161:0;53037:8;;53129:29;;;53037:8;53129:29;;;:19;:29;;;;;;53037:381;;-1:-1:-1;;;53037:381:0;;-1:-1:-1;;;;;53037:8:0;;;;:13;;53058:9;;53037:381;;53083:8;;53212:7;;53268:10;;53037:8;53378:13;;53037:381;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51790:1636;;;;51717:1709;;:::o;49005:916::-;49264:27;;;49229:32;49264:27;;;:14;:27;;;;;;:64;;;;49306:11;;49264:64;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49264:72:0;;;;;;;;;;49369:21;;;;49264:72;;-1:-1:-1;49347:123:0;;;;-1:-1:-1;;;49347:123:0;;23097:2:1;49347:123:0;;;23079:21:1;23136:2;23116:18;;;23109:30;23175:34;23155:18;;;23148:62;-1:-1:-1;;;23226:18:1;;;23219:36;23272:19;;49347:123:0;22895:402:1;49347:123:0;49522:23;;49503:42;;:107;;;;;49589:9;:21;;;49576:8;;49566:19;;;;;;;:::i;:::-;;;;;;;;:44;49503:107;49481:183;;;;-1:-1:-1;;;49481:183:0;;16302:2:1;49481:183:0;;;16284:21:1;16341:2;16321:18;;;16314:30;16380:28;16360:18;;;16353:56;16426:18;;49481:183:0;16100:350:1;49481:183:0;49738:1;49712:27;;;49750:21;;;:34;49853:60;;-1:-1:-1;;;49853:60:0;;:4;;:16;;:60;;49870:11;;49883;;49896:6;;49904:8;;;;49853:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49173:748;49005:916;;;;;:::o;49929:181::-;12559:7;12586:6;-1:-1:-1;;;;;12586:6:0;11296:10;12733:23;12725:68;;;;-1:-1:-1;;;12725:68:0;;;;;;;:::i;:::-;50056:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;50088:14;;50056:46:::1;:::i;13422:238::-:0;12559:7;12586:6;-1:-1:-1;;;;;12586:6:0;11296:10;12733:23;12725:68;;;;-1:-1:-1;;;12725:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13525:22:0;::::1;13503:110;;;::::0;-1:-1:-1;;;13503:110:0;;14721:2:1;13503:110:0::1;::::0;::::1;14703:21:1::0;14760:2;14740:18;;;14733:30;14799:34;14779:18;;;14772:62;-1:-1:-1;;;14850:18:1;;;14843:36;14896:19;;13503:110:0::1;14519:402:1::0;13503:110:0::1;13624:28;13643:8;13624:18;:28::i;43319:174::-:0;43394:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;43394:29:0;-1:-1:-1;;;;;43394:29:0;;;;;;;;:24;;43448:23;43394:24;43448:14;:23::i;:::-;-1:-1:-1;;;;;43439:46:0;;;;;;;;;;;43319:174;;:::o;54157:424::-;54353:14;54369:15;54413:8;54388:77;;;;;;;;;;;;:::i;:::-;54352:113;;;;54547:26;54557:6;54565:7;54547:9;:26::i;:::-;54322:259;;54157:424;;;;:::o;39559:452::-;39688:4;39354:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39354:16:0;39710:110;;;;-1:-1:-1;;;39710:110:0;;17060:2:1;39710:110:0;;;17042:21:1;17099:2;17079:18;;;17072:30;17138:34;17118:18;;;17111:62;-1:-1:-1;;;17189:18:1;;;17182:42;17241:19;;39710:110:0;16858:408:1;39710:110:0;39831:13;39847:23;39862:7;39847:14;:23::i;:::-;39831:39;;39900:5;-1:-1:-1;;;;;39889:16:0;:7;-1:-1:-1;;;;;39889:16:0;;:64;;;;39946:7;-1:-1:-1;;;;;39922:31:0;:20;39934:7;39922:11;:20::i;:::-;-1:-1:-1;;;;;39922:31:0;;39889:64;:113;;;-1:-1:-1;;;;;;36540:25:0;;;36511:4;36540:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;39970:32;39881:122;39559:452;-1:-1:-1;;;;39559:452:0:o;42586:615::-;42759:4;-1:-1:-1;;;;;42732:31:0;:23;42747:7;42732:14;:23::i;:::-;-1:-1:-1;;;;;42732:31:0;;42710:122;;;;-1:-1:-1;;;42710:122:0;;21095:2:1;42710:122:0;;;21077:21:1;21134:2;21114:18;;;21107:30;21173:34;21153:18;;;21146:62;-1:-1:-1;;;21224:18:1;;;21217:39;21273:19;;42710:122:0;20893:405:1;42710:122:0;-1:-1:-1;;;;;42851:16:0;;42843:65;;;;-1:-1:-1;;;42843:65:0;;15128:2:1;42843:65:0;;;15110:21:1;15167:2;15147:18;;;15140:30;15206:34;15186:18;;;15179:62;-1:-1:-1;;;15257:18:1;;;15250:34;15301:19;;42843:65:0;14926:400:1;42843:65:0;43025:29;43042:1;43046:7;43025:8;:29::i;:::-;-1:-1:-1;;;;;43067:15:0;;;;;;:9;:15;;;;;:20;;43086:1;;43067:15;:20;;43086:1;;43067:20;:::i;:::-;;;;-1:-1:-1;;;;;;;43098:13:0;;;;;;:9;:13;;;;;:18;;43115:1;;43098:13;:18;;43115:1;;43098:18;:::i;:::-;;;;-1:-1:-1;;43127:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;43127:21:0;-1:-1:-1;;;;;43127:21:0;;;;;;;;;43166:27;;43127:16;;43166:27;;;;;;;42586:615;;;:::o;40353:110::-;40429:26;40439:2;40443:7;40429:26;;;;;;;;;;;;:9;:26::i;13820:191::-;13894:16;13913:6;;-1:-1:-1;;;;;13930:17:0;;;-1:-1:-1;;;;;;13930:17:0;;;;;;13963:40;;13913:6;;;;;;;13963:40;;13894:16;13963:40;13883:128;13820:191;:::o;43635:315::-;43790:8;-1:-1:-1;;;;;43781:17:0;:5;-1:-1:-1;;;;;43781:17:0;;;43773:55;;;;-1:-1:-1;;;43773:55:0;;15533:2:1;43773:55:0;;;15515:21:1;15572:2;15552:18;;;15545:30;15611:27;15591:18;;;15584:55;15656:18;;43773:55:0;15331:349:1;43773:55:0;-1:-1:-1;;;;;43839:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;43839:46:0;;;;;;;;;;43901:41;;13193::1;;;43901::0;;13166:18:1;43901:41:0;;;;;;;43635:315;;;:::o;38600:352::-;38757:28;38767:4;38773:2;38777:7;38757:9;:28::i;:::-;38818:48;38841:4;38847:2;38851:7;38860:5;38818:22;:48::i;:::-;38796:148;;;;-1:-1:-1;;;38796:148:0;;;;;;;:::i;54589:100::-;54641:13;54674:7;54667:14;;;;;:::i;8748:723::-;8804:13;9025:10;9021:53;;-1:-1:-1;;9052:10:0;;;;;;;;;;;;-1:-1:-1;;;9052:10:0;;;;;8748:723::o;9021:53::-;9099:5;9084:12;9140:78;9147:9;;9140:78;;9173:8;;;;:::i;:::-;;-1:-1:-1;9196:10:0;;-1:-1:-1;9204:2:0;9196:10;;:::i;:::-;;;9140:78;;;9228:19;9260:6;-1:-1:-1;;;;;9250:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9250:17:0;;9228:39;;9278:154;9285:10;;9278:154;;9312:11;9322:1;9312:11;;:::i;:::-;;-1:-1:-1;9381:10:0;9389:2;9381:5;:10;:::i;:::-;9368:24;;:2;:24;:::i;:::-;9355:39;;9338:6;9345;9338:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;9338:56:0;;;;;;;;-1:-1:-1;9409:11:0;9418:2;9409:11;;:::i;:::-;;;9278:154;;41889:360;41949:13;41965:23;41980:7;41965:14;:23::i;:::-;41949:39;;42090:29;42107:1;42111:7;42090:8;:29::i;:::-;-1:-1:-1;;;;;42132:16:0;;;;;;:9;:16;;;;;:21;;42152:1;;42132:16;:21;;42152:1;;42132:21;:::i;:::-;;;;-1:-1:-1;;42171:16:0;;;;:7;:16;;;;;;42164:23;;-1:-1:-1;;;;;;42164:23:0;;;42205:36;42179:7;;42171:16;-1:-1:-1;;;;;42205:36:0;;;;;42171:16;;42205:36;41938:311;41889:360;:::o;40690:321::-;40820:18;40826:2;40830:7;40820:5;:18::i;:::-;40871:54;40902:1;40906:2;40910:7;40919:5;40871:22;:54::i;:::-;40849:154;;;;-1:-1:-1;;;40849:154:0;;;;;;;:::i;44515:980::-;44670:4;-1:-1:-1;;;;;44691:13:0;;15159:20;15207:8;44687:801;;44744:175;;-1:-1:-1;;;44744:175:0;;-1:-1:-1;;;;;44744:36:0;;;;;:175;;11296:10;;44838:4;;44865:7;;44895:5;;44744:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44744:175:0;;;;;;;;-1:-1:-1;;44744:175:0;;;;;;;;;;;;:::i;:::-;;;44723:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45102:13:0;;45098:320;;45145:108;;-1:-1:-1;;;45145:108:0;;;;;;;:::i;45098:320::-;45368:6;45362:13;45353:6;45349:2;45345:15;45338:38;44723:710;-1:-1:-1;;;;;;44983:51:0;-1:-1:-1;;;44983:51:0;;-1:-1:-1;44976:58:0;;44687:801;-1:-1:-1;45472:4:0;44515:980;;;;;;:::o;41347:313::-;-1:-1:-1;;;;;41427:16:0;;41419:61;;;;-1:-1:-1;;;41419:61:0;;19131:2:1;41419:61:0;;;19113:21:1;;;19150:18;;;19143:30;19209:34;19189:18;;;19182:62;19261:18;;41419:61:0;18929:356:1;41419:61:0;-1:-1:-1;;;;;41551:13:0;;;;;;:9;:13;;;;;:18;;41568:1;;41551:13;:18;;41568:1;;41551:18;:::i;:::-;;;;-1:-1:-1;;41580:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41580:21:0;-1:-1:-1;;;;;41580:21:0;;;;;;;;41619:33;;41580:16;;;41619:33;;41580:16;;41619:33;41347:313;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:160::-;715:20;;771:13;;764:21;754:32;;744:60;;800:1;797;790:12;744:60;650:160;;;:::o;815:347::-;866:8;876:6;930:3;923:4;915:6;911:17;907:27;897:55;;948:1;945;938:12;897:55;-1:-1:-1;971:20:1;;-1:-1:-1;;;;;1003:30:1;;1000:50;;;1046:1;1043;1036:12;1000:50;1083:4;1075:6;1071:17;1059:29;;1135:3;1128:4;1119:6;1111;1107:19;1103:30;1100:39;1097:59;;;1152:1;1149;1142:12;1097:59;815:347;;;;;:::o;1167:220::-;1209:5;1262:3;1255:4;1247:6;1243:17;1239:27;1229:55;;1280:1;1277;1270:12;1229:55;1302:79;1377:3;1368:6;1355:20;1348:4;1340:6;1336:17;1302:79;:::i;1392:159::-;1459:20;;1519:6;1508:18;;1498:29;;1488:57;;1541:1;1538;1531:12;1556:171;1623:20;;-1:-1:-1;;;;;1672:30:1;;1662:41;;1652:69;;1717:1;1714;1707:12;1732:247;1791:6;1844:2;1832:9;1823:7;1819:23;1815:32;1812:52;;;1860:1;1857;1850:12;1812:52;1899:9;1886:23;1918:31;1943:5;1918:31;:::i;1984:320::-;2071:6;2079;2132:2;2120:9;2111:7;2107:23;2103:32;2100:52;;;2148:1;2145;2138:12;2100:52;2180:9;2174:16;2199:31;2224:5;2199:31;:::i;:::-;2294:2;2279:18;;;;2273:25;2249:5;;2273:25;;-1:-1:-1;;;1984:320:1:o;2309:388::-;2377:6;2385;2438:2;2426:9;2417:7;2413:23;2409:32;2406:52;;;2454:1;2451;2444:12;2406:52;2493:9;2480:23;2512:31;2537:5;2512:31;:::i;:::-;2562:5;-1:-1:-1;2619:2:1;2604:18;;2591:32;2632:33;2591:32;2632:33;:::i;:::-;2684:7;2674:17;;;2309:388;;;;;:::o;2702:456::-;2779:6;2787;2795;2848:2;2836:9;2827:7;2823:23;2819:32;2816:52;;;2864:1;2861;2854:12;2816:52;2903:9;2890:23;2922:31;2947:5;2922:31;:::i;:::-;2972:5;-1:-1:-1;3029:2:1;3014:18;;3001:32;3042:33;3001:32;3042:33;:::i;:::-;2702:456;;3094:7;;-1:-1:-1;;;3148:2:1;3133:18;;;;3120:32;;2702:456::o;3163:665::-;3258:6;3266;3274;3282;3335:3;3323:9;3314:7;3310:23;3306:33;3303:53;;;3352:1;3349;3342:12;3303:53;3391:9;3378:23;3410:31;3435:5;3410:31;:::i;:::-;3460:5;-1:-1:-1;3517:2:1;3502:18;;3489:32;3530:33;3489:32;3530:33;:::i;:::-;3582:7;-1:-1:-1;3636:2:1;3621:18;;3608:32;;-1:-1:-1;3691:2:1;3676:18;;3663:32;-1:-1:-1;;;;;3707:30:1;;3704:50;;;3750:1;3747;3740:12;3704:50;3773:49;3814:7;3805:6;3794:9;3790:22;3773:49;:::i;:::-;3763:59;;;3163:665;;;;;;;:::o;3833:315::-;3898:6;3906;3959:2;3947:9;3938:7;3934:23;3930:32;3927:52;;;3975:1;3972;3965:12;3927:52;4014:9;4001:23;4033:31;4058:5;4033:31;:::i;:::-;4083:5;-1:-1:-1;4107:35:1;4138:2;4123:18;;4107:35;:::i;:::-;4097:45;;3833:315;;;;;:::o;4153:::-;4221:6;4229;4282:2;4270:9;4261:7;4257:23;4253:32;4250:52;;;4298:1;4295;4288:12;4250:52;4337:9;4324:23;4356:31;4381:5;4356:31;:::i;:::-;4406:5;4458:2;4443:18;;;;4430:32;;-1:-1:-1;;;4153:315:1:o;4473:180::-;4529:6;4582:2;4570:9;4561:7;4557:23;4553:32;4550:52;;;4598:1;4595;4588:12;4550:52;4621:26;4637:9;4621:26;:::i;4658:245::-;4716:6;4769:2;4757:9;4748:7;4744:23;4740:32;4737:52;;;4785:1;4782;4775:12;4737:52;4824:9;4811:23;4843:30;4867:5;4843:30;:::i;4908:249::-;4977:6;5030:2;5018:9;5009:7;5005:23;5001:32;4998:52;;;5046:1;5043;5036:12;4998:52;5078:9;5072:16;5097:30;5121:5;5097:30;:::i;5162:450::-;5231:6;5284:2;5272:9;5263:7;5259:23;5255:32;5252:52;;;5300:1;5297;5290:12;5252:52;5340:9;5327:23;-1:-1:-1;;;;;5365:6:1;5362:30;5359:50;;;5405:1;5402;5395:12;5359:50;5428:22;;5481:4;5473:13;;5469:27;-1:-1:-1;5459:55:1;;5510:1;5507;5500:12;5459:55;5533:73;5598:7;5593:2;5580:16;5575:2;5571;5567:11;5533:73;:::i;5617:184::-;5675:6;5728:2;5716:9;5707:7;5703:23;5699:32;5696:52;;;5744:1;5741;5734:12;5696:52;5767:28;5785:9;5767:28;:::i;5806:481::-;5884:6;5892;5900;5953:2;5941:9;5932:7;5928:23;5924:32;5921:52;;;5969:1;5966;5959:12;5921:52;5992:28;6010:9;5992:28;:::i;:::-;5982:38;;6071:2;6060:9;6056:18;6043:32;-1:-1:-1;;;;;6090:6:1;6087:30;6084:50;;;6130:1;6127;6120:12;6084:50;6169:58;6219:7;6210:6;6199:9;6195:22;6169:58;:::i;:::-;5806:481;;6246:8;;-1:-1:-1;6143:84:1;;-1:-1:-1;;;;5806:481:1:o;6292:460::-;6377:6;6385;6393;6446:2;6434:9;6425:7;6421:23;6417:32;6414:52;;;6462:1;6459;6452:12;6414:52;6485:28;6503:9;6485:28;:::i;:::-;6475:38;;6564:2;6553:9;6549:18;6536:32;-1:-1:-1;;;;;6583:6:1;6580:30;6577:50;;;6623:1;6620;6613:12;6577:50;6646:49;6687:7;6678:6;6667:9;6663:22;6646:49;:::i;:::-;6636:59;;;6742:2;6731:9;6727:18;6714:32;6704:42;;6292:460;;;;;:::o;6757:773::-;6861:6;6869;6877;6885;6893;6946:3;6934:9;6925:7;6921:23;6917:33;6914:53;;;6963:1;6960;6953:12;6914:53;6986:28;7004:9;6986:28;:::i;:::-;6976:38;;7065:2;7054:9;7050:18;7037:32;-1:-1:-1;;;;;7129:2:1;7121:6;7118:14;7115:34;;;7145:1;7142;7135:12;7115:34;7168:49;7209:7;7200:6;7189:9;7185:22;7168:49;:::i;:::-;7158:59;;7236:37;7269:2;7258:9;7254:18;7236:37;:::i;:::-;7226:47;;7326:2;7315:9;7311:18;7298:32;7282:48;;7355:2;7345:8;7342:16;7339:36;;;7371:1;7368;7361:12;7339:36;;7410:60;7462:7;7451:8;7440:9;7436:24;7410:60;:::i;:::-;6757:773;;;;-1:-1:-1;6757:773:1;;-1:-1:-1;7489:8:1;;7384:86;6757:773;-1:-1:-1;;;6757:773:1:o;7535:684::-;7637:6;7645;7653;7661;7714:3;7702:9;7693:7;7689:23;7685:33;7682:53;;;7731:1;7728;7721:12;7682:53;7754:28;7772:9;7754:28;:::i;:::-;7744:38;;7833:2;7822:9;7818:18;7805:32;-1:-1:-1;;;;;7897:2:1;7889:6;7886:14;7883:34;;;7913:1;7910;7903:12;7883:34;7936:49;7977:7;7968:6;7957:9;7953:22;7936:49;:::i;:::-;7926:59;;8004:37;8037:2;8026:9;8022:18;8004:37;:::i;:::-;7994:47;;8094:2;8083:9;8079:18;8066:32;8050:48;;8123:2;8113:8;8110:16;8107:36;;;8139:1;8136;8129:12;8107:36;;8162:51;8205:7;8194:8;8183:9;8179:24;8162:51;:::i;8224:252::-;8291:6;8299;8352:2;8340:9;8331:7;8327:23;8323:32;8320:52;;;8368:1;8365;8358:12;8320:52;8391:28;8409:9;8391:28;:::i;8481:180::-;8540:6;8593:2;8581:9;8572:7;8568:23;8564:32;8561:52;;;8609:1;8606;8599:12;8561:52;-1:-1:-1;8632:23:1;;8481:180;-1:-1:-1;8481:180:1:o;8666:245::-;8745:6;8753;8806:2;8794:9;8785:7;8781:23;8777:32;8774:52;;;8822:1;8819;8812:12;8774:52;-1:-1:-1;;8845:16:1;;8901:2;8886:18;;;8880:25;8845:16;;8880:25;;-1:-1:-1;8666:245:1:o;8916:269::-;8973:6;9026:2;9014:9;9005:7;9001:23;8997:32;8994:52;;;9042:1;9039;9032:12;8994:52;9081:9;9068:23;9131:4;9124:5;9120:16;9113:5;9110:27;9100:55;;9151:1;9148;9141:12;9307:257;9348:3;9386:5;9380:12;9413:6;9408:3;9401:19;9429:63;9485:6;9478:4;9473:3;9469:14;9462:4;9455:5;9451:16;9429:63;:::i;:::-;9546:2;9525:15;-1:-1:-1;;9521:29:1;9512:39;;;;9553:4;9508:50;;9307:257;-1:-1:-1;;9307:257:1:o;9569:271::-;9752:6;9744;9739:3;9726:33;9708:3;9778:16;;9803:13;;;9778:16;9569:271;-1:-1:-1;9569:271:1:o;9845:274::-;9974:3;10012:6;10006:13;10028:53;10074:6;10069:3;10062:4;10054:6;10050:17;10028:53;:::i;:::-;10097:16;;;;;9845:274;-1:-1:-1;;9845:274:1:o;10124:811::-;10250:3;10279:1;10312:6;10306:13;10342:36;10368:9;10342:36;:::i;:::-;10397:1;10414:18;;;10441:104;;;;10559:1;10554:356;;;;10407:503;;10441:104;-1:-1:-1;;10474:24:1;;10462:37;;10519:16;;;;-1:-1:-1;10441:104:1;;10554:356;10585:6;10582:1;10575:17;10615:4;10660:2;10657:1;10647:16;10685:1;10699:165;10713:6;10710:1;10707:13;10699:165;;;10791:14;;10778:11;;;10771:35;10834:16;;;;10728:10;;10699:165;;;10703:3;;;10893:6;10888:3;10884:16;10877:23;;10407:503;-1:-1:-1;10926:3:1;;10124:811;-1:-1:-1;;;;;;10124:811:1:o;10940:637::-;11220:3;11258:6;11252:13;11274:53;11320:6;11315:3;11308:4;11300:6;11296:17;11274:53;:::i;:::-;11390:13;;11349:16;;;;11412:57;11390:13;11349:16;11446:4;11434:17;;11412:57;:::i;:::-;-1:-1:-1;;;11491:20:1;;11520:22;;;11569:1;11558:13;;10940:637;-1:-1:-1;;;;10940:637:1:o;12281:488::-;-1:-1:-1;;;;;12550:15:1;;;12532:34;;12602:15;;12597:2;12582:18;;12575:43;12649:2;12634:18;;12627:34;;;12697:3;12692:2;12677:18;;12670:31;;;12475:4;;12718:45;;12743:19;;12735:6;12718:45;:::i;:::-;12710:53;12281:488;-1:-1:-1;;;;;;12281:488:1:o;13245:217::-;13392:2;13381:9;13374:21;13355:4;13412:44;13452:2;13441:9;13437:18;13429:6;13412:44;:::i;14100:414::-;14302:2;14284:21;;;14341:2;14321:18;;;14314:30;14380:34;14375:2;14360:18;;14353:62;-1:-1:-1;;;14446:2:1;14431:18;;14424:48;14504:3;14489:19;;14100:414::o;19703:356::-;19905:2;19887:21;;;19924:18;;;19917:30;19983:34;19978:2;19963:18;;19956:62;20050:2;20035:18;;19703:356::o;22121:413::-;22323:2;22305:21;;;22362:2;22342:18;;;22335:30;22401:34;22396:2;22381:18;;22374:62;-1:-1:-1;;;22467:2:1;22452:18;;22445:47;22524:3;22509:19;;22121:413::o;24576:640::-;24857:6;24845:19;;24827:38;;-1:-1:-1;;;;;24901:32:1;;24896:2;24881:18;;24874:60;24921:3;24965:2;24950:18;;24943:31;;;-1:-1:-1;;24997:45:1;;25022:19;;25014:6;24997:45;:::i;:::-;25092:6;25085:14;25078:22;25073:2;25062:9;25058:18;25051:50;25150:9;25142:6;25138:22;25132:3;25121:9;25117:19;25110:51;25178:32;25203:6;25195;25178:32;:::i;:::-;25170:40;24576:640;-1:-1:-1;;;;;;;;24576:640:1:o;25221:717::-;25488:6;25480;25476:19;25465:9;25458:38;25532:3;25527:2;25516:9;25512:18;25505:31;25439:4;25559:45;25599:3;25588:9;25584:19;25576:6;25559:45;:::i;:::-;-1:-1:-1;;;;;25644:6:1;25640:31;25635:2;25624:9;25620:18;25613:59;25720:9;25712:6;25708:22;25703:2;25692:9;25688:18;25681:50;25755:6;25747;25740:22;25809:6;25801;25796:2;25788:6;25784:15;25771:45;25862:1;25857:2;25848:6;25840;25836:19;25832:28;25825:39;25929:2;25922;25918:7;25913:2;25905:6;25901:15;25897:29;25889:6;25885:42;25881:51;25873:59;;;25221:717;;;;;;;;:::o;25943:555::-;26200:6;26192;26188:19;26177:9;26170:38;26244:3;26239:2;26228:9;26224:18;26217:31;26151:4;26271:45;26311:3;26300:9;26296:19;26288:6;26271:45;:::i;:::-;-1:-1:-1;;;;;26356:6:1;26352:31;26347:2;26336:9;26332:18;26325:59;26432:9;26424:6;26420:22;26415:2;26404:9;26400:18;26393:50;26460:32;26485:6;26477;26460:32;:::i;:::-;26452:40;25943:555;-1:-1:-1;;;;;;;25943:555:1:o;26503:1498::-;26849:6;26841;26837:19;26826:9;26819:38;26800:4;26876:2;26914:3;26909:2;26898:9;26894:18;26887:31;26938:1;26971:6;26965:13;27001:36;27027:9;27001:36;:::i;:::-;27074:6;27068:3;27057:9;27053:19;27046:35;27100:3;27122:1;27154:2;27143:9;27139:18;27171:1;27166:122;;;;27302:1;27297:354;;;;27132:519;;27166:122;-1:-1:-1;;27214:24:1;;27194:18;;;27187:52;27274:3;27259:19;;;-1:-1:-1;27166:122:1;;27297:354;27328:6;27325:1;27318:17;27376:2;27373:1;27363:16;27401:1;27415:180;27429:6;27426:1;27423:13;27415:180;;;27522:14;;27498:17;;;27494:26;;27487:50;27565:16;;;;27444:10;;27415:180;;;27619:17;;27615:26;;;-1:-1:-1;;27132:519:1;;;;;;27696:9;27691:3;27687:19;27682:2;27671:9;27667:18;27660:47;27730:29;27755:3;27747:6;27730:29;:::i;:::-;27716:43;;;27768:54;27818:2;27807:9;27803:18;27795:6;-1:-1:-1;;;;;9264:31:1;9252:44;;9190:112;27768:54;-1:-1:-1;;;;;9264:31:1;;27881:3;27866:19;;9252:44;27935:9;27927:6;27923:22;27917:3;27906:9;27902:19;27895:51;27963:32;27988:6;27980;27963:32;:::i;:::-;27955:40;26503:1498;-1:-1:-1;;;;;;;;;26503:1498:1:o;28441:128::-;28481:3;28512:1;28508:6;28505:1;28502:13;28499:39;;;28518:18;;:::i;:::-;-1:-1:-1;28554:9:1;;28441:128::o;28574:120::-;28614:1;28640;28630:35;;28645:18;;:::i;:::-;-1:-1:-1;28679:9:1;;28574:120::o;28699:125::-;28739:4;28767:1;28764;28761:8;28758:34;;;28772:18;;:::i;:::-;-1:-1:-1;28809:9:1;;28699:125::o;28829:258::-;28901:1;28911:113;28925:6;28922:1;28919:13;28911:113;;;29001:11;;;28995:18;28982:11;;;28975:39;28947:2;28940:10;28911:113;;;29042:6;29039:1;29036:13;29033:48;;;-1:-1:-1;;29077:1:1;29059:16;;29052:27;28829:258::o;29092:380::-;29171:1;29167:12;;;;29214;;;29235:61;;29289:4;29281:6;29277:17;29267:27;;29235:61;29342:2;29334:6;29331:14;29311:18;29308:38;29305:161;;;29388:10;29383:3;29379:20;29376:1;29369:31;29423:4;29420:1;29413:15;29451:4;29448:1;29441:15;29305:161;;29092:380;;;:::o;29477:135::-;29516:3;-1:-1:-1;;29537:17:1;;29534:43;;;29557:18;;:::i;:::-;-1:-1:-1;29604:1:1;29593:13;;29477:135::o;29617:112::-;29649:1;29675;29665:35;;29680:18;;:::i;:::-;-1:-1:-1;29714:9:1;;29617:112::o;29734:127::-;29795:10;29790:3;29786:20;29783:1;29776:31;29826:4;29823:1;29816:15;29850:4;29847:1;29840:15;29866:127;29927:10;29922:3;29918:20;29915:1;29908:31;29958:4;29955:1;29948:15;29982:4;29979:1;29972:15;29998:127;30059:10;30054:3;30050:20;30047:1;30040:31;30090:4;30087:1;30080:15;30114:4;30111:1;30104:15;30130:127;30191:10;30186:3;30182:20;30179:1;30172:31;30222:4;30219:1;30212:15;30246:4;30243:1;30236:15;30262:131;-1:-1:-1;;;;;30337:31:1;;30327:42;;30317:70;;30383:1;30380;30373:12;30398:131;-1:-1:-1;;;;;;30472:32:1;;30462:43;;30452:71;;30519:1;30516;30509:12
Swarm Source
ipfs://8d7f77cee5d9a1d724001edcbf497c580d9e14425591f10c9a71f75838a7df6b
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.