Token Axolittles
Overview ERC-721
Total Supply:
0 AXOLITTLE
Holders:
1 addresses
Contract:
Balance
0 AXOLITTLE
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AxolittlesArb
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2022-06-10 */ // SPDX-License-Identifier: MIT // 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 contracts/LzBridge/interfaces/IONFT721Core.sol pragma solidity ^0.8.0; /** * @dev Interface of the ONFT Core standard */ interface IONFT721Core is IERC165 { /** * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`) * _dstChainId - L0 defined chain id to send tokens too * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain * _tokenIds - token Id array to transfer * _useZro - indicates to use zro to pay L0 fees * _adapterParams - flexible bytes array to indicate messaging adapter services in L0 */ function estimateSendFee(uint16 _dstChainId, bytes calldata _toAddress, uint16[] calldata _tokenIds, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee); /** * @dev send token `_tokenId` to (`_dstChainId`, `_toAddress`) from `msg.sender` * `_toAddress` can be any size depending on the `dstChainId`. * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token) * `_adapterParams` is a flexible bytes array to indicate messaging adapter services */ function sendFrom(uint16 _dstChainId, bytes calldata _toAddress, uint16[] calldata _tokenIds, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; /** * @dev Emitted when `_tokenId` are moved from the `_sender` to (`_dstChainId`, `_toAddress`) * `_nonce` is the outbound nonce from */ event SendToChain(address indexed _sender, uint16 indexed _dstChainId, bytes indexed _toAddress, uint16[] _tokenIds, uint64 _nonce); /** * @dev Emitted when `_tokenIds` are sent from `_srcChainId` to the `_toAddress` at this chain. `_nonce` is the inbound nonce. */ event ReceiveFromChain(uint16 indexed _srcChainId, bytes indexed _srcAddress, address indexed _toAddress, uint16[] _tokenIds, uint64 _nonce); } // File @openzeppelin/contracts/token/ERC721/[email protected] // 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 contracts/LzBridge/interfaces/IONFT721.sol pragma solidity ^0.8.0; /** * @dev Interface of the ONFT standard */ interface IONFT721 is IONFT721Core, IERC721 { } // File @openzeppelin/contracts/utils/[email protected] // 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/[email protected] // 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 contracts/LzBridge/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 contracts/LzBridge/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, uint _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/LzBridge/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, uint _gasLimit, bytes calldata _payload) external; // @notice get the inboundNonce of a lzApp 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 (uint nativeFee, uint 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, uint _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/LzBridge/lib/LzApp.sol pragma solidity ^0.8.0; /* * a generic LzReceiver implementation */ abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig { ILayerZeroEndpoint public immutable lzEndpoint; mapping(uint16 => bytes) public trustedRemoteLookup; event SetTrustedRemote(uint16 _srcChainId, bytes _srcAddress); constructor(address _endpoint) { lzEndpoint = ILayerZeroEndpoint(_endpoint); } function lzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public virtual override { // lzReceive must be called by the endpoint for security require(_msgSender() == address(lzEndpoint), "LzApp: invalid endpoint caller"); bytes memory trustedRemote = trustedRemoteLookup[_srcChainId]; // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote. require(_srcAddress.length == trustedRemote.length && keccak256(_srcAddress) == keccak256(trustedRemote), "LzApp: invalid source sending contract"); _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } // abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging function _blockingLzReceive(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 _adapterParams) internal virtual { bytes memory trustedRemote = trustedRemoteLookup[_dstChainId]; require(trustedRemote.length != 0, "LzApp: destination chain is not a trusted source"); lzEndpoint.send{value: msg.value}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams); } //---------------------------UserApplication config---------------------------------------- function getConfig(uint16 _version, uint16 _chainId, address, uint _configType) external view returns (bytes memory) { return lzEndpoint.getConfig(_version, _chainId, address(this), _configType); } // generic config for LayerZero user Application function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external override onlyOwner { lzEndpoint.setConfig(_version, _chainId, _configType, _config); } function setSendVersion(uint16 _version) external override onlyOwner { lzEndpoint.setSendVersion(_version); } function setReceiveVersion(uint16 _version) external override onlyOwner { lzEndpoint.setReceiveVersion(_version); } function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner { lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress); } // allow owner to set it multiple times. function setTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external onlyOwner { trustedRemoteLookup[_srcChainId] = _srcAddress; emit SetTrustedRemote(_srcChainId, _srcAddress); } //--------------------------- VIEW FUNCTION ---------------------------------------- function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) { bytes memory trustedSource = trustedRemoteLookup[_srcChainId]; return keccak256(trustedSource) == keccak256(_srcAddress); } } // File contracts/LzBridge/lib/NonblockingLzApp.sol pragma solidity ^0.8.0; /* * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress) */ abstract contract NonblockingLzApp is LzApp { constructor(address _endpoint) LzApp(_endpoint) {} mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages; event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload); // overriding the virtual function in LzReceiver function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override { // try-catch all errors/exceptions try this.nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload) { // do nothing } catch { // error / exception failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload); emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload); } } function nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public virtual { // only internal transaction require(_msgSender() == address(this), "NonblockingLzApp: caller must be LzApp"); _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } //@notice override this function function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual; function retryMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public payable virtual { // assert there is message to retry bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce]; require(payloadHash != bytes32(0), "NonblockingLzApp: no stored message"); require(keccak256(_payload) == payloadHash, "NonblockingLzApp: invalid payload"); // clear the stored message failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0); // execute the message. revert if it fails again _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // 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 contracts/LzBridge/lib/ONFT721Core.sol // copied from: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/token/onft/ONFT721Core.sol pragma solidity ^0.8.0; abstract contract ONFT721Core is NonblockingLzApp, ERC165, IONFT721Core { constructor(address _lzEndpoint) NonblockingLzApp(_lzEndpoint) {} function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IONFT721Core).interfaceId || super.supportsInterface(interfaceId); } function estimateSendFee(uint16 _dstChainId, bytes memory _toAddress, uint16[] memory _tokenIds, bool _useZro, bytes memory _adapterParams) public view virtual override returns (uint nativeFee, uint zroFee) { // mock the payload for send() bytes memory payload = abi.encode(_toAddress, _tokenIds); return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams); } function sendFrom(uint16 _dstChainId, bytes memory _toAddress, uint16[] memory _tokenIds, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) public payable virtual override { _send(msg.sender, _dstChainId, _toAddress, _tokenIds, _refundAddress, _zroPaymentAddress, _adapterParams); } function _send(address _from, uint16 _dstChainId, bytes memory _toAddress, uint16[] memory _tokenIds, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) internal virtual { _debitFrom(_from, _dstChainId, _toAddress, _tokenIds); bytes memory payload = abi.encode(_toAddress, _tokenIds); _lzSend(_dstChainId, payload, _refundAddress, _zroPaymentAddress, _adapterParams); uint64 nonce = lzEndpoint.getOutboundNonce(_dstChainId, address(this)); emit SendToChain(_from, _dstChainId, _toAddress, _tokenIds, nonce); } function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override { // decode and load the toAddress (bytes memory toAddressBytes, uint16[] memory tokenIds) = abi.decode(_payload, (bytes, uint16[])); address toAddress; assembly { toAddress := mload(add(toAddressBytes, 20)) } _creditTo(_srcChainId, toAddress, tokenIds); emit ReceiveFromChain(_srcChainId, _srcAddress, toAddress, tokenIds, _nonce); } function _debitFrom(address _from, uint16 _dstChainId, bytes memory _toAddress, uint16[] memory _tokenIds) internal virtual; function _creditTo(uint16 _srcChainId, address _toAddress, uint16[] memory _tokenIds) internal virtual; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // 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/utils/[email protected] // 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/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev 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/LzBridge/AxolittlesArb.sol pragma solidity ^0.8.0; contract AxolittlesArb is Ownable, ONFT721Core, ERC721, IONFT721 { uint256 public maxItems = 10000; string public _baseTokenURI; constructor(address _lzEndpoint) ERC721("Axolittles", "AXOLITTLE") ONFT721Core(_lzEndpoint) {} function supportsInterface(bytes4 interfaceId) public view virtual override(ONFT721Core, ERC721, IERC165) returns (bool) { return interfaceId == type(IONFT721).interfaceId || super.supportsInterface(interfaceId); } function _debitFrom(address _from, uint16, bytes memory, uint16[] memory _tokenIds) internal virtual override { for (uint16 i = 0; i < _tokenIds.length;) { require(ERC721.ownerOf(_tokenIds[i]) == _from, "Axolittles: incorrect owner"); _burn(_tokenIds[i]); unchecked { ++i; } } } function _creditTo(uint16, address _toAddress, uint16[] memory _tokenIds) internal virtual override { for (uint16 i = 0; i < _tokenIds.length;) { require(!_exists(_tokenIds[i]), "Axolittles: already exist"); _safeMint(_toAddress, _tokenIds[i]); unchecked { ++i; } } } // set base URI for token metadata. Allows file host change to ipfs function setBaseTokenURI(string memory __baseTokenURI) external onlyOwner { _baseTokenURI = __baseTokenURI; } // Returns a URI for a given token ID's metadata function tokenURI(uint256 _tokenId) public view override returns (string memory) { return string(abi.encodePacked(_baseTokenURI, Strings.toString(_tokenId))); } function adminRecover(address _to, uint16 _tokenId, bool isMint) external onlyOwner { if (isMint) { _safeMint(_to, _tokenId); } else { require(_exists(_tokenId), "Axolittles: doesn't exist"); _burn(_tokenId); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_lzEndpoint","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":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":true,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":true,"internalType":"address","name":"_toAddress","type":"address"},{"indexed":false,"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_sender","type":"address"},{"indexed":true,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"internalType":"bytes","name":"_toAddress","type":"bytes"},{"indexed":false,"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"}],"name":"SendToChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"SetTrustedRemote","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":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint16","name":"_tokenId","type":"uint16"},{"internalType":"bool","name":"isMint","type":"bool"}],"name":"adminRecover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"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"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lzEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"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":[],"name":"maxItems","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"sendFrom","outputs":[],"stateMutability":"payable","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":"__baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","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":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040526127106009553480156200001757600080fd5b5060405162003828380380620038288339810160408190526200003a91620001dd565b6040518060400160405280600a81526020016941786f6c6974746c657360b01b8152506040518060400160405280600981526020016841584f4c4954544c4560b81b8152508280806200009c62000096620000e360201b60201c565b620000e7565b60601b6001600160601b03191660805250508151620000c390600390602085019062000137565b508051620000d990600490602084019062000137565b505050506200024c565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000145906200020f565b90600052602060002090601f016020900481019282620001695760008555620001b4565b82601f106200018457805160ff1916838001178555620001b4565b82800160010185558215620001b4579182015b82811115620001b457825182559160200191906001019062000197565b50620001c2929150620001c6565b5090565b5b80821115620001c25760008155600101620001c7565b600060208284031215620001f057600080fd5b81516001600160a01b03811681146200020857600080fd5b9392505050565b600181811c908216806200022457607f821691505b602082108114156200024657634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c61357e620002aa6000396000818161055b015281816106e40152818161098001528181610bcb01528181610ca901528181610e7a015281816111e90152818161152a01528181611de40152612382015261357e6000f3fe6080604052600436106102035760003560e01c806370a0823111610118578063cbed8b9c116100a0578063e985e9c51161006f578063e985e9c514610618578063eb8d72b714610661578063f2fde38b14610681578063f5ecbdbc146106a1578063fc0cd5eb146106c157600080fd5b8063cbed8b9c146105bd578063cfc86f7b146105dd578063d1deba1f146105f2578063e7bc3a201461060557600080fd5b806395d89b41116100e757806395d89b4114610514578063a22cb46514610529578063b353aaa714610549578063b88d4fde1461057d578063c87b56dd1461059d57600080fd5b806370a08231146104a1578063715018a6146104c15780637533d788146104d65780638da5cb5b146104f657600080fd5b806323b872dd1161019b57806342842e0e1161016a57806342842e0e146103d257806342d65a8d146103f25780635b8c41e6146104125780636352211e1461046157806366ad5c8a1461048157600080fd5b806323b872dd1461034e57806330176e131461036e5780633c010a3e1461038e5780633d8b38f6146103b257600080fd5b8063081812fc116101d7578063081812fc146102a1578063095ea7b3146102d95780630a54dda1146102f957806310ddb1371461032e57600080fd5b80621d35671461020857806301ffc9a71461022a57806306fdde031461025f57806307e0db1714610281575b600080fd5b34801561021457600080fd5b50610228610223366004612d67565b6106e1565b005b34801561023657600080fd5b5061024a6102453660046129a6565b610888565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b506102746108ab565b60405161025691906130ed565b34801561028d57600080fd5b5061022861029c366004612b26565b61093d565b3480156102ad57600080fd5b506102c16102bc366004612ea8565b6109e1565b6040516001600160a01b039091168152602001610256565b3480156102e557600080fd5b506102286102f436600461297a565b610a76565b34801561030557600080fd5b50610319610314366004612c59565b610b8c565b60408051928352602083019190915201610256565b34801561033a57600080fd5b50610228610349366004612b26565b610c66565b34801561035a57600080fd5b50610228610369366004612852565b610ce0565b34801561037a57600080fd5b50610228610389366004612ade565b610d11565b34801561039a57600080fd5b506103a460095481565b604051908152602001610256565b3480156103be57600080fd5b5061024a6103cd366004612b43565b610d52565b3480156103de57600080fd5b506102286103ed366004612852565b610e1e565b3480156103fe57600080fd5b5061022861040d366004612b43565b610e39565b34801561041e57600080fd5b506103a461042d366004612d04565b6002602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561046d57600080fd5b506102c161047c366004612ea8565b610eea565b34801561048d57600080fd5b5061022861049c366004612d67565b610f61565b3480156104ad57600080fd5b506103a46104bc3660046127fc565b610fd1565b3480156104cd57600080fd5b50610228611058565b3480156104e257600080fd5b506102746104f1366004612b26565b61108e565b34801561050257600080fd5b506000546001600160a01b03166102c1565b34801561052057600080fd5b50610274611128565b34801561053557600080fd5b506102286105443660046128fe565b611137565b34801561055557600080fd5b506102c17f000000000000000000000000000000000000000000000000000000000000000081565b34801561058957600080fd5b50610228610598366004612893565b611142565b3480156105a957600080fd5b506102746105b8366004612ea8565b611174565b3480156105c957600080fd5b506102286105d8366004612e36565b6111a8565b3480156105e957600080fd5b5061027461125f565b610228610600366004612d67565b61126c565b610228610613366004612b97565b6113be565b34801561062457600080fd5b5061024a610633366004612819565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561066d57600080fd5b5061022861067c366004612b43565b6113d5565b34801561068d57600080fd5b5061022861069c3660046127fc565b61145e565b3480156106ad57600080fd5b506102746106bc366004612de5565b6114f9565b3480156106cd57600080fd5b506102286106dc366004612933565b6115bb565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461075e5760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff84166000908152600160205260408120805461077c90613436565b80601f01602080910402602001604051908101604052809291908181526020018280546107a890613436565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b505050505090508051845114801561081a575080805190602001208480519060200120145b6108755760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610755565b6108818585858561166f565b5050505050565b60006001600160e01b0319821615806108a557506108a582611760565b92915050565b6060600380546108ba90613436565b80601f01602080910402602001604051908101604052809291908181526020018280546108e690613436565b80156109335780601f1061090857610100808354040283529160200191610933565b820191906000526020600020905b81548152906001019060200180831161091657829003601f168201915b5050505050905090565b6000546001600160a01b031633146109675760405162461bcd60e51b815260040161075590613177565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b600060405180830381600087803b1580156109cd57600080fd5b505af1158015610881573d6000803e3d6000fd5b6000818152600560205260408120546001600160a01b0316610a5a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610755565b506000908152600760205260409020546001600160a01b031690565b6000610a8182610eea565b9050806001600160a01b0316836001600160a01b03161415610aef5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610755565b336001600160a01b0382161480610b0b5750610b0b8133610633565b610b7d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610755565b610b8783836117a0565b505050565b60008060008686604051602001610ba4929190613100565b60408051601f198184030181529082905263040a7bb160e41b825291506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb1090610c08908b90309086908b908b906004016131fd565b604080518083038186803b158015610c1f57600080fd5b505afa158015610c33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c579190612ec1565b92509250509550959350505050565b6000546001600160a01b03163314610c905760405162461bcd60e51b815260040161075590613177565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb137906024016109b3565b610cea338261180e565b610d065760405162461bcd60e51b8152600401610755906131ac565b610b87838383611901565b6000546001600160a01b03163314610d3b5760405162461bcd60e51b815260040161075590613177565b8051610d4e90600a906020840190612572565b5050565b61ffff831660009081526001602052604081208054829190610d7390613436565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9f90613436565b8015610dec5780601f10610dc157610100808354040283529160200191610dec565b820191906000526020600020905b815481529060010190602001808311610dcf57829003601f168201915b505050505090508383604051610e03929190612fb2565b60405180910390208180519060200120149150509392505050565b610b8783838360405180602001604052806000815250611142565b6000546001600160a01b03163314610e635760405162461bcd60e51b815260040161075590613177565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d90610eb390869086908690600401613251565b600060405180830381600087803b158015610ecd57600080fd5b505af1158015610ee1573d6000803e3d6000fd5b50505050505050565b6000818152600560205260408120546001600160a01b0316806108a55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610755565b333014610fbf5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610755565b610fcb84848484611aa1565b50505050565b60006001600160a01b03821661103c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610755565b506001600160a01b031660009081526006602052604090205490565b6000546001600160a01b031633146110825760405162461bcd60e51b815260040161075590613177565b61108c6000611b34565b565b600160205260009081526040902080546110a790613436565b80601f01602080910402602001604051908101604052809291908181526020018280546110d390613436565b80156111205780601f106110f557610100808354040283529160200191611120565b820191906000526020600020905b81548152906001019060200180831161110357829003601f168201915b505050505081565b6060600480546108ba90613436565b610d4e338383611b84565b61114c338361180e565b6111685760405162461bcd60e51b8152600401610755906131ac565b610fcb84848484611c53565b6060600a61118183611c86565b604051602001611192929190612fde565b6040516020818303038152906040529050919050565b6000546001600160a01b031633146111d25760405162461bcd60e51b815260040161075590613177565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c90611226908890889088908890889060040161331f565b600060405180830381600087803b15801561124057600080fd5b505af1158015611254573d6000803e3d6000fd5b505050505050505050565b600a80546110a790613436565b61ffff8416600090815260026020526040808220905161128d908690612fc2565b90815260408051602092819003830190206001600160401b0386166000908152925290205490508061130d5760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610755565b81516020830120811461136c5760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610755565b61ffff8516600090815260026020526040808220905161138d908790612fc2565b90815260408051602092819003830190206001600160401b0387166000908152925290205561088185858585611aa1565b6113cd33878787878787611d83565b505050505050565b6000546001600160a01b031633146113ff5760405162461bcd60e51b815260040161075590613177565b61ffff8316600090815260016020526040902061141d9083836125f6565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161145193929190613251565b60405180910390a1505050565b6000546001600160a01b031633146114885760405162461bcd60e51b815260040161075590613177565b6001600160a01b0381166114ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610755565b6114f681611b34565b50565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc9060840160006040518083038186803b15801561157457600080fd5b505afa158015611588573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115b091908101906129e0565b90505b949350505050565b6000546001600160a01b031633146115e55760405162461bcd60e51b815260040161075590613177565b80156115f957610b87838361ffff16611ed1565b61ffff82166000908152600560205260409020546001600160a01b03166116625760405162461bcd60e51b815260206004820152601960248201527f41786f6c6974746c65733a20646f65736e2774206578697374000000000000006044820152606401610755565b610b878261ffff16611eeb565b604051633356ae4560e11b815230906366ad5c8a906116989087908790879087906004016132d6565b600060405180830381600087803b1580156116b257600080fd5b505af19250505080156116c3575060015b610fcb578080519060200120600260008661ffff1661ffff168152602001908152602001600020846040516116f89190612fc2565b9081526040805191829003602090810183206001600160401b0387166000908152915220919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d906117539086908690869086906132d6565b60405180910390a1610fcb565b60006001600160e01b031982166380ac58cd60e01b148061179157506001600160e01b03198216635b5e139f60e01b145b806108a557506108a582611f86565b600081815260076020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117d582610eea565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600560205260408120546001600160a01b03166118875760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610755565b600061189283610eea565b9050806001600160a01b0316846001600160a01b031614806118cd5750836001600160a01b03166118c2846109e1565b6001600160a01b0316145b806115b357506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff166115b3565b826001600160a01b031661191482610eea565b6001600160a01b03161461197c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610755565b6001600160a01b0382166119de5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610755565b6119e96000826117a0565b6001600160a01b0383166000908152600660205260408120805460019290611a129084906133f3565b90915550506001600160a01b0382166000908152600660205260408120805460019290611a409084906133c7565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008082806020019051810190611ab89190612a14565b60148201519193509150611acd878284611fbb565b806001600160a01b031686604051611ae59190612fc2565b60405180910390208861ffff167fbd66934b09dec04b3aea2d88b8893e2844133810be0e2298aa6f6a28aa65795f8589604051611b239291906130c2565b60405180910390a450505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611be65760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610755565b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611c5e848484611901565b611c6a8484848461208d565b610fcb5760405162461bcd60e51b815260040161075590613125565b606081611caa5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cd45780611cbe81613471565b9150611ccd9050600a836133df565b9150611cae565b6000816001600160401b03811115611cee57611cee6134e2565b6040519080825280601f01601f191660200182016040528015611d18576020820181803683370190505b5090505b84156115b357611d2d6001836133f3565b9150611d3a600a8661348c565b611d459060306133c7565b60f81b818381518110611d5a57611d5a6134cc565b60200101906001600160f81b031916908160001a905350611d7c600a866133df565b9450611d1c565b611d8f87878787612197565b60008585604051602001611da4929190613100565b6040516020818303038152906040529050611dc28782868686612263565b604051630f428ae960e31b815261ffff881660048201523060248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637a1457489060440160206040518083038186803b158015611e2e57600080fd5b505afa158015611e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e669190612ee5565b905086604051611e769190612fc2565b60405180910390208861ffff168a6001600160a01b03167fb7ea7294afa99e68f724ddc625e6ecf2086863430067ce6ff5cd4404445d32228985604051611ebe9291906130c2565b60405180910390a4505050505050505050565b610d4e8282604051806020016040528060008152506123fd565b6000611ef682610eea565b9050611f036000836117a0565b6001600160a01b0381166000908152600660205260408120805460019290611f2c9084906133f3565b909155505060008281526005602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160e01b0319821663ede8e78160e01b14806108a557506301ffc9a760e01b6001600160e01b03198316146108a5565b60005b81518161ffff161015610fcb5761200d828261ffff1681518110611fe457611fe46134cc565b602002602001015161ffff166000908152600560205260409020546001600160a01b0316151590565b1561205a5760405162461bcd60e51b815260206004820152601960248201527f41786f6c6974746c65733a20616c7265616479206578697374000000000000006044820152606401610755565b61208583838361ffff1681518110612074576120746134cc565b602002602001015161ffff16611ed1565b600101611fbe565b60006001600160a01b0384163b1561218f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120d1903390899088908890600401613085565b602060405180830381600087803b1580156120eb57600080fd5b505af192505050801561211b575060408051601f3d908101601f19168201909252612118918101906129c3565b60015b612175573d808015612149576040519150601f19603f3d011682016040523d82523d6000602084013e61214e565b606091505b50805161216d5760405162461bcd60e51b815260040161075590613125565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115b3565b5060016115b3565b60005b81518161ffff16101561088157846001600160a01b03166121db838361ffff16815181106121ca576121ca6134cc565b602002602001015161ffff16610eea565b6001600160a01b0316146122315760405162461bcd60e51b815260206004820152601b60248201527f41786f6c6974746c65733a20696e636f7272656374206f776e657200000000006044820152606401610755565b61225b828261ffff168151811061224a5761224a6134cc565b602002602001015161ffff16611eeb565b60010161219a565b61ffff85166000908152600160205260408120805461228190613436565b80601f01602080910402602001604051908101604052809291908181526020018280546122ad90613436565b80156122fa5780601f106122cf576101008083540402835291602001916122fa565b820191906000526020600020905b8154815290600101906020018083116122dd57829003601f168201915b5050505050905080516000141561236c5760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610755565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c58031009034906123c3908a9086908b908b908b908b9060040161326f565b6000604051808303818588803b1580156123dc57600080fd5b505af11580156123f0573d6000803e3d6000fd5b5050505050505050505050565b6124078383612430565b612414600084848461208d565b610b875760405162461bcd60e51b815260040161075590613125565b6001600160a01b0382166124865760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610755565b6000818152600560205260409020546001600160a01b0316156124eb5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610755565b6001600160a01b03821660009081526006602052604081208054600192906125149084906133c7565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461257e90613436565b90600052602060002090601f0160209004810192826125a057600085556125e6565b82601f106125b957805160ff19168380011785556125e6565b828001600101855582156125e6579182015b828111156125e65782518255916020019190600101906125cb565b506125f292915061266a565b5090565b82805461260290613436565b90600052602060002090601f01602090048101928261262457600085556125e6565b82601f1061263d5782800160ff198235161785556125e6565b828001600101855582156125e6579182015b828111156125e657823582559160200191906001019061264f565b5b808211156125f2576000815560010161266b565b600061269261268d846133a0565b61334d565b90508281528383830111156126a657600080fd5b828260208301376000602084830101529392505050565b600082601f8301126126ce57600080fd5b813560206126de61268d8361337d565b80838252828201915082860187848660051b89010111156126fe57600080fd5b60005b8581101561272657813561271481613523565b84529284019290840190600101612701565b5090979650505050505050565b8035801515811461274357600080fd5b919050565b60008083601f84011261275a57600080fd5b5081356001600160401b0381111561277157600080fd5b60208301915083602082850101111561278957600080fd5b9250929050565b600082601f8301126127a157600080fd5b6127b08383356020850161267f565b9392505050565b600082601f8301126127c857600080fd5b81516127d661268d826133a0565b8181528460208386010111156127eb57600080fd5b6115b382602083016020870161340a565b60006020828403121561280e57600080fd5b81356127b0816134f8565b6000806040838503121561282c57600080fd5b8235612837816134f8565b91506020830135612847816134f8565b809150509250929050565b60008060006060848603121561286757600080fd5b8335612872816134f8565b92506020840135612882816134f8565b929592945050506040919091013590565b600080600080608085870312156128a957600080fd5b84356128b4816134f8565b935060208501356128c4816134f8565b92506040850135915060608501356001600160401b038111156128e657600080fd5b6128f287828801612790565b91505092959194509250565b6000806040838503121561291157600080fd5b823561291c816134f8565b915061292a60208401612733565b90509250929050565b60008060006060848603121561294857600080fd5b8335612953816134f8565b9250602084013561296381613523565b915061297160408501612733565b90509250925092565b6000806040838503121561298d57600080fd5b8235612998816134f8565b946020939093013593505050565b6000602082840312156129b857600080fd5b81356127b08161350d565b6000602082840312156129d557600080fd5b81516127b08161350d565b6000602082840312156129f257600080fd5b81516001600160401b03811115612a0857600080fd5b6115b3848285016127b7565b60008060408385031215612a2757600080fd5b82516001600160401b0380821115612a3e57600080fd5b612a4a868387016127b7565b9350602091508185015181811115612a6157600080fd5b85019050601f81018613612a7457600080fd5b8051612a8261268d8261337d565b80828252848201915084840189868560051b8701011115612aa257600080fd5b600094505b83851015612ace578051612aba81613523565b835260019490940193918501918501612aa7565b5080955050505050509250929050565b600060208284031215612af057600080fd5b81356001600160401b03811115612b0657600080fd5b8201601f81018413612b1757600080fd5b6115b38482356020840161267f565b600060208284031215612b3857600080fd5b81356127b081613523565b600080600060408486031215612b5857600080fd5b8335612b6381613523565b925060208401356001600160401b03811115612b7e57600080fd5b612b8a86828701612748565b9497909650939450505050565b60008060008060008060c08789031215612bb057600080fd5b8635612bbb81613523565b955060208701356001600160401b0380821115612bd757600080fd5b612be38a838b01612790565b96506040890135915080821115612bf957600080fd5b612c058a838b016126bd565b955060608901359150612c17826134f8565b909350608088013590612c29826134f8565b90925060a08801359080821115612c3f57600080fd5b50612c4c89828a01612790565b9150509295509295509295565b600080600080600060a08688031215612c7157600080fd5b8535612c7c81613523565b945060208601356001600160401b0380821115612c9857600080fd5b612ca489838a01612790565b95506040880135915080821115612cba57600080fd5b612cc689838a016126bd565b9450612cd460608901612733565b93506080880135915080821115612cea57600080fd5b50612cf788828901612790565b9150509295509295909350565b600080600060608486031215612d1957600080fd5b8335612d2481613523565b925060208401356001600160401b03811115612d3f57600080fd5b612d4b86828701612790565b9250506040840135612d5c81613533565b809150509250925092565b60008060008060808587031215612d7d57600080fd5b8435612d8881613523565b935060208501356001600160401b0380821115612da457600080fd5b612db088838901612790565b945060408701359150612dc282613533565b90925060608601359080821115612dd857600080fd5b506128f287828801612790565b60008060008060808587031215612dfb57600080fd5b8435612e0681613523565b93506020850135612e1681613523565b92506040850135612e26816134f8565b9396929550929360600135925050565b600080600080600060808688031215612e4e57600080fd5b8535612e5981613523565b94506020860135612e6981613523565b93506040860135925060608601356001600160401b03811115612e8b57600080fd5b612e9788828901612748565b969995985093965092949392505050565b600060208284031215612eba57600080fd5b5035919050565b60008060408385031215612ed457600080fd5b505080516020909101519092909150565b600060208284031215612ef757600080fd5b81516127b081613533565b600081518084526020808501945080840160005b83811015612f3657815161ffff1687529582019590820190600101612f16565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008151808452612f8281602086016020860161340a565b601f01601f19169290920160200192915050565b60008151612fa881856020860161340a565b9290920192915050565b8183823760009101908152919050565b60008251612fd481846020870161340a565b9190910192915050565b600080845481600182811c915080831680612ffa57607f831692505b602080841082141561301a57634e487b7160e01b86526022600452602486fd5b81801561302e576001811461303f5761306c565b60ff1986168952848901965061306c565b60008b81526020902060005b868110156130645781548b82015290850190830161304b565b505084890196505b50505050505061307c8185612f96565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906130b890830184612f6a565b9695505050505050565b6040815260006130d56040830185612f02565b90506001600160401b03831660208301529392505050565b6020815260006127b06020830184612f6a565b6040815260006131136040830185612f6a565b828103602084015261307c8185612f02565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061322b90830186612f6a565b841515606084015282810360808401526132458185612f6a565b98975050505050505050565b61ffff841681526040602082015260006115b0604083018486612f41565b61ffff8716815260c06020820152600061328c60c0830188612f6a565b828103604084015261329e8188612f6a565b6001600160a01b0387811660608601528616608085015283810360a085015290506132c98185612f6a565b9998505050505050505050565b61ffff851681526080602082015260006132f36080830186612f6a565b6001600160401b038516604084015282810360608401526133148185612f6a565b979650505050505050565b600061ffff808816835280871660208401525084604083015260806060830152613314608083018486612f41565b604051601f8201601f191681016001600160401b0381118282101715613375576133756134e2565b604052919050565b60006001600160401b03821115613396576133966134e2565b5060051b60200190565b60006001600160401b038211156133b9576133b96134e2565b50601f01601f191660200190565b600082198211156133da576133da6134a0565b500190565b6000826133ee576133ee6134b6565b500490565b600082821015613405576134056134a0565b500390565b60005b8381101561342557818101518382015260200161340d565b83811115610fcb5750506000910152565b600181811c9082168061344a57607f821691505b6020821081141561346b57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613485576134856134a0565b5060010190565b60008261349b5761349b6134b6565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146114f657600080fd5b6001600160e01b0319811681146114f657600080fd5b61ffff811681146114f657600080fd5b6001600160401b03811681146114f657600080fdfea2646970667358221220a6c7f77cccc90c390c67a24ef8bee85caf2f641175884e9615286873b8c89d6964736f6c634300080700330000000000000000000000003c2269811836af69497e5f486a85d7316753cf62
Deployed Bytecode
0x6080604052600436106102035760003560e01c806370a0823111610118578063cbed8b9c116100a0578063e985e9c51161006f578063e985e9c514610618578063eb8d72b714610661578063f2fde38b14610681578063f5ecbdbc146106a1578063fc0cd5eb146106c157600080fd5b8063cbed8b9c146105bd578063cfc86f7b146105dd578063d1deba1f146105f2578063e7bc3a201461060557600080fd5b806395d89b41116100e757806395d89b4114610514578063a22cb46514610529578063b353aaa714610549578063b88d4fde1461057d578063c87b56dd1461059d57600080fd5b806370a08231146104a1578063715018a6146104c15780637533d788146104d65780638da5cb5b146104f657600080fd5b806323b872dd1161019b57806342842e0e1161016a57806342842e0e146103d257806342d65a8d146103f25780635b8c41e6146104125780636352211e1461046157806366ad5c8a1461048157600080fd5b806323b872dd1461034e57806330176e131461036e5780633c010a3e1461038e5780633d8b38f6146103b257600080fd5b8063081812fc116101d7578063081812fc146102a1578063095ea7b3146102d95780630a54dda1146102f957806310ddb1371461032e57600080fd5b80621d35671461020857806301ffc9a71461022a57806306fdde031461025f57806307e0db1714610281575b600080fd5b34801561021457600080fd5b50610228610223366004612d67565b6106e1565b005b34801561023657600080fd5b5061024a6102453660046129a6565b610888565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b506102746108ab565b60405161025691906130ed565b34801561028d57600080fd5b5061022861029c366004612b26565b61093d565b3480156102ad57600080fd5b506102c16102bc366004612ea8565b6109e1565b6040516001600160a01b039091168152602001610256565b3480156102e557600080fd5b506102286102f436600461297a565b610a76565b34801561030557600080fd5b50610319610314366004612c59565b610b8c565b60408051928352602083019190915201610256565b34801561033a57600080fd5b50610228610349366004612b26565b610c66565b34801561035a57600080fd5b50610228610369366004612852565b610ce0565b34801561037a57600080fd5b50610228610389366004612ade565b610d11565b34801561039a57600080fd5b506103a460095481565b604051908152602001610256565b3480156103be57600080fd5b5061024a6103cd366004612b43565b610d52565b3480156103de57600080fd5b506102286103ed366004612852565b610e1e565b3480156103fe57600080fd5b5061022861040d366004612b43565b610e39565b34801561041e57600080fd5b506103a461042d366004612d04565b6002602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561046d57600080fd5b506102c161047c366004612ea8565b610eea565b34801561048d57600080fd5b5061022861049c366004612d67565b610f61565b3480156104ad57600080fd5b506103a46104bc3660046127fc565b610fd1565b3480156104cd57600080fd5b50610228611058565b3480156104e257600080fd5b506102746104f1366004612b26565b61108e565b34801561050257600080fd5b506000546001600160a01b03166102c1565b34801561052057600080fd5b50610274611128565b34801561053557600080fd5b506102286105443660046128fe565b611137565b34801561055557600080fd5b506102c17f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6281565b34801561058957600080fd5b50610228610598366004612893565b611142565b3480156105a957600080fd5b506102746105b8366004612ea8565b611174565b3480156105c957600080fd5b506102286105d8366004612e36565b6111a8565b3480156105e957600080fd5b5061027461125f565b610228610600366004612d67565b61126c565b610228610613366004612b97565b6113be565b34801561062457600080fd5b5061024a610633366004612819565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561066d57600080fd5b5061022861067c366004612b43565b6113d5565b34801561068d57600080fd5b5061022861069c3660046127fc565b61145e565b3480156106ad57600080fd5b506102746106bc366004612de5565b6114f9565b3480156106cd57600080fd5b506102286106dc366004612933565b6115bb565b337f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b03161461075e5760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff84166000908152600160205260408120805461077c90613436565b80601f01602080910402602001604051908101604052809291908181526020018280546107a890613436565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b505050505090508051845114801561081a575080805190602001208480519060200120145b6108755760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610755565b6108818585858561166f565b5050505050565b60006001600160e01b0319821615806108a557506108a582611760565b92915050565b6060600380546108ba90613436565b80601f01602080910402602001604051908101604052809291908181526020018280546108e690613436565b80156109335780601f1061090857610100808354040283529160200191610933565b820191906000526020600020905b81548152906001019060200180831161091657829003601f168201915b5050505050905090565b6000546001600160a01b031633146109675760405162461bcd60e51b815260040161075590613177565b6040516307e0db1760e01b815261ffff821660048201527f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b0316906307e0db17906024015b600060405180830381600087803b1580156109cd57600080fd5b505af1158015610881573d6000803e3d6000fd5b6000818152600560205260408120546001600160a01b0316610a5a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610755565b506000908152600760205260409020546001600160a01b031690565b6000610a8182610eea565b9050806001600160a01b0316836001600160a01b03161415610aef5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610755565b336001600160a01b0382161480610b0b5750610b0b8133610633565b610b7d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610755565b610b8783836117a0565b505050565b60008060008686604051602001610ba4929190613100565b60408051601f198184030181529082905263040a7bb160e41b825291506001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6216906340a7bb1090610c08908b90309086908b908b906004016131fd565b604080518083038186803b158015610c1f57600080fd5b505afa158015610c33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c579190612ec1565b92509250509550959350505050565b6000546001600160a01b03163314610c905760405162461bcd60e51b815260040161075590613177565b6040516310ddb13760e01b815261ffff821660048201527f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b0316906310ddb137906024016109b3565b610cea338261180e565b610d065760405162461bcd60e51b8152600401610755906131ac565b610b87838383611901565b6000546001600160a01b03163314610d3b5760405162461bcd60e51b815260040161075590613177565b8051610d4e90600a906020840190612572565b5050565b61ffff831660009081526001602052604081208054829190610d7390613436565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9f90613436565b8015610dec5780601f10610dc157610100808354040283529160200191610dec565b820191906000526020600020905b815481529060010190602001808311610dcf57829003601f168201915b505050505090508383604051610e03929190612fb2565b60405180910390208180519060200120149150509392505050565b610b8783838360405180602001604052806000815250611142565b6000546001600160a01b03163314610e635760405162461bcd60e51b815260040161075590613177565b6040516342d65a8d60e01b81526001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6216906342d65a8d90610eb390869086908690600401613251565b600060405180830381600087803b158015610ecd57600080fd5b505af1158015610ee1573d6000803e3d6000fd5b50505050505050565b6000818152600560205260408120546001600160a01b0316806108a55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610755565b333014610fbf5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610755565b610fcb84848484611aa1565b50505050565b60006001600160a01b03821661103c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610755565b506001600160a01b031660009081526006602052604090205490565b6000546001600160a01b031633146110825760405162461bcd60e51b815260040161075590613177565b61108c6000611b34565b565b600160205260009081526040902080546110a790613436565b80601f01602080910402602001604051908101604052809291908181526020018280546110d390613436565b80156111205780601f106110f557610100808354040283529160200191611120565b820191906000526020600020905b81548152906001019060200180831161110357829003601f168201915b505050505081565b6060600480546108ba90613436565b610d4e338383611b84565b61114c338361180e565b6111685760405162461bcd60e51b8152600401610755906131ac565b610fcb84848484611c53565b6060600a61118183611c86565b604051602001611192929190612fde565b6040516020818303038152906040529050919050565b6000546001600160a01b031633146111d25760405162461bcd60e51b815260040161075590613177565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62169063cbed8b9c90611226908890889088908890889060040161331f565b600060405180830381600087803b15801561124057600080fd5b505af1158015611254573d6000803e3d6000fd5b505050505050505050565b600a80546110a790613436565b61ffff8416600090815260026020526040808220905161128d908690612fc2565b90815260408051602092819003830190206001600160401b0386166000908152925290205490508061130d5760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610755565b81516020830120811461136c5760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610755565b61ffff8516600090815260026020526040808220905161138d908790612fc2565b90815260408051602092819003830190206001600160401b0387166000908152925290205561088185858585611aa1565b6113cd33878787878787611d83565b505050505050565b6000546001600160a01b031633146113ff5760405162461bcd60e51b815260040161075590613177565b61ffff8316600090815260016020526040902061141d9083836125f6565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161145193929190613251565b60405180910390a1505050565b6000546001600160a01b031633146114885760405162461bcd60e51b815260040161075590613177565b6001600160a01b0381166114ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610755565b6114f681611b34565b50565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b03169063f5ecbdbc9060840160006040518083038186803b15801561157457600080fd5b505afa158015611588573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115b091908101906129e0565b90505b949350505050565b6000546001600160a01b031633146115e55760405162461bcd60e51b815260040161075590613177565b80156115f957610b87838361ffff16611ed1565b61ffff82166000908152600560205260409020546001600160a01b03166116625760405162461bcd60e51b815260206004820152601960248201527f41786f6c6974746c65733a20646f65736e2774206578697374000000000000006044820152606401610755565b610b878261ffff16611eeb565b604051633356ae4560e11b815230906366ad5c8a906116989087908790879087906004016132d6565b600060405180830381600087803b1580156116b257600080fd5b505af19250505080156116c3575060015b610fcb578080519060200120600260008661ffff1661ffff168152602001908152602001600020846040516116f89190612fc2565b9081526040805191829003602090810183206001600160401b0387166000908152915220919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d906117539086908690869086906132d6565b60405180910390a1610fcb565b60006001600160e01b031982166380ac58cd60e01b148061179157506001600160e01b03198216635b5e139f60e01b145b806108a557506108a582611f86565b600081815260076020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117d582610eea565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600560205260408120546001600160a01b03166118875760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610755565b600061189283610eea565b9050806001600160a01b0316846001600160a01b031614806118cd5750836001600160a01b03166118c2846109e1565b6001600160a01b0316145b806115b357506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff166115b3565b826001600160a01b031661191482610eea565b6001600160a01b03161461197c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610755565b6001600160a01b0382166119de5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610755565b6119e96000826117a0565b6001600160a01b0383166000908152600660205260408120805460019290611a129084906133f3565b90915550506001600160a01b0382166000908152600660205260408120805460019290611a409084906133c7565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008082806020019051810190611ab89190612a14565b60148201519193509150611acd878284611fbb565b806001600160a01b031686604051611ae59190612fc2565b60405180910390208861ffff167fbd66934b09dec04b3aea2d88b8893e2844133810be0e2298aa6f6a28aa65795f8589604051611b239291906130c2565b60405180910390a450505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611be65760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610755565b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611c5e848484611901565b611c6a8484848461208d565b610fcb5760405162461bcd60e51b815260040161075590613125565b606081611caa5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cd45780611cbe81613471565b9150611ccd9050600a836133df565b9150611cae565b6000816001600160401b03811115611cee57611cee6134e2565b6040519080825280601f01601f191660200182016040528015611d18576020820181803683370190505b5090505b84156115b357611d2d6001836133f3565b9150611d3a600a8661348c565b611d459060306133c7565b60f81b818381518110611d5a57611d5a6134cc565b60200101906001600160f81b031916908160001a905350611d7c600a866133df565b9450611d1c565b611d8f87878787612197565b60008585604051602001611da4929190613100565b6040516020818303038152906040529050611dc28782868686612263565b604051630f428ae960e31b815261ffff881660048201523060248201526000907f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b031690637a1457489060440160206040518083038186803b158015611e2e57600080fd5b505afa158015611e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e669190612ee5565b905086604051611e769190612fc2565b60405180910390208861ffff168a6001600160a01b03167fb7ea7294afa99e68f724ddc625e6ecf2086863430067ce6ff5cd4404445d32228985604051611ebe9291906130c2565b60405180910390a4505050505050505050565b610d4e8282604051806020016040528060008152506123fd565b6000611ef682610eea565b9050611f036000836117a0565b6001600160a01b0381166000908152600660205260408120805460019290611f2c9084906133f3565b909155505060008281526005602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160e01b0319821663ede8e78160e01b14806108a557506301ffc9a760e01b6001600160e01b03198316146108a5565b60005b81518161ffff161015610fcb5761200d828261ffff1681518110611fe457611fe46134cc565b602002602001015161ffff166000908152600560205260409020546001600160a01b0316151590565b1561205a5760405162461bcd60e51b815260206004820152601960248201527f41786f6c6974746c65733a20616c7265616479206578697374000000000000006044820152606401610755565b61208583838361ffff1681518110612074576120746134cc565b602002602001015161ffff16611ed1565b600101611fbe565b60006001600160a01b0384163b1561218f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120d1903390899088908890600401613085565b602060405180830381600087803b1580156120eb57600080fd5b505af192505050801561211b575060408051601f3d908101601f19168201909252612118918101906129c3565b60015b612175573d808015612149576040519150601f19603f3d011682016040523d82523d6000602084013e61214e565b606091505b50805161216d5760405162461bcd60e51b815260040161075590613125565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115b3565b5060016115b3565b60005b81518161ffff16101561088157846001600160a01b03166121db838361ffff16815181106121ca576121ca6134cc565b602002602001015161ffff16610eea565b6001600160a01b0316146122315760405162461bcd60e51b815260206004820152601b60248201527f41786f6c6974746c65733a20696e636f7272656374206f776e657200000000006044820152606401610755565b61225b828261ffff168151811061224a5761224a6134cc565b602002602001015161ffff16611eeb565b60010161219a565b61ffff85166000908152600160205260408120805461228190613436565b80601f01602080910402602001604051908101604052809291908181526020018280546122ad90613436565b80156122fa5780601f106122cf576101008083540402835291602001916122fa565b820191906000526020600020905b8154815290600101906020018083116122dd57829003601f168201915b5050505050905080516000141561236c5760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610755565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62169063c58031009034906123c3908a9086908b908b908b908b9060040161326f565b6000604051808303818588803b1580156123dc57600080fd5b505af11580156123f0573d6000803e3d6000fd5b5050505050505050505050565b6124078383612430565b612414600084848461208d565b610b875760405162461bcd60e51b815260040161075590613125565b6001600160a01b0382166124865760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610755565b6000818152600560205260409020546001600160a01b0316156124eb5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610755565b6001600160a01b03821660009081526006602052604081208054600192906125149084906133c7565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461257e90613436565b90600052602060002090601f0160209004810192826125a057600085556125e6565b82601f106125b957805160ff19168380011785556125e6565b828001600101855582156125e6579182015b828111156125e65782518255916020019190600101906125cb565b506125f292915061266a565b5090565b82805461260290613436565b90600052602060002090601f01602090048101928261262457600085556125e6565b82601f1061263d5782800160ff198235161785556125e6565b828001600101855582156125e6579182015b828111156125e657823582559160200191906001019061264f565b5b808211156125f2576000815560010161266b565b600061269261268d846133a0565b61334d565b90508281528383830111156126a657600080fd5b828260208301376000602084830101529392505050565b600082601f8301126126ce57600080fd5b813560206126de61268d8361337d565b80838252828201915082860187848660051b89010111156126fe57600080fd5b60005b8581101561272657813561271481613523565b84529284019290840190600101612701565b5090979650505050505050565b8035801515811461274357600080fd5b919050565b60008083601f84011261275a57600080fd5b5081356001600160401b0381111561277157600080fd5b60208301915083602082850101111561278957600080fd5b9250929050565b600082601f8301126127a157600080fd5b6127b08383356020850161267f565b9392505050565b600082601f8301126127c857600080fd5b81516127d661268d826133a0565b8181528460208386010111156127eb57600080fd5b6115b382602083016020870161340a565b60006020828403121561280e57600080fd5b81356127b0816134f8565b6000806040838503121561282c57600080fd5b8235612837816134f8565b91506020830135612847816134f8565b809150509250929050565b60008060006060848603121561286757600080fd5b8335612872816134f8565b92506020840135612882816134f8565b929592945050506040919091013590565b600080600080608085870312156128a957600080fd5b84356128b4816134f8565b935060208501356128c4816134f8565b92506040850135915060608501356001600160401b038111156128e657600080fd5b6128f287828801612790565b91505092959194509250565b6000806040838503121561291157600080fd5b823561291c816134f8565b915061292a60208401612733565b90509250929050565b60008060006060848603121561294857600080fd5b8335612953816134f8565b9250602084013561296381613523565b915061297160408501612733565b90509250925092565b6000806040838503121561298d57600080fd5b8235612998816134f8565b946020939093013593505050565b6000602082840312156129b857600080fd5b81356127b08161350d565b6000602082840312156129d557600080fd5b81516127b08161350d565b6000602082840312156129f257600080fd5b81516001600160401b03811115612a0857600080fd5b6115b3848285016127b7565b60008060408385031215612a2757600080fd5b82516001600160401b0380821115612a3e57600080fd5b612a4a868387016127b7565b9350602091508185015181811115612a6157600080fd5b85019050601f81018613612a7457600080fd5b8051612a8261268d8261337d565b80828252848201915084840189868560051b8701011115612aa257600080fd5b600094505b83851015612ace578051612aba81613523565b835260019490940193918501918501612aa7565b5080955050505050509250929050565b600060208284031215612af057600080fd5b81356001600160401b03811115612b0657600080fd5b8201601f81018413612b1757600080fd5b6115b38482356020840161267f565b600060208284031215612b3857600080fd5b81356127b081613523565b600080600060408486031215612b5857600080fd5b8335612b6381613523565b925060208401356001600160401b03811115612b7e57600080fd5b612b8a86828701612748565b9497909650939450505050565b60008060008060008060c08789031215612bb057600080fd5b8635612bbb81613523565b955060208701356001600160401b0380821115612bd757600080fd5b612be38a838b01612790565b96506040890135915080821115612bf957600080fd5b612c058a838b016126bd565b955060608901359150612c17826134f8565b909350608088013590612c29826134f8565b90925060a08801359080821115612c3f57600080fd5b50612c4c89828a01612790565b9150509295509295509295565b600080600080600060a08688031215612c7157600080fd5b8535612c7c81613523565b945060208601356001600160401b0380821115612c9857600080fd5b612ca489838a01612790565b95506040880135915080821115612cba57600080fd5b612cc689838a016126bd565b9450612cd460608901612733565b93506080880135915080821115612cea57600080fd5b50612cf788828901612790565b9150509295509295909350565b600080600060608486031215612d1957600080fd5b8335612d2481613523565b925060208401356001600160401b03811115612d3f57600080fd5b612d4b86828701612790565b9250506040840135612d5c81613533565b809150509250925092565b60008060008060808587031215612d7d57600080fd5b8435612d8881613523565b935060208501356001600160401b0380821115612da457600080fd5b612db088838901612790565b945060408701359150612dc282613533565b90925060608601359080821115612dd857600080fd5b506128f287828801612790565b60008060008060808587031215612dfb57600080fd5b8435612e0681613523565b93506020850135612e1681613523565b92506040850135612e26816134f8565b9396929550929360600135925050565b600080600080600060808688031215612e4e57600080fd5b8535612e5981613523565b94506020860135612e6981613523565b93506040860135925060608601356001600160401b03811115612e8b57600080fd5b612e9788828901612748565b969995985093965092949392505050565b600060208284031215612eba57600080fd5b5035919050565b60008060408385031215612ed457600080fd5b505080516020909101519092909150565b600060208284031215612ef757600080fd5b81516127b081613533565b600081518084526020808501945080840160005b83811015612f3657815161ffff1687529582019590820190600101612f16565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008151808452612f8281602086016020860161340a565b601f01601f19169290920160200192915050565b60008151612fa881856020860161340a565b9290920192915050565b8183823760009101908152919050565b60008251612fd481846020870161340a565b9190910192915050565b600080845481600182811c915080831680612ffa57607f831692505b602080841082141561301a57634e487b7160e01b86526022600452602486fd5b81801561302e576001811461303f5761306c565b60ff1986168952848901965061306c565b60008b81526020902060005b868110156130645781548b82015290850190830161304b565b505084890196505b50505050505061307c8185612f96565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906130b890830184612f6a565b9695505050505050565b6040815260006130d56040830185612f02565b90506001600160401b03831660208301529392505050565b6020815260006127b06020830184612f6a565b6040815260006131136040830185612f6a565b828103602084015261307c8185612f02565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061322b90830186612f6a565b841515606084015282810360808401526132458185612f6a565b98975050505050505050565b61ffff841681526040602082015260006115b0604083018486612f41565b61ffff8716815260c06020820152600061328c60c0830188612f6a565b828103604084015261329e8188612f6a565b6001600160a01b0387811660608601528616608085015283810360a085015290506132c98185612f6a565b9998505050505050505050565b61ffff851681526080602082015260006132f36080830186612f6a565b6001600160401b038516604084015282810360608401526133148185612f6a565b979650505050505050565b600061ffff808816835280871660208401525084604083015260806060830152613314608083018486612f41565b604051601f8201601f191681016001600160401b0381118282101715613375576133756134e2565b604052919050565b60006001600160401b03821115613396576133966134e2565b5060051b60200190565b60006001600160401b038211156133b9576133b96134e2565b50601f01601f191660200190565b600082198211156133da576133da6134a0565b500190565b6000826133ee576133ee6134b6565b500490565b600082821015613405576134056134a0565b500390565b60005b8381101561342557818101518382015260200161340d565b83811115610fcb5750506000910152565b600181811c9082168061344a57607f821691505b6020821081141561346b57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613485576134856134a0565b5060010190565b60008261349b5761349b6134b6565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146114f657600080fd5b6001600160e01b0319811681146114f657600080fd5b61ffff811681146114f657600080fd5b6001600160401b03811681146114f657600080fdfea2646970667358221220a6c7f77cccc90c390c67a24ef8bee85caf2f641175884e9615286873b8c89d6964736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62
-----Decoded View---------------
Arg [0] : _lzEndpoint (address): 0x3c2269811836af69497E5F486A85D7316753cf62
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62
Deployed ByteCode Sourcemap
55305:1958:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19732:730;;;;;;;;;;-1:-1:-1;19732:730:0;;;;;:::i;:::-;;:::i;:::-;;55553:228;;;;;;;;;;-1:-1:-1;55553:228:0;;;;;:::i;:::-;;:::i;:::-;;;18217:14:1;;18210:22;18192:41;;18180:2;18165:18;55553:228:0;;;;;;;;43731:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21818:123::-;;;;;;;;;;-1:-1:-1;21818:123:0;;;;;:::i;:::-;;:::i;45290:221::-;;;;;;;;;;-1:-1:-1;45290:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;17147:32:1;;;17129:51;;17117:2;17102:18;45290:221:0;16983:203:1;44813:411:0;;;;;;;;;;-1:-1:-1;44813:411:0;;;;;:::i;:::-;;:::i;27044:425::-;;;;;;;;;;-1:-1:-1;27044:425:0;;;;;:::i;:::-;;:::i;:::-;;;;33246:25:1;;;33302:2;33287:18;;33280:34;;;;33219:18;27044:425:0;33072:248:1;21949:129:0;;;;;;;;;;-1:-1:-1;21949:129:0;;;;;:::i;:::-;;:::i;46040:339::-;;;;;;;;;;-1:-1:-1;46040:339:0;;;;;:::i;:::-;;:::i;56547:123::-;;;;;;;;;;-1:-1:-1;56547:123:0;;;;;:::i;:::-;;:::i;55377:31::-;;;;;;;;;;;;;;;;;;;18390:25:1;;;18378:2;18363:18;55377:31:0;18244:177:1;22634:250:0;;;;;;;;;;-1:-1:-1;22634:250:0;;;;;:::i;:::-;;:::i;46450:185::-;;;;;;;;;;-1:-1:-1;46450:185:0;;;;;:::i;:::-;;:::i;22086:178::-;;;;;;;;;;-1:-1:-1;22086:178:0;;;;;:::i;:::-;;:::i;23435:85::-;;;;;;;;;;-1:-1:-1;23435:85:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43425:239;;;;;;;;;;-1:-1:-1;43425:239:0;;;;;:::i;:::-;;:::i;24217:342::-;;;;;;;;;;-1:-1:-1;24217:342:0;;;;;:::i;:::-;;:::i;43155:208::-;;;;;;;;;;-1:-1:-1;43155:208:0;;;;;:::i;:::-;;:::i;10573:103::-;;;;;;;;;;;;;:::i;19502:51::-;;;;;;;;;;-1:-1:-1;19502:51:0;;;;;:::i;:::-;;:::i;9922:87::-;;;;;;;;;;-1:-1:-1;9968:7:0;9995:6;-1:-1:-1;;;;;9995:6:0;9922:87;;43900:104;;;;;;;;;;;;;:::i;45583:155::-;;;;;;;;;;-1:-1:-1;45583:155:0;;;;;:::i;:::-;;:::i;19447:46::-;;;;;;;;;;;;;;;46706:328;;;;;;;;;;-1:-1:-1;46706:328:0;;;;;:::i;:::-;;:::i;56732:228::-;;;;;;;;;;-1:-1:-1;56732:228:0;;;;;:::i;:::-;;:::i;21606:204::-;;;;;;;;;;-1:-1:-1;21606:204:0;;;;;:::i;:::-;;:::i;55415:27::-;;;;;;;;;;;;;:::i;24745:681::-;;;;;;:::i;:::-;;:::i;27477:335::-;;;;;;:::i;:::-;;:::i;45809:164::-;;;;;;;;;;-1:-1:-1;45809:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;45930:25:0;;;45906:4;45930:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45809:164;22318:216;;;;;;;;;;-1:-1:-1;22318:216:0;;;;;:::i;:::-;;:::i;10831:201::-;;;;;;;;;;-1:-1:-1;10831:201:0;;;;;:::i;:::-;;:::i;21333:211::-;;;;;;;;;;-1:-1:-1;21333:211:0;;;;;:::i;:::-;;:::i;56968:292::-;;;;;;;;;;-1:-1:-1;56968:292:0;;;;;:::i;:::-;;:::i;19732:730::-;8720:10;19968;-1:-1:-1;;;;;19944:35:0;;19936:78;;;;-1:-1:-1;;;19936:78:0;;27604:2:1;19936:78:0;;;27586:21:1;27643:2;27623:18;;;27616:30;27682:32;27662:18;;;27655:60;27732:18;;19936:78:0;;;;;;;;;20056:32;;;20027:26;20056:32;;;:19;:32;;;;;20027:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20262:13;:20;20240:11;:18;:42;:96;;;;;20322:13;20312:24;;;;;;20296:11;20286:22;;;;;;:50;20240:96;20232:147;;;;-1:-1:-1;;;20232:147:0;;28783:2:1;20232:147:0;;;28765:21:1;28822:2;28802:18;;;28795:30;28861:34;28841:18;;;28834:62;-1:-1:-1;;;28912:18:1;;;28905:36;28958:19;;20232:147:0;28581:402:1;20232:147:0;20392:62;20411:11;20424;20437:6;20445:8;20392:18;:62::i;:::-;19859:603;19732:730;;;;:::o;55553:228::-;55668:4;-1:-1:-1;;;;;;55692:41:0;;;;:81;;;55737:36;55761:11;55737:23;:36::i;:::-;55685:88;55553:228;-1:-1:-1;;55553:228:0:o;43731:100::-;43785:13;43818:5;43811:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43731:100;:::o;21818:123::-;9968:7;9995:6;-1:-1:-1;;;;;9995:6:0;8720:10;10142:23;10134:68;;;;-1:-1:-1;;;10134:68:0;;;;;;;:::i;:::-;21898:35:::1;::::0;-1:-1:-1;;;21898:35:0;;29162:6:1;29150:19;;21898:35:0::1;::::0;::::1;29132:38:1::0;21898:10:0::1;-1:-1:-1::0;;;;;21898:25:0::1;::::0;::::1;::::0;29105:18:1;;21898:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;45290:221:::0;45366:7;48633:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48633:16:0;45386:73;;;;-1:-1:-1;;;45386:73:0;;25308:2:1;45386:73:0;;;25290:21:1;25347:2;25327:18;;;25320:30;25386:34;25366:18;;;25359:62;-1:-1:-1;;;25437:18:1;;;25430:42;25489:19;;45386:73:0;25106:408:1;45386:73:0;-1:-1:-1;45479:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45479:24:0;;45290:221::o;44813:411::-;44894:13;44910:23;44925:7;44910:14;:23::i;:::-;44894:39;;44958:5;-1:-1:-1;;;;;44952:11:0;:2;-1:-1:-1;;;;;44952:11:0;;;44944:57;;;;-1:-1:-1;;;44944:57:0;;27202:2:1;44944:57:0;;;27184:21:1;27241:2;27221:18;;;27214:30;27280:34;27260:18;;;27253:62;-1:-1:-1;;;27331:18:1;;;27324:31;27372:19;;44944:57:0;27000:397:1;44944:57:0;8720:10;-1:-1:-1;;;;;45036:21:0;;;;:62;;-1:-1:-1;45061:37:0;45078:5;8720:10;45809:164;:::i;45061:37::-;45014:168;;;;-1:-1:-1;;;45014:168:0;;23347:2:1;45014:168:0;;;23329:21:1;23386:2;23366:18;;;23359:30;23425:34;23405:18;;;23398:62;23496:26;23476:18;;;23469:54;23540:19;;45014:168:0;23145:420:1;45014:168:0;45195:21;45204:2;45208:7;45195:8;:21::i;:::-;44883:341;44813:411;;:::o;27044:425::-;27222:14;27238:11;27302:20;27336:10;27348:9;27325:33;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;27325:33:0;;;;;;;;;;-1:-1:-1;;;27376:85:0;;27325:33;-1:-1:-1;;;;;;27376:10:0;:23;;;;:85;;27400:11;;27421:4;;27325:33;;27437:7;;27446:14;;27376:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27369:92;;;;;27044:425;;;;;;;;:::o;21949:129::-;9968:7;9995:6;-1:-1:-1;;;;;9995:6:0;8720:10;10142:23;10134:68;;;;-1:-1:-1;;;10134:68:0;;;;;;;:::i;:::-;22032:38:::1;::::0;-1:-1:-1;;;22032:38:0;;29162:6:1;29150:19;;22032:38:0::1;::::0;::::1;29132::1::0;22032:10:0::1;-1:-1:-1::0;;;;;22032:28:0::1;::::0;::::1;::::0;29105:18:1;;22032:38:0::1;28988:188:1::0;46040:339:0;46235:41;8720:10;46268:7;46235:18;:41::i;:::-;46227:103;;;;-1:-1:-1;;;46227:103:0;;;;;;;:::i;:::-;46343:28;46353:4;46359:2;46363:7;46343:9;:28::i;56547:123::-;9968:7;9995:6;-1:-1:-1;;;;;9995:6:0;8720:10;10142:23;10134:68;;;;-1:-1:-1;;;10134:68:0;;;;;;;:::i;:::-;56632:30;;::::1;::::0;:13:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;:::-;;56547:123:::0;:::o;22634:250::-;22776:32;;;22730:4;22776:32;;;:19;:32;;;;;22747:61;;22730:4;;22776:32;22747:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22864:11;;22854:22;;;;;;;:::i;:::-;;;;;;;;22836:13;22826:24;;;;;;:50;22819:57;;;22634:250;;;;;:::o;46450:185::-;46588:39;46605:4;46611:2;46615:7;46588:39;;;;;;;;;;;;:16;:39::i;22086:178::-;9968:7;9995:6;-1:-1:-1;;;;;9995:6:0;8720:10;10142:23;10134:68;;;;-1:-1:-1;;;10134:68:0;;;;;;;:::i;:::-;22201:55:::1;::::0;-1:-1:-1;;;22201:55:0;;-1:-1:-1;;;;;22201:10:0::1;:29;::::0;::::1;::::0;:55:::1;::::0;22231:11;;22244;;;;22201:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22086:178:::0;;;:::o;43425:239::-;43497:7;43533:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43533:16:0;43568:19;43560:73;;;;-1:-1:-1;;;43560:73:0;;24183:2:1;43560:73:0;;;24165:21:1;24222:2;24202:18;;;24195:30;24261:34;24241:18;;;24234:62;-1:-1:-1;;;24312:18:1;;;24305:39;24361:19;;43560:73:0;23981:405:1;24217:342:0;8720:10;24427:4;24403:29;24395:80;;;;-1:-1:-1;;;24395:80:0;;19764:2:1;24395:80:0;;;19746:21:1;19803:2;19783:18;;;19776:30;19842:34;19822:18;;;19815:62;-1:-1:-1;;;19893:18:1;;;19886:36;19939:19;;24395:80:0;19562:402:1;24395:80:0;24486:65;24508:11;24521;24534:6;24542:8;24486:21;:65::i;:::-;24217:342;;;;:::o;43155:208::-;43227:7;-1:-1:-1;;;;;43255:19:0;;43247:74;;;;-1:-1:-1;;;43247:74:0;;23772:2:1;43247:74:0;;;23754:21:1;23811:2;23791:18;;;23784:30;23850:34;23830:18;;;23823:62;-1:-1:-1;;;23901:18:1;;;23894:40;23951:19;;43247:74:0;23570:406:1;43247:74:0;-1:-1:-1;;;;;;43339:16:0;;;;;:9;:16;;;;;;;43155:208::o;10573:103::-;9968:7;9995:6;-1:-1:-1;;;;;9995:6:0;8720:10;10142:23;10134:68;;;;-1:-1:-1;;;10134:68:0;;;;;;;:::i;:::-;10638:30:::1;10665:1;10638:18;:30::i;:::-;10573:103::o:0;19502:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43900:104::-;43956:13;43989:7;43982:14;;;;;:::i;45583:155::-;45678:52;8720:10;45711:8;45721;45678:18;:52::i;46706:328::-;46881:41;8720:10;46914:7;46881:18;:41::i;:::-;46873:103;;;;-1:-1:-1;;;46873:103:0;;;;;;;:::i;:::-;46987:39;47001:4;47007:2;47011:7;47020:5;46987:13;:39::i;56732:228::-;56834:13;56909;56924:26;56941:8;56924:16;:26::i;:::-;56892:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56865:87;;56732:228;;;:::o;21606:204::-;9968:7;9995:6;-1:-1:-1;;;;;9995:6:0;8720:10;10142:23;10134:68;;;;-1:-1:-1;;;10134:68:0;;;;;;;:::i;:::-;21740:62:::1;::::0;-1:-1:-1;;;21740:62:0;;-1:-1:-1;;;;;21740:10:0::1;:20;::::0;::::1;::::0;:62:::1;::::0;21761:8;;21771;;21781:11;;21794:7;;;;21740:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21606:204:::0;;;;;:::o;55415:27::-;;;;;;;:::i;24745:681::-;24952:27;;;24930:19;24952:27;;;:14;:27;;;;;;:40;;;;24980:11;;24952:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24952:48:0;;;;;;;;;;;;-1:-1:-1;24952:48:0;25011:73;;;;-1:-1:-1;;;25011:73:0;;21354:2:1;25011:73:0;;;21336:21:1;21393:2;21373:18;;;21366:30;21432:34;21412:18;;;21405:62;-1:-1:-1;;;21483:18:1;;;21476:33;21526:19;;25011:73:0;21152:399:1;25011:73:0;25103:19;;;;;;:34;;25095:80;;;;-1:-1:-1;;;25095:80:0;;28381:2:1;25095:80:0;;;28363:21:1;28420:2;28400:18;;;28393:30;28459:34;28439:18;;;28432:62;-1:-1:-1;;;28510:18:1;;;28503:31;28551:19;;25095:80:0;28179:397:1;25095:80:0;25223:27;;;25282:1;25223:27;;;:14;:27;;;;;;:40;;;;25251:11;;25223:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25223:48:0;;;;;;;;;;:61;25353:65;25375:11;25388;25223:48;25409:8;25353:21;:65::i;27477:335::-;27699:105;27705:10;27717:11;27730:10;27742:9;27753:14;27769:18;27789:14;27699:5;:105::i;:::-;27477:335;;;;;;:::o;22318:216::-;9968:7;9995:6;-1:-1:-1;;;;;9995:6:0;8720:10;10142:23;10134:68;;;;-1:-1:-1;;;10134:68:0;;;;;;;:::i;:::-;22422:32:::1;::::0;::::1;;::::0;;;:19:::1;:32;::::0;;;;:46:::1;::::0;22457:11;;22422:46:::1;:::i;:::-;;22484:42;22501:11;22514;;22484:42;;;;;;;;:::i;:::-;;;;;;;;22318:216:::0;;;:::o;10831:201::-;9968:7;9995:6;-1:-1:-1;;;;;9995:6:0;8720:10;10142:23;10134:68;;;;-1:-1:-1;;;10134:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10920:22:0;::::1;10912:73;;;::::0;-1:-1:-1;;;10912:73:0;;20590:2:1;10912:73:0::1;::::0;::::1;20572:21:1::0;20629:2;20609:18;;;20602:30;20668:34;20648:18;;;20641:62;-1:-1:-1;;;20719:18:1;;;20712:36;20765:19;;10912:73:0::1;20388:402:1::0;10912:73:0::1;10996:28;11015:8;10996:18;:28::i;:::-;10831:201:::0;:::o;21333:211::-;21468:68;;-1:-1:-1;;;21468:68:0;;32163:6:1;32196:15;;;21468:68:0;;;32178:34:1;32248:15;;32228:18;;;32221:43;21517:4:0;32280:18:1;;;32273:60;32349:18;;;32342:34;;;21436:12:0;;21468:10;-1:-1:-1;;;;;21468:20:0;;;;32125:19:1;;21468:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21468:68:0;;;;;;;;;;;;:::i;:::-;21461:75;;21333:211;;;;;;;:::o;56968:292::-;9968:7;9995:6;-1:-1:-1;;;;;9995:6:0;8720:10;10142:23;10134:68;;;;-1:-1:-1;;;10134:68:0;;;;;;;:::i;:::-;57067:6:::1;57063:190;;;57090:24;57100:3;57105:8;57090:24;;:9;:24::i;57063:190::-;57164:17;::::0;::::1;48609:4:::0;48633:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48633:16:0;57156:55:::1;;;::::0;-1:-1:-1;;;57156:55:0;;26848:2:1;57156:55:0::1;::::0;::::1;26830:21:1::0;26887:2;26867:18;;;26860:30;26926:27;26906:18;;;26899:55;26971:18;;57156:55:0::1;26646:349:1::0;57156:55:0::1;57226:15;57232:8;57226:15;;:5;:15::i;23681:528::-:0;23878:69;;-1:-1:-1;;;23878:69:0;;:4;;:25;;:69;;23904:11;;23917;;23930:6;;23938:8;;23878:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23874:328;;24104:8;24094:19;;;;;;24043:14;:27;24058:11;24043:27;;;;;;;;;;;;;;;24071:11;24043:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24043:48:0;;;;;;;;;:70;;;;24133:57;;;;24147:11;;24160;;24084:6;;24181:8;;24133:57;:::i;:::-;;;;;;;;23874:328;;42786:305;42888:4;-1:-1:-1;;;;;;42925:40:0;;-1:-1:-1;;;42925:40:0;;:105;;-1:-1:-1;;;;;;;42982:48:0;;-1:-1:-1;;;42982:48:0;42925:105;:158;;;;43047:36;43071:11;43047:23;:36::i;52526:174::-;52601:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;52601:29:0;-1:-1:-1;;;;;52601:29:0;;;;;;;;:24;;52655:23;52601:24;52655:14;:23::i;:::-;-1:-1:-1;;;;;52646:46:0;;;;;;;;;;;52526:174;;:::o;48838:348::-;48931:4;48633:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48633:16:0;48948:73;;;;-1:-1:-1;;;48948:73:0;;22517:2:1;48948:73:0;;;22499:21:1;22556:2;22536:18;;;22529:30;22595:34;22575:18;;;22568:62;-1:-1:-1;;;22646:18:1;;;22639:42;22698:19;;48948:73:0;22315:408:1;48948:73:0;49032:13;49048:23;49063:7;49048:14;:23::i;:::-;49032:39;;49101:5;-1:-1:-1;;;;;49090:16:0;:7;-1:-1:-1;;;;;49090:16:0;;:51;;;;49134:7;-1:-1:-1;;;;;49110:31:0;:20;49122:7;49110:11;:20::i;:::-;-1:-1:-1;;;;;49110:31:0;;49090:51;:87;;;-1:-1:-1;;;;;;45930:25:0;;;45906:4;45930:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;49145:32;45809:164;51830:578;51989:4;-1:-1:-1;;;;;51962:31:0;:23;51977:7;51962:14;:23::i;:::-;-1:-1:-1;;;;;51962:31:0;;51954:85;;;;-1:-1:-1;;;51954:85:0;;26438:2:1;51954:85:0;;;26420:21:1;26477:2;26457:18;;;26450:30;26516:34;26496:18;;;26489:62;-1:-1:-1;;;26567:18:1;;;26560:39;26616:19;;51954:85:0;26236:405:1;51954:85:0;-1:-1:-1;;;;;52058:16:0;;52050:65;;;;-1:-1:-1;;;52050:65:0;;21758:2:1;52050:65:0;;;21740:21:1;21797:2;21777:18;;;21770:30;21836:34;21816:18;;;21809:62;-1:-1:-1;;;21887:18:1;;;21880:34;21931:19;;52050:65:0;21556:400:1;52050:65:0;52232:29;52249:1;52253:7;52232:8;:29::i;:::-;-1:-1:-1;;;;;52274:15:0;;;;;;:9;:15;;;;;:20;;52293:1;;52274:15;:20;;52293:1;;52274:20;:::i;:::-;;;;-1:-1:-1;;;;;;;52305:13:0;;;;;;:9;:13;;;;;:18;;52322:1;;52305:13;:18;;52322:1;;52305:18;:::i;:::-;;;;-1:-1:-1;;52334:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;52334:21:0;-1:-1:-1;;;;;52334:21:0;;;;;;;;;52373:27;;52334:16;;52373:27;;;;;;;51830:578;;;:::o;28429:560::-;28624:27;28653:24;28692:8;28681:39;;;;;;;;;;;;:::i;:::-;28822:2;28802:23;;28796:30;28623:97;;-1:-1:-1;28623:97:0;-1:-1:-1;28849:43:0;28859:11;28796:30;28623:97;28849:9;:43::i;:::-;28953:9;-1:-1:-1;;;;;28910:71:0;28940:11;28910:71;;;;;;:::i;:::-;;;;;;;;28927:11;28910:71;;;28964:8;28974:6;28910:71;;;;;;;:::i;:::-;;;;;;;;28570:419;;;28429:560;;;;:::o;11192:191::-;11266:16;11285:6;;-1:-1:-1;;;;;11302:17:0;;;-1:-1:-1;;;;;;11302:17:0;;;;;;11335:40;;11285:6;;;;;;;11335:40;;11266:16;11335:40;11255:128;11192:191;:::o;52842:315::-;52997:8;-1:-1:-1;;;;;52988:17:0;:5;-1:-1:-1;;;;;52988:17:0;;;52980:55;;;;-1:-1:-1;;;52980:55:0;;22163:2:1;52980:55:0;;;22145:21:1;22202:2;22182:18;;;22175:30;22241:27;22221:18;;;22214:55;22286:18;;52980:55:0;21961:349:1;52980:55:0;-1:-1:-1;;;;;53046:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;53046:46:0;;;;;;;;;;53108:41;;18192::1;;;53108::0;;18165:18:1;53108:41:0;;;;;;;52842:315;;;:::o;47916:::-;48073:28;48083:4;48089:2;48093:7;48073:9;:28::i;:::-;48120:48;48143:4;48149:2;48153:7;48162:5;48120:22;:48::i;:::-;48112:111;;;;-1:-1:-1;;;48112:111:0;;;;;;;:::i;39629:723::-;39685:13;39906:10;39902:53;;-1:-1:-1;;39933:10:0;;;;;;;;;;;;-1:-1:-1;;;39933:10:0;;;;;39629:723::o;39902:53::-;39980:5;39965:12;40021:78;40028:9;;40021:78;;40054:8;;;;:::i;:::-;;-1:-1:-1;40077:10:0;;-1:-1:-1;40085:2:0;40077:10;;:::i;:::-;;;40021:78;;;40109:19;40141:6;-1:-1:-1;;;;;40131:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40131:17:0;;40109:39;;40159:154;40166:10;;40159:154;;40193:11;40203:1;40193:11;;:::i;:::-;;-1:-1:-1;40262:10:0;40270:2;40262:5;:10;:::i;:::-;40249:24;;:2;:24;:::i;:::-;40236:39;;40219:6;40226;40219:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;40219:56:0;;;;;;;;-1:-1:-1;40290:11:0;40299:2;40290:11;;:::i;:::-;;;40159:154;;27820:601;28039:53;28050:5;28057:11;28070:10;28082:9;28039:10;:53::i;:::-;28105:20;28139:10;28151:9;28128:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28105:56;;28172:81;28180:11;28193:7;28202:14;28218:18;28238:14;28172:7;:81::i;:::-;28281:55;;-1:-1:-1;;;28281:55:0;;29383:6:1;29371:19;;28281:55:0;;;29353:38:1;28330:4:0;29407:18:1;;;29400:60;28266:12:0;;28281:10;-1:-1:-1;;;;;28281:27:0;;;;29326:18:1;;28281:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28266:70;;28384:10;28352:61;;;;;;:::i;:::-;;;;;;;;28371:11;28352:61;;28364:5;-1:-1:-1;;;;;28352:61:0;;28396:9;28407:5;28352:61;;;;;;;:::i;:::-;;;;;;;;28028:393;;27820:601;;;;;;;:::o;49528:110::-;49604:26;49614:2;49618:7;49604:26;;;;;;;;;;;;:9;:26::i;51133:360::-;51193:13;51209:23;51224:7;51209:14;:23::i;:::-;51193:39;;51334:29;51351:1;51355:7;51334:8;:29::i;:::-;-1:-1:-1;;;;;51376:16:0;;;;;;:9;:16;;;;;:21;;51396:1;;51376:16;:21;;51396:1;;51376:21;:::i;:::-;;;;-1:-1:-1;;51415:16:0;;;;:7;:16;;;;;;51408:23;;-1:-1:-1;;;;;;51408:23:0;;;51449:36;51423:7;;51415:16;-1:-1:-1;;;;;51449:36:0;;;;;51415:16;;51449:36;51182:311;51133:360;:::o;26817:219::-;26919:4;-1:-1:-1;;;;;;26943:45:0;;-1:-1:-1;;;26943:45:0;;:85;;-1:-1:-1;;;;;;;;;;26413:40:0;;;26992:36;26304:157;56137:329;56253:8;56248:211;56271:9;:16;56267:1;:20;;;56248:211;;;56314:21;56322:9;56332:1;56322:12;;;;;;;;;;:::i;:::-;;;;;;;56314:21;;48609:4;48633:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48633:16:0;:30;;;48544:127;56314:21;56313:22;56305:60;;;;-1:-1:-1;;;56305:60:0;;24593:2:1;56305:60:0;;;24575:21:1;24632:2;24612:18;;;24605:30;24671:27;24651:18;;;24644:55;24716:18;;56305:60:0;24391:349:1;56305:60:0;56380:35;56390:10;56402:9;56412:1;56402:12;;;;;;;;;;:::i;:::-;;;;;;;56380:35;;:9;:35::i;:::-;56442:3;;56248:211;;53722:799;53877:4;-1:-1:-1;;;;;53898:13:0;;32248:20;32296:8;53894:620;;53934:72;;-1:-1:-1;;;53934:72:0;;-1:-1:-1;;;;;53934:36:0;;;;;:72;;8720:10;;53985:4;;53991:7;;54000:5;;53934:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53934:72:0;;;;;;;;-1:-1:-1;;53934:72:0;;;;;;;;;;;;:::i;:::-;;;53930:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54176:13:0;;54172:272;;54219:60;;-1:-1:-1;;;54219:60:0;;;;;;;:::i;54172:272::-;54394:6;54388:13;54379:6;54375:2;54371:15;54364:38;53930:529;-1:-1:-1;;;;;;54057:51:0;-1:-1:-1;;;54057:51:0;;-1:-1:-1;54050:58:0;;53894:620;-1:-1:-1;54498:4:0;54491:11;;55789:340;55915:8;55910:212;55933:9;:16;55929:1;:20;;;55910:212;;;56007:5;-1:-1:-1;;;;;55975:37:0;:28;55990:9;56000:1;55990:12;;;;;;;;;;:::i;:::-;;;;;;;55975:28;;:14;:28::i;:::-;-1:-1:-1;;;;;55975:37:0;;55967:77;;;;-1:-1:-1;;;55967:77:0;;25721:2:1;55967:77:0;;;25703:21:1;25760:2;25740:18;;;25733:30;25799:29;25779:18;;;25772:57;25846:18;;55967:77:0;25519:351:1;55967:77:0;56059:19;56065:9;56075:1;56065:12;;;;;;;;;;:::i;:::-;;;;;;;56059:19;;:5;:19::i;:::-;56105:3;;55910:212;;20751:477;20957:32;;;20928:26;20957:32;;;:19;:32;;;;;20928:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21008:13;:20;21032:1;21008:25;;21000:86;;;;-1:-1:-1;;;21000:86:0;;22930:2:1;21000:86:0;;;22912:21:1;22969:2;22949:18;;;22942:30;23008:34;22988:18;;;22981:62;-1:-1:-1;;;23059:18:1;;;23052:46;23115:19;;21000:86:0;22728:412:1;21000:86:0;21097:123;;-1:-1:-1;;;21097:123:0;;-1:-1:-1;;;;;21097:10:0;:15;;;;21120:9;;21097:123;;21131:11;;21144:13;;21159:8;;21169:14;;21185:18;;21205:14;;21097:123;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20917:311;20751:477;;;;;:::o;49865:321::-;49995:18;50001:2;50005:7;49995:5;:18::i;:::-;50046:54;50077:1;50081:2;50085:7;50094:5;50046:22;:54::i;:::-;50024:154;;;;-1:-1:-1;;;50024:154:0;;;;;;;:::i;50522:382::-;-1:-1:-1;;;;;50602:16:0;;50594:61;;;;-1:-1:-1;;;50594:61:0;;24947:2:1;50594:61:0;;;24929:21:1;;;24966:18;;;24959:30;25025:34;25005:18;;;24998:62;25077:18;;50594:61:0;24745:356:1;50594:61:0;48609:4;48633:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48633:16:0;:30;50666:58;;;;-1:-1:-1;;;50666:58:0;;20997:2:1;50666:58:0;;;20979:21:1;21036:2;21016:18;;;21009:30;21075;21055:18;;;21048:58;21123:18;;50666:58:0;20795:352:1;50666:58:0;-1:-1:-1;;;;;50795:13:0;;;;;;:9;:13;;;;;:18;;50812:1;;50795:13;:18;;50812:1;;50795:18;:::i;:::-;;;;-1:-1:-1;;50824:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;50824:21:0;-1:-1:-1;;;;;50824:21:0;;;;;;;;50863:33;;50824:16;;;50863:33;;50824:16;;50863:33;50522:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:336:1;78:5;107:52;123:35;151:6;123:35;:::i;:::-;107:52;:::i;:::-;98:61;;182:6;175:5;168:21;222:3;213:6;208:3;204:16;201:25;198:45;;;239:1;236;229:12;198:45;288:6;283:3;276:4;269:5;265:16;252:43;342:1;335:4;326:6;319:5;315:18;311:29;304:40;14:336;;;;;:::o;355:745::-;408:5;461:3;454:4;446:6;442:17;438:27;428:55;;479:1;476;469:12;428:55;515:6;502:20;541:4;565:59;581:42;620:2;581:42;:::i;565:59::-;646:3;670:2;665:3;658:15;698:2;693:3;689:12;682:19;;733:2;725:6;721:15;785:3;780:2;774;771:1;767:10;759:6;755:23;751:32;748:41;745:61;;;802:1;799;792:12;745:61;824:1;834:237;848:2;845:1;842:9;834:237;;;919:3;906:17;936:30;960:5;936:30;:::i;:::-;979:18;;1017:12;;;;1049;;;;866:1;859:9;834:237;;;-1:-1:-1;1089:5:1;;355:745;-1:-1:-1;;;;;;;355:745:1:o;1105:160::-;1170:20;;1226:13;;1219:21;1209:32;;1199:60;;1255:1;1252;1245:12;1199:60;1105:160;;;:::o;1270:347::-;1321:8;1331:6;1385:3;1378:4;1370:6;1366:17;1362:27;1352:55;;1403:1;1400;1393:12;1352:55;-1:-1:-1;1426:20:1;;-1:-1:-1;;;;;1458:30:1;;1455:50;;;1501:1;1498;1491:12;1455:50;1538:4;1530:6;1526:17;1514:29;;1590:3;1583:4;1574:6;1566;1562:19;1558:30;1555:39;1552:59;;;1607:1;1604;1597:12;1552:59;1270:347;;;;;:::o;1622:220::-;1664:5;1717:3;1710:4;1702:6;1698:17;1694:27;1684:55;;1735:1;1732;1725:12;1684:55;1757:79;1832:3;1823:6;1810:20;1803:4;1795:6;1791:17;1757:79;:::i;:::-;1748:88;1622:220;-1:-1:-1;;;1622:220:1:o;1847:428::-;1900:5;1953:3;1946:4;1938:6;1934:17;1930:27;1920:55;;1971:1;1968;1961:12;1920:55;2000:6;1994:13;2031:48;2047:31;2075:2;2047:31;:::i;2031:48::-;2104:2;2095:7;2088:19;2150:3;2143:4;2138:2;2130:6;2126:15;2122:26;2119:35;2116:55;;;2167:1;2164;2157:12;2116:55;2180:64;2241:2;2234:4;2225:7;2221:18;2214:4;2206:6;2202:17;2180:64;:::i;2280:247::-;2339:6;2392:2;2380:9;2371:7;2367:23;2363:32;2360:52;;;2408:1;2405;2398:12;2360:52;2447:9;2434:23;2466:31;2491:5;2466:31;:::i;2532:388::-;2600:6;2608;2661:2;2649:9;2640:7;2636:23;2632:32;2629:52;;;2677:1;2674;2667:12;2629:52;2716:9;2703:23;2735:31;2760:5;2735:31;:::i;:::-;2785:5;-1:-1:-1;2842:2:1;2827:18;;2814:32;2855:33;2814:32;2855:33;:::i;:::-;2907:7;2897:17;;;2532:388;;;;;:::o;2925:456::-;3002:6;3010;3018;3071:2;3059:9;3050:7;3046:23;3042:32;3039:52;;;3087:1;3084;3077:12;3039:52;3126:9;3113:23;3145:31;3170:5;3145:31;:::i;:::-;3195:5;-1:-1:-1;3252:2:1;3237:18;;3224:32;3265:33;3224:32;3265:33;:::i;:::-;2925:456;;3317:7;;-1:-1:-1;;;3371:2:1;3356:18;;;;3343:32;;2925:456::o;3386:665::-;3481:6;3489;3497;3505;3558:3;3546:9;3537:7;3533:23;3529:33;3526:53;;;3575:1;3572;3565:12;3526:53;3614:9;3601:23;3633:31;3658:5;3633:31;:::i;:::-;3683:5;-1:-1:-1;3740:2:1;3725:18;;3712:32;3753:33;3712:32;3753:33;:::i;:::-;3805:7;-1:-1:-1;3859:2:1;3844:18;;3831:32;;-1:-1:-1;3914:2:1;3899:18;;3886:32;-1:-1:-1;;;;;3930:30:1;;3927:50;;;3973:1;3970;3963:12;3927:50;3996:49;4037:7;4028:6;4017:9;4013:22;3996:49;:::i;:::-;3986:59;;;3386:665;;;;;;;:::o;4056:315::-;4121:6;4129;4182:2;4170:9;4161:7;4157:23;4153:32;4150:52;;;4198:1;4195;4188:12;4150:52;4237:9;4224:23;4256:31;4281:5;4256:31;:::i;:::-;4306:5;-1:-1:-1;4330:35:1;4361:2;4346:18;;4330:35;:::i;:::-;4320:45;;4056:315;;;;;:::o;4376:454::-;4449:6;4457;4465;4518:2;4506:9;4497:7;4493:23;4489:32;4486:52;;;4534:1;4531;4524:12;4486:52;4573:9;4560:23;4592:31;4617:5;4592:31;:::i;:::-;4642:5;-1:-1:-1;4699:2:1;4684:18;;4671:32;4712;4671;4712;:::i;:::-;4763:7;-1:-1:-1;4789:35:1;4820:2;4805:18;;4789:35;:::i;:::-;4779:45;;4376:454;;;;;:::o;4835:315::-;4903:6;4911;4964:2;4952:9;4943:7;4939:23;4935:32;4932:52;;;4980:1;4977;4970:12;4932:52;5019:9;5006:23;5038:31;5063:5;5038:31;:::i;:::-;5088:5;5140:2;5125:18;;;;5112:32;;-1:-1:-1;;;4835:315:1:o;5155:245::-;5213:6;5266:2;5254:9;5245:7;5241:23;5237:32;5234:52;;;5282:1;5279;5272:12;5234:52;5321:9;5308:23;5340:30;5364:5;5340:30;:::i;5405:249::-;5474:6;5527:2;5515:9;5506:7;5502:23;5498:32;5495:52;;;5543:1;5540;5533:12;5495:52;5575:9;5569:16;5594:30;5618:5;5594:30;:::i;5659:335::-;5738:6;5791:2;5779:9;5770:7;5766:23;5762:32;5759:52;;;5807:1;5804;5797:12;5759:52;5840:9;5834:16;-1:-1:-1;;;;;5865:6:1;5862:30;5859:50;;;5905:1;5902;5895:12;5859:50;5928:60;5980:7;5971:6;5960:9;5956:22;5928:60;:::i;5999:1187::-;6111:6;6119;6172:2;6160:9;6151:7;6147:23;6143:32;6140:52;;;6188:1;6185;6178:12;6140:52;6221:9;6215:16;-1:-1:-1;;;;;6291:2:1;6283:6;6280:14;6277:34;;;6307:1;6304;6297:12;6277:34;6330:60;6382:7;6373:6;6362:9;6358:22;6330:60;:::i;:::-;6320:70;;6409:2;6399:12;;6457:2;6446:9;6442:18;6436:25;6486:2;6476:8;6473:16;6470:36;;;6502:1;6499;6492:12;6470:36;6525:24;;;-1:-1:-1;6580:4:1;6572:13;;6568:27;-1:-1:-1;6558:55:1;;6609:1;6606;6599:12;6558:55;6638:2;6632:9;6661:59;6677:42;6716:2;6677:42;:::i;6661:59::-;6742:3;6766:2;6761:3;6754:15;6794:2;6789:3;6785:12;6778:19;;6825:2;6821;6817:11;6873:7;6868:2;6862;6859:1;6855:10;6851:2;6847:19;6843:28;6840:41;6837:61;;;6894:1;6891;6884:12;6837:61;6916:1;6907:10;;6926:230;6940:2;6937:1;6934:9;6926:230;;;7004:3;6998:10;7021:30;7045:5;7021:30;:::i;:::-;7064:18;;6958:1;6951:9;;;;;7102:12;;;;7134;;6926:230;;;6930:3;7175:5;7165:15;;;;;;;5999:1187;;;;;:::o;7191:450::-;7260:6;7313:2;7301:9;7292:7;7288:23;7284:32;7281:52;;;7329:1;7326;7319:12;7281:52;7369:9;7356:23;-1:-1:-1;;;;;7394:6:1;7391:30;7388:50;;;7434:1;7431;7424:12;7388:50;7457:22;;7510:4;7502:13;;7498:27;-1:-1:-1;7488:55:1;;7539:1;7536;7529:12;7488:55;7562:73;7627:7;7622:2;7609:16;7604:2;7600;7596:11;7562:73;:::i;7646:245::-;7704:6;7757:2;7745:9;7736:7;7732:23;7728:32;7725:52;;;7773:1;7770;7763:12;7725:52;7812:9;7799:23;7831:30;7855:5;7831:30;:::i;7896:542::-;7974:6;7982;7990;8043:2;8031:9;8022:7;8018:23;8014:32;8011:52;;;8059:1;8056;8049:12;8011:52;8098:9;8085:23;8117:30;8141:5;8117:30;:::i;:::-;8166:5;-1:-1:-1;8222:2:1;8207:18;;8194:32;-1:-1:-1;;;;;8238:30:1;;8235:50;;;8281:1;8278;8271:12;8235:50;8320:58;8370:7;8361:6;8350:9;8346:22;8320:58;:::i;:::-;7896:542;;8397:8;;-1:-1:-1;8294:84:1;;-1:-1:-1;;;;7896:542:1:o;8443:1189::-;8596:6;8604;8612;8620;8628;8636;8689:3;8677:9;8668:7;8664:23;8660:33;8657:53;;;8706:1;8703;8696:12;8657:53;8745:9;8732:23;8764:30;8788:5;8764:30;:::i;:::-;8813:5;-1:-1:-1;8869:2:1;8854:18;;8841:32;-1:-1:-1;;;;;8922:14:1;;;8919:34;;;8949:1;8946;8939:12;8919:34;8972:49;9013:7;9004:6;8993:9;8989:22;8972:49;:::i;:::-;8962:59;;9074:2;9063:9;9059:18;9046:32;9030:48;;9103:2;9093:8;9090:16;9087:36;;;9119:1;9116;9109:12;9087:36;9142:62;9196:7;9185:8;9174:9;9170:24;9142:62;:::i;:::-;9132:72;;9256:2;9245:9;9241:18;9228:32;9213:47;;9269:33;9294:7;9269:33;:::i;:::-;9321:7;;-1:-1:-1;9380:3:1;9365:19;;9352:33;;9394;9352;9394;:::i;:::-;9446:7;;-1:-1:-1;9506:3:1;9491:19;;9478:33;;9523:16;;;9520:36;;;9552:1;9549;9542:12;9520:36;;9575:51;9618:7;9607:8;9596:9;9592:24;9575:51;:::i;:::-;9565:61;;;8443:1189;;;;;;;;:::o;9637:966::-;9770:6;9778;9786;9794;9802;9855:3;9843:9;9834:7;9830:23;9826:33;9823:53;;;9872:1;9869;9862:12;9823:53;9911:9;9898:23;9930:30;9954:5;9930:30;:::i;:::-;9979:5;-1:-1:-1;10035:2:1;10020:18;;10007:32;-1:-1:-1;;;;;10088:14:1;;;10085:34;;;10115:1;10112;10105:12;10085:34;10138:49;10179:7;10170:6;10159:9;10155:22;10138:49;:::i;:::-;10128:59;;10240:2;10229:9;10225:18;10212:32;10196:48;;10269:2;10259:8;10256:16;10253:36;;;10285:1;10282;10275:12;10253:36;10308:62;10362:7;10351:8;10340:9;10336:24;10308:62;:::i;:::-;10298:72;;10389:35;10420:2;10409:9;10405:18;10389:35;:::i;:::-;10379:45;;10477:3;10466:9;10462:19;10449:33;10433:49;;10507:2;10497:8;10494:16;10491:36;;;10523:1;10520;10513:12;10491:36;;10546:51;10589:7;10578:8;10567:9;10563:24;10546:51;:::i;:::-;10536:61;;;9637:966;;;;;;;;:::o;10608:592::-;10692:6;10700;10708;10761:2;10749:9;10740:7;10736:23;10732:32;10729:52;;;10777:1;10774;10767:12;10729:52;10816:9;10803:23;10835:30;10859:5;10835:30;:::i;:::-;10884:5;-1:-1:-1;10940:2:1;10925:18;;10912:32;-1:-1:-1;;;;;10956:30:1;;10953:50;;;10999:1;10996;10989:12;10953:50;11022:49;11063:7;11054:6;11043:9;11039:22;11022:49;:::i;:::-;11012:59;;;11123:2;11112:9;11108:18;11095:32;11136;11160:7;11136:32;:::i;:::-;11187:7;11177:17;;;10608:592;;;;;:::o;11205:812::-;11307:6;11315;11323;11331;11384:3;11372:9;11363:7;11359:23;11355:33;11352:53;;;11401:1;11398;11391:12;11352:53;11440:9;11427:23;11459:30;11483:5;11459:30;:::i;:::-;11508:5;-1:-1:-1;11564:2:1;11549:18;;11536:32;-1:-1:-1;;;;;11617:14:1;;;11614:34;;;11644:1;11641;11634:12;11614:34;11667:49;11708:7;11699:6;11688:9;11684:22;11667:49;:::i;:::-;11657:59;;11768:2;11757:9;11753:18;11740:32;11725:47;;11781:32;11805:7;11781:32;:::i;:::-;11832:7;;-1:-1:-1;11892:2:1;11877:18;;11864:32;;11908:16;;;11905:36;;;11937:1;11934;11927:12;11905:36;;11960:51;12003:7;11992:8;11981:9;11977:24;11960:51;:::i;12022:594::-;12106:6;12114;12122;12130;12183:3;12171:9;12162:7;12158:23;12154:33;12151:53;;;12200:1;12197;12190:12;12151:53;12239:9;12226:23;12258:30;12282:5;12258:30;:::i;:::-;12307:5;-1:-1:-1;12364:2:1;12349:18;;12336:32;12377;12336;12377;:::i;:::-;12428:7;-1:-1:-1;12487:2:1;12472:18;;12459:32;12500:33;12459:32;12500:33;:::i;:::-;12022:594;;;;-1:-1:-1;12552:7:1;;12606:2;12591:18;12578:32;;-1:-1:-1;;12022:594:1:o;12621:750::-;12716:6;12724;12732;12740;12748;12801:3;12789:9;12780:7;12776:23;12772:33;12769:53;;;12818:1;12815;12808:12;12769:53;12857:9;12844:23;12876:30;12900:5;12876:30;:::i;:::-;12925:5;-1:-1:-1;12982:2:1;12967:18;;12954:32;12995;12954;12995;:::i;:::-;13046:7;-1:-1:-1;13100:2:1;13085:18;;13072:32;;-1:-1:-1;13155:2:1;13140:18;;13127:32;-1:-1:-1;;;;;13171:30:1;;13168:50;;;13214:1;13211;13204:12;13168:50;13253:58;13303:7;13294:6;13283:9;13279:22;13253:58;:::i;:::-;12621:750;;;;-1:-1:-1;12621:750:1;;-1:-1:-1;13330:8:1;;13227:84;12621:750;-1:-1:-1;;;12621:750:1:o;13376:180::-;13435:6;13488:2;13476:9;13467:7;13463:23;13459:32;13456:52;;;13504:1;13501;13494:12;13456:52;-1:-1:-1;13527:23:1;;13376:180;-1:-1:-1;13376:180:1:o;13561:245::-;13640:6;13648;13701:2;13689:9;13680:7;13676:23;13672:32;13669:52;;;13717:1;13714;13707:12;13669:52;-1:-1:-1;;13740:16:1;;13796:2;13781:18;;;13775:25;13740:16;;13775:25;;-1:-1:-1;13561:245:1:o;13811:249::-;13880:6;13933:2;13921:9;13912:7;13908:23;13904:32;13901:52;;;13949:1;13946;13939:12;13901:52;13981:9;13975:16;14000:30;14024:5;14000:30;:::i;14065:447::-;14117:3;14155:5;14149:12;14182:6;14177:3;14170:19;14208:4;14237:2;14232:3;14228:12;14221:19;;14274:2;14267:5;14263:14;14295:1;14305:182;14319:6;14316:1;14313:13;14305:182;;;14384:13;;14399:6;14380:26;14368:39;;14427:12;;;;14462:15;;;;14341:1;14334:9;14305:182;;;-1:-1:-1;14503:3:1;;14065:447;-1:-1:-1;;;;;14065:447:1:o;14517:266::-;14605:6;14600:3;14593:19;14657:6;14650:5;14643:4;14638:3;14634:14;14621:43;-1:-1:-1;14709:1:1;14684:16;;;14702:4;14680:27;;;14673:38;;;;14765:2;14744:15;;;-1:-1:-1;;14740:29:1;14731:39;;;14727:50;;14517:266::o;14788:268::-;14840:3;14878:5;14872:12;14905:6;14900:3;14893:19;14921:63;14977:6;14970:4;14965:3;14961:14;14954:4;14947:5;14943:16;14921:63;:::i;:::-;15038:2;15017:15;-1:-1:-1;;15013:29:1;15004:39;;;;15045:4;15000:50;;14788:268;-1:-1:-1;;14788:268:1:o;15061:184::-;15102:3;15140:5;15134:12;15155:52;15200:6;15195:3;15188:4;15181:5;15177:16;15155:52;:::i;:::-;15223:16;;;;;15061:184;-1:-1:-1;;15061:184:1:o;15250:271::-;15433:6;15425;15420:3;15407:33;15389:3;15459:16;;15484:13;;;15459:16;15250:271;-1:-1:-1;15250:271:1:o;15526:274::-;15655:3;15693:6;15687:13;15709:53;15755:6;15750:3;15743:4;15735:6;15731:17;15709:53;:::i;:::-;15778:16;;;;;15526:274;-1:-1:-1;;15526:274:1:o;15805:1173::-;15981:3;16010:1;16043:6;16037:13;16073:3;16095:1;16123:9;16119:2;16115:18;16105:28;;16183:2;16172:9;16168:18;16205;16195:61;;16249:4;16241:6;16237:17;16227:27;;16195:61;16275:2;16323;16315:6;16312:14;16292:18;16289:38;16286:165;;;-1:-1:-1;;;16350:33:1;;16406:4;16403:1;16396:15;16436:4;16357:3;16424:17;16286:165;16467:18;16494:104;;;;16612:1;16607:320;;;;16460:467;;16494:104;-1:-1:-1;;16527:24:1;;16515:37;;16572:16;;;;-1:-1:-1;16494:104:1;;16607:320;34056:1;34049:14;;;34093:4;34080:18;;16702:1;16716:165;16730:6;16727:1;16724:13;16716:165;;;16808:14;;16795:11;;;16788:35;16851:16;;;;16745:10;;16716:165;;;16720:3;;16910:6;16905:3;16901:16;16894:23;;16460:467;;;;;;;16943:29;16968:3;16960:6;16943:29;:::i;:::-;16936:36;15805:1173;-1:-1:-1;;;;;15805:1173:1:o;17191:499::-;-1:-1:-1;;;;;17460:15:1;;;17442:34;;17512:15;;17507:2;17492:18;;17485:43;17559:2;17544:18;;17537:34;;;17607:3;17602:2;17587:18;;17580:31;;;17385:4;;17628:56;;17664:19;;17656:6;17628:56;:::i;:::-;17620:64;17191:499;-1:-1:-1;;;;;;17191:499:1:o;17695:352::-;17898:2;17887:9;17880:21;17861:4;17918:55;17969:2;17958:9;17954:18;17946:6;17918:55;:::i;:::-;17910:63;;-1:-1:-1;;;;;18013:6:1;18009:31;18004:2;17993:9;17989:18;17982:59;17695:352;;;;;:::o;18426:228::-;18573:2;18562:9;18555:21;18536:4;18593:55;18644:2;18633:9;18629:18;18621:6;18593:55;:::i;18659:429::-;18882:2;18871:9;18864:21;18845:4;18908:55;18959:2;18948:9;18944:18;18936:6;18908:55;:::i;:::-;19011:9;19003:6;18999:22;18994:2;18983:9;18979:18;18972:50;19039:43;19075:6;19067;19039:43;:::i;19969:414::-;20171:2;20153:21;;;20210:2;20190:18;;;20183:30;20249:34;20244:2;20229:18;;20222:62;-1:-1:-1;;;20315:2:1;20300:18;;20293:48;20373:3;20358:19;;19969:414::o;25875:356::-;26077:2;26059:21;;;26096:18;;;26089:30;26155:34;26150:2;26135:18;;26128:62;26222:2;26207:18;;25875:356::o;27761:413::-;27963:2;27945:21;;;28002:2;27982:18;;;27975:30;28041:34;28036:2;28021:18;;28014:62;-1:-1:-1;;;28107:2:1;28092:18;;28085:47;28164:3;28149:19;;27761:413::o;29471:662::-;29752:6;29740:19;;29722:38;;-1:-1:-1;;;;;29796:32:1;;29791:2;29776:18;;29769:60;29816:3;29860:2;29845:18;;29838:31;;;-1:-1:-1;;29892:56:1;;29928:19;;29920:6;29892:56;:::i;:::-;29998:6;29991:14;29984:22;29979:2;29968:9;29964:18;29957:50;30056:9;30048:6;30044:22;30038:3;30027:9;30023:19;30016:51;30084:43;30120:6;30112;30084:43;:::i;:::-;30076:51;29471:662;-1:-1:-1;;;;;;;;29471:662:1:o;30138:326::-;30333:6;30325;30321:19;30310:9;30303:38;30377:2;30372;30361:9;30357:18;30350:30;30284:4;30397:61;30454:2;30443:9;30439:18;30431:6;30423;30397:61;:::i;30469:870::-;30818:6;30810;30806:19;30795:9;30788:38;30862:3;30857:2;30846:9;30842:18;30835:31;30769:4;30889:56;30940:3;30929:9;30925:19;30917:6;30889:56;:::i;:::-;30993:9;30985:6;30981:22;30976:2;30965:9;30961:18;30954:50;31027:43;31063:6;31055;31027:43;:::i;:::-;-1:-1:-1;;;;;31144:15:1;;;31139:2;31124:18;;31117:43;31197:15;;31191:3;31176:19;;31169:44;31250:22;;;31097:3;31229:19;;31222:51;31013:57;-1:-1:-1;31290:43:1;31013:57;31318:6;31290:43;:::i;:::-;31282:51;30469:870;-1:-1:-1;;;;;;;;;30469:870:1:o;31344:577::-;31601:6;31593;31589:19;31578:9;31571:38;31645:3;31640:2;31629:9;31625:18;31618:31;31552:4;31672:56;31723:3;31712:9;31708:19;31700:6;31672:56;:::i;:::-;-1:-1:-1;;;;;31768:6:1;31764:31;31759:2;31748:9;31744:18;31737:59;31844:9;31836:6;31832:22;31827:2;31816:9;31812:18;31805:50;31872:43;31908:6;31900;31872:43;:::i;:::-;31864:51;31344:577;-1:-1:-1;;;;;;;31344:577:1:o;32387:498::-;32587:4;32616:6;32661:2;32653:6;32649:15;32638:9;32631:34;32713:2;32705:6;32701:15;32696:2;32685:9;32681:18;32674:43;;32753:6;32748:2;32737:9;32733:18;32726:34;32796:3;32791:2;32780:9;32776:18;32769:31;32817:62;32874:3;32863:9;32859:19;32851:6;32843;32817:62;:::i;33325:275::-;33396:2;33390:9;33461:2;33442:13;;-1:-1:-1;;33438:27:1;33426:40;;-1:-1:-1;;;;;33481:34:1;;33517:22;;;33478:62;33475:88;;;33543:18;;:::i;:::-;33579:2;33572:22;33325:275;;-1:-1:-1;33325:275:1:o;33605:182::-;33664:4;-1:-1:-1;;;;;33689:6:1;33686:30;33683:56;;;33719:18;;:::i;:::-;-1:-1:-1;33764:1:1;33760:14;33776:4;33756:25;;33605:182::o;33792:186::-;33840:4;-1:-1:-1;;;;;33865:6:1;33862:30;33859:56;;;33895:18;;:::i;:::-;-1:-1:-1;33961:2:1;33940:15;-1:-1:-1;;33936:29:1;33967:4;33932:40;;33792:186::o;34109:128::-;34149:3;34180:1;34176:6;34173:1;34170:13;34167:39;;;34186:18;;:::i;:::-;-1:-1:-1;34222:9:1;;34109:128::o;34242:120::-;34282:1;34308;34298:35;;34313:18;;:::i;:::-;-1:-1:-1;34347:9:1;;34242:120::o;34367:125::-;34407:4;34435:1;34432;34429:8;34426:34;;;34440:18;;:::i;:::-;-1:-1:-1;34477:9:1;;34367:125::o;34497:258::-;34569:1;34579:113;34593:6;34590:1;34587:13;34579:113;;;34669:11;;;34663:18;34650:11;;;34643:39;34615:2;34608:10;34579:113;;;34710:6;34707:1;34704:13;34701:48;;;-1:-1:-1;;34745:1:1;34727:16;;34720:27;34497:258::o;34760:380::-;34839:1;34835:12;;;;34882;;;34903:61;;34957:4;34949:6;34945:17;34935:27;;34903:61;35010:2;35002:6;34999:14;34979:18;34976:38;34973:161;;;35056:10;35051:3;35047:20;35044:1;35037:31;35091:4;35088:1;35081:15;35119:4;35116:1;35109:15;34973:161;;34760:380;;;:::o;35145:135::-;35184:3;-1:-1:-1;;35205:17:1;;35202:43;;;35225:18;;:::i;:::-;-1:-1:-1;35272:1:1;35261:13;;35145:135::o;35285:112::-;35317:1;35343;35333:35;;35348:18;;:::i;:::-;-1:-1:-1;35382:9:1;;35285:112::o;35402:127::-;35463:10;35458:3;35454:20;35451:1;35444:31;35494:4;35491:1;35484:15;35518:4;35515:1;35508:15;35534:127;35595:10;35590:3;35586:20;35583:1;35576:31;35626:4;35623:1;35616:15;35650:4;35647:1;35640:15;35666:127;35727:10;35722:3;35718:20;35715:1;35708:31;35758:4;35755:1;35748:15;35782:4;35779:1;35772:15;35798:127;35859:10;35854:3;35850:20;35847:1;35840:31;35890:4;35887:1;35880:15;35914:4;35911:1;35904:15;35930:131;-1:-1:-1;;;;;36005:31:1;;35995:42;;35985:70;;36051:1;36048;36041:12;36066:131;-1:-1:-1;;;;;;36140:32:1;;36130:43;;36120:71;;36187:1;36184;36177:12;36202:117;36287:6;36280:5;36276:18;36269:5;36266:29;36256:57;;36309:1;36306;36299:12;36324:129;-1:-1:-1;;;;;36402:5:1;36398:30;36391:5;36388:41;36378:69;;36443:1;36440;36433:12
Metadata Hash
ipfs://a6c7f77cccc90c390c67a24ef8bee85caf2f641175884e9615286873b8c89d69