ERC-721
Overview
Max Total Supply
252 SMSC
Holders
97
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 SMSCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
SMSC
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-02 */ /** *Submitted for verification at Etherscan.io on 2022-02-25 */ // SPDX-License-Identifier: GPL-3.0 // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: SMSC.sol pragma solidity ^0.8.4; error TransferToNonERC721ReceiverImplementer(); contract Ownable { address public owner; constructor() { owner = msg.sender; } // ownership modifier onlyOwner() { require(msg.sender == owner, "ERROR! Access denied"); _; } function transferOwnership(address _newOwner) external onlyOwner { owner = _newOwner; } function renounceOwnership() external onlyOwner { owner = address(0); } } contract RewardDistributor is Ownable { address[] public investors; uint256[] public investorAmounts; receive() payable external { } function setInvestors(address[] calldata _investors) external onlyOwner { delete investors; investors = _investors; } function setInvestorAmounts(uint32[] calldata _amounts) external onlyOwner { require( _amounts.length == investors.length, "The numbers doesn't match with the investors" ); uint256 sum = 0; for (uint256 i = 0; i < _amounts.length; i++) { sum += _amounts[i]; } require(sum == 10000, "The sum of the numbers must be 10,000"); delete investorAmounts; investorAmounts = _amounts; } function withdraw() public onlyOwner { require(investorAmounts.length > 0, "No investors specified"); uint256 bal = address(this).balance; for (uint256 i = 0; i < investors.length; i++) { if (investorAmounts[i] > 0) { Address.sendValue(payable(investors[i]), bal * investorAmounts[i] / 10000); } } } } contract Whitelist is Ownable { using ECDSA for bytes32; address signer; function setSigner(address _signer) external onlyOwner { signer = _signer; } function getRecoverAddress(bytes calldata signature) internal view returns (address) { bytes32 hash = keccak256(abi.encodePacked(this, msg.sender)); hash = keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", hash) ); return hash.recover(signature); } modifier onlyWhitelist(bytes calldata signature) { require(signer != address(0), "Signer Not Set"); require(getRecoverAddress(signature) == signer, "Not Whitelisted"); _; } } contract RandomGender { uint256 private hash = 0; constructor() { hash = block.timestamp % 1000000; } function _gender(uint256 tokenId) internal returns (uint256) { hash = uint256( keccak256( abi.encodePacked(tokenId, hash, block.timestamp % 3600) ) ) % 1000000; if (hash < 250000) return 2; // female return 1; // male } } contract SMSC is IERC721, RewardDistributor, Whitelist, RandomGender { using Address for address; using Strings for uint256; string private _name = "Slow Mo Sloth Club"; string private _symbol = "SMSC"; address public externalMinter; address public mutator; uint16 public presaleSupply = 3000; uint16 public pubsaleSupply = 3000; uint16 public presaledAmount; uint16 public pubsaledAmount; uint16 public totalSupply; uint8 public limitPerAddress = 3; bool public revealed; bool public presaleOpen; bool public pubsaleOpen; uint256 public cost = 0.2 ether; uint256 public costPresale = 0.15 ether; uint256 internal _currentIndex = 1; mapping(address => uint256) private _balances; mapping(uint256 => address) public ownership; mapping(uint256 => uint256) public tokenGender; mapping(address => uint256) public addressMints; mapping(uint => uint) private tokenBirth; mapping(uint => bool) public tokenLocked; string public baseURI; string public norevealedURI; string public baseExtension; mapping(uint256 => address) private _tokenApprovals; mapping(address => mapping(address => bool)) private _operatorApprovals; modifier onlyMinter() { require(msg.sender == externalMinter, "ERROR! You must be the minter"); _; } modifier onlyTokenOwner(uint256 tokenId) { require( ownerOf(tokenId) == msg.sender, "ERROR! You must be the token owner" ); _; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( msg.sender == owner || isApprovedForAll(owner, msg.sender), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } function getApproved(uint256 tokenId) public view virtual override returns (address) { require( tokenId <= totalSupply, "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(msg.sender, operator, approved); } function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ownerOf(tokenId), to, tokenId); } 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); } function setExternalMinter(address _minter) external onlyOwner { externalMinter = _minter; } function setMutator(address _mutator) external onlyOwner { mutator = _mutator; } function setCost(uint256 _cost) external onlyOwner { cost = _cost; } function setCostPresale(uint256 _cost) external onlyOwner { costPresale = _cost; } function setLimitPerAddress(uint8 _limit) external onlyOwner { limitPerAddress = _limit; } function startPresale() external onlyOwner { presaleOpen = true; } function endPresale() external onlyOwner { presaleOpen = false; } function startPubsale() external onlyOwner { pubsaleOpen = true; } function endPubsale() external onlyOwner { pubsaleOpen = false; } function balanceOf(address owner) public view override returns (uint256) { return _balances[owner]; } function ownerOf(uint256 tokenId) public view override returns (address) { require(tokenId < _currentIndex, "Invalid token ID"); uint256 id = tokenId; while (id > 1 && ownership[id] == address(0)) { id -= 1; } return ownership[id]; } function tokenBirttime(uint tokenId) public view returns (uint) { require(tokenId < _currentIndex, "Invalid token ID"); uint256 id = tokenId; while (id > 1 && tokenBirth[id] == 0) { id -= 1; } return tokenBirth[id]; } function mintPresale(uint256 amount, bytes calldata signature) external payable onlyWhitelist(signature) { require( addressMints[msg.sender] + amount <= limitPerAddress, "You cannot mint more than 3" ); require(presaledAmount + amount <= presaleSupply, "Invalid amount"); require(presaleOpen, "Presale is not open"); uint256 totalCost = costPresale * amount; require(msg.value >= totalCost, "Insufficient payment"); if (msg.value > totalCost) { payable(msg.sender).transfer(msg.value - totalCost); } for (uint256 i = 0; i < amount; i += 1) { tokenGender[_currentIndex + i] = _gender(_currentIndex + i); emit Transfer(address(0), msg.sender, _currentIndex + i); } _mint(msg.sender, amount); presaledAmount += uint8(amount); totalSupply += uint8(amount); } function mint(uint256 amount) external payable { require( addressMints[msg.sender] + amount <= limitPerAddress, "You cannot mint more than 3" ); require(pubsaledAmount + amount <= pubsaleSupply, "Invalid amount"); require(pubsaleOpen, "Pubsale is not open"); uint256 totalCost = cost * amount; require(msg.value >= totalCost, "Insufficient payment"); if (msg.value > totalCost) { payable(msg.sender).transfer(msg.value - totalCost); } for (uint256 i = 0; i < amount; i += 1) { tokenGender[_currentIndex + i] = _gender(_currentIndex + i); emit Transfer(address(0), msg.sender, _currentIndex + i); } _mint(msg.sender, amount); pubsaledAmount += uint8(amount); totalSupply += uint8(amount); } function mintFromOutside(address to, uint gender) external payable onlyMinter { tokenGender[_currentIndex] = gender; emit Transfer(address(0), to, _currentIndex); _mint(to, 1); totalSupply += 1; } function mutate(uint tokenId, uint gender) external { require(msg.sender == mutator, "Access denied"); tokenGender[tokenId] = gender; } function lockForStake(uint tokenId, bool locked) external { require(msg.sender == mutator, "Access denied"); tokenLocked[tokenId] = locked; } function _mint(address to, uint256 amount) internal { _balances[to] += amount; addressMints[to] += amount; ownership[_currentIndex] = to; tokenBirth[_currentIndex] = block.timestamp; _currentIndex += amount; } function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); if (!_checkOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } function _transfer( address from, address to, uint256 tokenId ) internal { address preOwner = ownerOf(tokenId); require(!tokenLocked[tokenId], "The token is locked"); require(from != to, "You cannot transfer to yourself"); require(from == preOwner, "Invalid from address"); require( msg.sender == preOwner || isApprovedForAll(preOwner, msg.sender) || getApproved(tokenId) == msg.sender, "Access denied" ); _approve(address(0), tokenId); ownership[tokenId] = to; uint256 nextId = tokenId + 1; if (ownerOf(nextId) != address(0)) { ownership[nextId] = preOwner; } _balances[preOwner] -= 1; _balances[to] += 1; emit Transfer(from, to, tokenId); } function tokenURI(uint256 tokenId) public view returns (string memory) { require( tokenId <= totalSupply, "ERC721Metadata: URI query for nonexistent token" ); if (revealed == false) { return norevealedURI; } string memory currentBaseURI = baseURI; return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), baseExtension ) ) : ""; } function setBaseURI(string memory _baseURI) external onlyOwner { baseURI = _baseURI; } function setUnrevealedURI(string memory _uri) external onlyOwner { norevealedURI = _uri; } function setBaseExtension(string memory _ext) external onlyOwner { baseExtension = _ext; } function setPresaleSupply(uint16 _amount) external onlyOwner { presaleSupply = _amount; } function setPubsaleSupply(uint16 _amount) external onlyOwner { pubsaleSupply = _amount; } function reveal() external onlyOwner { revealed = true; } function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC165).interfaceId; } function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( msg.sender, from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endPubsale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"externalMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"investorAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"investors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitPerAddress","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"locked","type":"bool"}],"name":"lockForStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"gender","type":"uint256"}],"name":"mintFromOutside","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"gender","type":"uint256"}],"name":"mutate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mutator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"norevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownership","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaledAmount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pubsaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pubsaleSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pubsaledAmount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_ext","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCostPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"setExternalMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32[]","name":"_amounts","type":"uint32[]"}],"name":"setInvestorAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_investors","type":"address[]"}],"name":"setInvestors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_limit","type":"uint8"}],"name":"setLimitPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mutator","type":"address"}],"name":"setMutator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"setPresaleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"setPubsaleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPubsale","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":"tokenBirttime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenGender","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
600060045560c0604052601260808190527129b637bb9026b79029b637ba341021b63ab160711b60a09081526200003a9160059190620000f5565b5060408051808201909152600480825263534d534360e01b60209092019182526200006891600691620000f5565b506008805463ffffffff60a01b60ff60f01b0119167e030000000000000bb80bb800000000000000000000000000000000000000001790556702c68af0bb140000600a55670214e8348c4f0000600b556001600c55348015620000ca57600080fd5b50600080546001600160a01b03191633179055620000ec620f424042620001d8565b600455620001f9565b82805462000103906200019b565b90600052602060002090601f01602090048101928262000127576000855562000172565b82601f106200014257805160ff191683800117855562000172565b8280016001018555821562000172579182015b828111156200017257825182559160200191906001019062000155565b506200018092915062000184565b5090565b5b8082111562000180576000815560010162000185565b600181811c90821680620001b057607f821691505b60208210811415620001d257634e487b7160e01b600052602260045260246000fd5b50919050565b600082620001f457634e487b7160e01b81526012600452602481fd5b500690565b6137a380620002096000396000f3fe6080604052600436106103bc5760003560e01c806370a08231116101f2578063b88d4fde1161010d578063dc88a1cf116100a0578063e985e9c51161006f578063e985e9c514610b33578063f2fde38b14610b53578063fb017fde14610b73578063fe2c7fee14610b9357600080fd5b8063dc88a1cf14610aa6578063e0dc850d14610ac6578063e0edeef614610ae6578063e5dfd04914610b0657600080fd5b8063c87b56dd116100dc578063c87b56dd14610a26578063cfbe735514610a46578063da3ef23f14610a66578063dc607f6814610a8657600080fd5b8063b88d4fde146109c4578063bee6348a146109e4578063c6682862146109fe578063c75f35c814610a1357600080fd5b8063a0f45b6911610185578063a475b5dd11610154578063a475b5dd14610958578063aafb60021461096d578063b3a196e91461098d578063b584b78d146109af57600080fd5b8063a0f45b69146108cb578063a205ea4214610901578063a22cb46514610923578063a43be57b1461094357600080fd5b806395d89b41116101c157806395d89b4114610857578063964c33b51461086c5780639c3e73c314610899578063a0712d68146108b857600080fd5b806370a08231146107d7578063715018a61461080d5780638611244c146108225780638da5cb5b1461083757600080fd5b80633ccfd60b116102e257806351830227116102755780636833a228116102445780636833a228146107625780636c0360eb146107825780636c19e783146107975780636c2e370b146107b757600080fd5b806351830227146106df57806355f804b3146107005780635f94c650146107205780636352211e1461074257600080fd5b8063447400bf116102b1578063447400bf1461064f57806344a0d68a1461066f57806346694b7d1461068f578063478368c3146106bf57600080fd5b80633ccfd60b146105d85780633feb5f2b146105ed57806342842e0e1461060d57806342ca1d091461062d57600080fd5b80630d06ed721161035a57806324a9ac041161032957806324a9ac0414610545578063286720c5146105655780632a484ad41461058557806332032817146105b857600080fd5b80630d06ed72146104c757806313faede6146104da57806318160ddd146104f057806323b872dd1461052557600080fd5b806306fdde031161039657806306fdde0314610429578063081812fc1461044b578063095ea7b3146104835780630c57ff69146104a357600080fd5b806301ffc9a7146103c857806303a17969146103fd57806304c98b2b1461041457600080fd5b366103c357005b600080fd5b3480156103d457600080fd5b506103e86103e336600461328d565b610bb3565b60405190151581526020015b60405180910390f35b34801561040957600080fd5b50610412610c05565b005b34801561042057600080fd5b50610412610c45565b34801561043557600080fd5b5061043e610c7e565b6040516103f4919061356f565b34801561045757600080fd5b5061046b61046636600461332d565b610d10565b6040516001600160a01b0390911681526020016103f4565b34801561048f57600080fd5b5061041261049e366004613224565b610da1565b3480156104af57600080fd5b506104b9600b5481565b6040519081526020016103f4565b6104126104d5366004613367565b610eb7565b3480156104e657600080fd5b506104b9600a5481565b3480156104fc57600080fd5b5060085461051290600160e01b900461ffff1681565b60405161ffff90911681526020016103f4565b34801561053157600080fd5b50610412610540366004613147565b611227565b34801561055157600080fd5b506104126105603660046130fb565b611232565b34801561057157600080fd5b506104b961058036600461332d565b61127e565b34801561059157600080fd5b506008546105a690600160f01b900460ff1681565b60405160ff90911681526020016103f4565b3480156105c457600080fd5b506104126105d336600461330b565b61129f565b3480156105e457600080fd5b506104126112eb565b3480156105f957600080fd5b5061046b61060836600461332d565b611440565b34801561061957600080fd5b50610412610628366004613147565b61146a565b34801561063957600080fd5b5060085461051290600160b01b900461ffff1681565b34801561065b57600080fd5b5061041261066a3660046133de565b611485565b34801561067b57600080fd5b5061041261068a36600461332d565b6114c1565b34801561069b57600080fd5b506103e86106aa36600461332d565b60126020526000908152604090205460ff1681565b3480156106cb57600080fd5b506104126106da366004613345565b6114f0565b3480156106eb57600080fd5b506008546103e890600160f81b900460ff1681565b34801561070c57600080fd5b5061041261071b3660046132c5565b61153a565b34801561072c57600080fd5b5060085461051290600160c01b900461ffff1681565b34801561074e57600080fd5b5061046b61075d36600461332d565b611577565b34801561076e57600080fd5b5061041261077d366004613423565b611619565b34801561078e57600080fd5b5061043e611663565b3480156107a357600080fd5b506104126107b23660046130fb565b6116f1565b3480156107c357600080fd5b506104126107d236600461332d565b61173d565b3480156107e357600080fd5b506104b96107f23660046130fb565b6001600160a01b03166000908152600d602052604090205490565b34801561081957600080fd5b5061041261176c565b34801561082e57600080fd5b506104126117a8565b34801561084357600080fd5b5060005461046b906001600160a01b031681565b34801561086357600080fd5b5061043e6117e3565b34801561087857600080fd5b506104b96108873660046130fb565b60106020526000908152604090205481565b3480156108a557600080fd5b506009546103e890610100900460ff1681565b6104126108c636600461332d565b6117f2565b3480156108d757600080fd5b5061046b6108e636600461332d565b600e602052600090815260409020546001600160a01b031681565b34801561090d57600080fd5b5060085461051290600160d01b900461ffff1681565b34801561092f57600080fd5b5061041261093e3660046131fb565b611ab3565b34801561094f57600080fd5b50610412611abe565b34801561096457600080fd5b50610412611af4565b34801561097957600080fd5b5060075461046b906001600160a01b031681565b34801561099957600080fd5b5060085461051290600160a01b900461ffff1681565b3480156109bb57600080fd5b5061043e611b35565b3480156109d057600080fd5b506104126109df366004613182565b611b42565b3480156109f057600080fd5b506009546103e89060ff1681565b348015610a0a57600080fd5b5061043e611b7c565b610412610a21366004613224565b611b89565b348015610a3257600080fd5b5061043e610a4136600461332d565b611c47565b348015610a5257600080fd5b50610412610a6136600461330b565b611e44565b348015610a7257600080fd5b50610412610a813660046132c5565b611e90565b348015610a9257600080fd5b506104b9610aa136600461332d565b611ecd565b348015610ab257600080fd5b50610412610ac13660046130fb565b611f5d565b348015610ad257600080fd5b50610412610ae136600461324d565b611fa9565b348015610af257600080fd5b5060085461046b906001600160a01b031681565b348015610b1257600080fd5b506104b9610b2136600461332d565b600f6020526000908152604090205481565b348015610b3f57600080fd5b506103e8610b4e366004613115565b612116565b348015610b5f57600080fd5b50610412610b6e3660046130fb565b612144565b348015610b7f57600080fd5b50610412610b8e36600461324d565b612190565b348015610b9f57600080fd5b50610412610bae3660046132c5565b6121d2565b60006001600160e01b031982166380ac58cd60e01b1480610be457506001600160e01b03198216635b5e139f60e01b145b80610bff57506001600160e01b031982166301ffc9a760e01b145b92915050565b6000546001600160a01b03163314610c385760405162461bcd60e51b8152600401610c2f90613582565b60405180910390fd5b6009805461ff0019169055565b6000546001600160a01b03163314610c6f5760405162461bcd60e51b8152600401610c2f90613582565b6009805460ff19166001179055565b606060058054610c8d9061368b565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb99061368b565b8015610d065780601f10610cdb57610100808354040283529160200191610d06565b820191906000526020600020905b815481529060010190602001808311610ce957829003601f168201915b5050505050905090565b600854600090600160e01b900461ffff16821115610d855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c2f565b506000908152601660205260409020546001600160a01b031690565b6000610dac82611577565b9050806001600160a01b0316836001600160a01b03161415610e1a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c2f565b336001600160a01b0382161480610e365750610e368133612116565b610ea85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c2f565b610eb2838361220f565b505050565b600354829082906001600160a01b0316610f045760405162461bcd60e51b815260206004820152600e60248201526d14da59db995c88139bdd0814d95d60921b6044820152606401610c2f565b6003546001600160a01b0316610f1a838361227d565b6001600160a01b031614610f625760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b6044820152606401610c2f565b60085433600090815260106020526040902054600160f01b90910460ff1690610f8c9087906135fd565b1115610fda5760405162461bcd60e51b815260206004820152601b60248201527f596f752063616e6e6f74206d696e74206d6f7265207468616e203300000000006044820152606401610c2f565b60085461ffff600160a01b8204811691610ffd918891600160c01b9004166135fd565b111561103c5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606401610c2f565b60095460ff166110845760405162461bcd60e51b8152602060048201526013602482015272283932b9b0b6329034b9903737ba1037b832b760691b6044820152606401610c2f565b600085600b546110949190613629565b9050803410156110dd5760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b6044820152606401610c2f565b8034111561111d57336108fc6110f38334613648565b6040518115909202916000818181858888f1935050505015801561111b573d6000803e3d6000fd5b505b60005b8681101561119c5761113e81600c5461113991906135fd565b61235b565b600f600083600c5461115091906135fd565b8152602081019190915260400160002055600c5461116f9082906135fd565b604051339060009060008051602061374e833981519152908290a46111956001826135fd565b9050611120565b506111a733876123cf565b8560ff16600860188282829054906101000a900461ffff166111c991906135d7565b92506101000a81548161ffff021916908361ffff1602179055508560ff166008601c8282829054906101000a900461ffff1661120591906135d7565b92506101000a81548161ffff021916908361ffff160217905550505050505050565b610eb283838361247f565b6000546001600160a01b0316331461125c5760405162461bcd60e51b8152600401610c2f90613582565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6002818154811061128e57600080fd5b600091825260209091200154905081565b6000546001600160a01b031633146112c95760405162461bcd60e51b8152600401610c2f90613582565b6008805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b6000546001600160a01b031633146113155760405162461bcd60e51b8152600401610c2f90613582565b60025461135d5760405162461bcd60e51b8152602060048201526016602482015275139bc81a5b9d995cdd1bdc9cc81cdc1958da599a595960521b6044820152606401610c2f565b4760005b60015481101561143c5760006002828154811061138e57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154111561142a5761142a600182815481106113c357634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b03166127106002848154811061140557634e487b7160e01b600052603260045260246000fd5b90600052602060002001548561141b9190613629565b6114259190613615565b6126fb565b80611434816136c6565b915050611361565b5050565b6001818154811061145057600080fd5b6000918252602090912001546001600160a01b0316905081565b610eb283838360405180602001604052806000815250611b42565b6008546001600160a01b031633146114af5760405162461bcd60e51b8152600401610c2f906135b0565b6000918252600f602052604090912055565b6000546001600160a01b031633146114eb5760405162461bcd60e51b8152600401610c2f90613582565b600a55565b6008546001600160a01b0316331461151a5760405162461bcd60e51b8152600401610c2f906135b0565b600091825260126020526040909120805460ff1916911515919091179055565b6000546001600160a01b031633146115645760405162461bcd60e51b8152600401610c2f90613582565b805161143c906013906020840190612ec9565b6000600c5482106115bd5760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081d1bdad95b88125160821b6044820152606401610c2f565b815b6001811180156115e457506000818152600e60205260409020546001600160a01b0316155b156115fb576115f4600182613648565b90506115bf565b6000908152600e60205260409020546001600160a01b031692915050565b6000546001600160a01b031633146116435760405162461bcd60e51b8152600401610c2f90613582565b6008805460ff909216600160f01b0260ff60f01b19909216919091179055565b601380546116709061368b565b80601f016020809104026020016040519081016040528092919081815260200182805461169c9061368b565b80156116e95780601f106116be576101008083540402835291602001916116e9565b820191906000526020600020905b8154815290600101906020018083116116cc57829003601f168201915b505050505081565b6000546001600160a01b0316331461171b5760405162461bcd60e51b8152600401610c2f90613582565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146117675760405162461bcd60e51b8152600401610c2f90613582565b600b55565b6000546001600160a01b031633146117965760405162461bcd60e51b8152600401610c2f90613582565b600080546001600160a01b0319169055565b6000546001600160a01b031633146117d25760405162461bcd60e51b8152600401610c2f90613582565b6009805461ff001916610100179055565b606060068054610c8d9061368b565b60085433600090815260106020526040902054600160f01b90910460ff169061181c9083906135fd565b111561186a5760405162461bcd60e51b815260206004820152601b60248201527f596f752063616e6e6f74206d696e74206d6f7265207468616e203300000000006044820152606401610c2f565b60085461ffff600160b01b820481169161188d918491600160d01b9004166135fd565b11156118cc5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606401610c2f565b600954610100900460ff166119195760405162461bcd60e51b8152602060048201526013602482015272283ab139b0b6329034b9903737ba1037b832b760691b6044820152606401610c2f565b600081600a546119299190613629565b9050803410156119725760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b6044820152606401610c2f565b803411156119b257336108fc6119888334613648565b6040518115909202916000818181858888f193505050501580156119b0573d6000803e3d6000fd5b505b60005b82811015611a2c576119ce81600c5461113991906135fd565b600f600083600c546119e091906135fd565b8152602081019190915260400160002055600c546119ff9082906135fd565b604051339060009060008051602061374e833981519152908290a4611a256001826135fd565b90506119b5565b50611a3733836123cf565b8160ff166008601a8282829054906101000a900461ffff16611a5991906135d7565b92506101000a81548161ffff021916908361ffff1602179055508160ff166008601c8282829054906101000a900461ffff16611a9591906135d7565b92506101000a81548161ffff021916908361ffff1602179055505050565b61143c338383612814565b6000546001600160a01b03163314611ae85760405162461bcd60e51b8152600401610c2f90613582565b6009805460ff19169055565b6000546001600160a01b03163314611b1e5760405162461bcd60e51b8152600401610c2f90613582565b600880546001600160f81b0316600160f81b179055565b601480546116709061368b565b611b4d84848461247f565b611b59848484846128e3565b611b76576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b601580546116709061368b565b6007546001600160a01b03163314611be35760405162461bcd60e51b815260206004820152601d60248201527f4552524f522120596f75206d75737420626520746865206d696e7465720000006044820152606401610c2f565b600c80546000908152600f6020526040808220849055915491516001600160a01b038516919060008051602061374e833981519152908290a4611c278260016123cf565b60016008601c8282829054906101000a900461ffff16611a9591906135d7565b600854606090600160e01b900461ffff16821115611cbf5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c2f565b600854600160f81b900460ff16611d625760148054611cdd9061368b565b80601f0160208091040260200160405190810160405280929190818152602001828054611d099061368b565b8015611d565780601f10611d2b57610100808354040283529160200191611d56565b820191906000526020600020905b815481529060010190602001808311611d3957829003601f168201915b50505050509050919050565b600060138054611d719061368b565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9d9061368b565b8015611dea5780601f10611dbf57610100808354040283529160200191611dea565b820191906000526020600020905b815481529060010190602001808311611dcd57829003601f168201915b505050505090506000815111611e0f5760405180602001604052806000815250611e3d565b80611e19846129f1565b6015604051602001611e2d93929190613470565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611e6e5760405162461bcd60e51b8152600401610c2f90613582565b6008805461ffff909216600160b01b0261ffff60b01b19909216919091179055565b6000546001600160a01b03163314611eba5760405162461bcd60e51b8152600401610c2f90613582565b805161143c906015906020840190612ec9565b6000600c548210611f135760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081d1bdad95b88125160821b6044820152606401610c2f565b815b600181118015611f315750600081815260116020526040902054155b15611f4857611f41600182613648565b9050611f15565b60009081526011602052604090205492915050565b6000546001600160a01b03163314611f875760405162461bcd60e51b8152600401610c2f90613582565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611fd35760405162461bcd60e51b8152600401610c2f90613582565b60015481146120395760405162461bcd60e51b815260206004820152602c60248201527f546865206e756d6265727320646f65736e2774206d617463682077697468207460448201526b686520696e766573746f727360a01b6064820152608401610c2f565b6000805b8281101561209e5783838281811061206557634e487b7160e01b600052603260045260246000fd5b905060200201602081019061207a91906133ff565b61208a9063ffffffff16836135fd565b915080612096816136c6565b91505061203d565b5080612710146120fe5760405162461bcd60e51b815260206004820152602560248201527f5468652073756d206f6620746865206e756d62657273206d75737420626520316044820152640302c3030360dc1b6064820152608401610c2f565b61210a60026000612f4d565b611b7660028484612f6b565b6001600160a01b03918216600090815260176020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b0316331461216e5760405162461bcd60e51b8152600401610c2f90613582565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146121ba5760405162461bcd60e51b8152600401610c2f90613582565b6121c660016000612f4d565b610eb260018383612fae565b6000546001600160a01b031633146121fc5760405162461bcd60e51b8152600401610c2f90613582565b805161143c906014906020840190612ec9565b600081815260166020526040902080546001600160a01b0319166001600160a01b038416908117909155819061224482611577565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6040516bffffffffffffffffffffffff1930606090811b8216602084015233901b166034820152600090819060480160408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c82018190529150605c0160405160208183030381529060405280519060200120905061235384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508593925050612b0b9050565b949350505050565b6000620f424082600454610e104261237391906136e1565b60408051602081019490945283019190915260608201526080016040516020818303038152906040528051906020012060001c6123b091906136e1565b60048190556203d09011156123c757506002919050565b506001919050565b6001600160a01b0382166000908152600d6020526040812080548392906123f79084906135fd565b90915550506001600160a01b038216600090815260106020526040812080548392906124249084906135fd565b9091555050600c80546000908152600e6020908152604080832080546001600160a01b0319166001600160a01b03881617905583548352601190915281204290558154839291906124769084906135fd565b90915550505050565b600061248a82611577565b60008381526012602052604090205490915060ff16156124e25760405162461bcd60e51b8152602060048201526013602482015272151a19481d1bdad95b881a5cc81b1bd8dad959606a1b6044820152606401610c2f565b826001600160a01b0316846001600160a01b031614156125445760405162461bcd60e51b815260206004820152601f60248201527f596f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610c2f565b806001600160a01b0316846001600160a01b03161461259c5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642066726f6d206164647265737360601b6044820152606401610c2f565b336001600160a01b03821614806125b857506125b88133612116565b806125d35750336125c883610d10565b6001600160a01b0316145b6125ef5760405162461bcd60e51b8152600401610c2f906135b0565b6125fa60008361220f565b6000828152600e6020526040812080546001600160a01b0319166001600160a01b03861617905561262c8360016135fd565b9050600061263982611577565b6001600160a01b03161461266f576000818152600e6020526040902080546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382166000908152600d60205260408120805460019290612698908490613648565b90915550506001600160a01b0384166000908152600d602052604081208054600192906126c69084906135fd565b909155505060405183906001600160a01b03808716919088169060008051602061374e83398151915290600090a45050505050565b8047101561274b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c2f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612798576040519150601f19603f3d011682016040523d82523d6000602084013e61279d565b606091505b5050905080610eb25760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c2f565b816001600160a01b0316836001600160a01b031614156128765760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c2f565b6001600160a01b03838116600081815260176020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b0384163b156129e657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612927903390899088908890600401613532565b602060405180830381600087803b15801561294157600080fd5b505af1925050508015612971575060408051601f3d908101601f1916820190925261296e918101906132a9565b60015b6129cc573d80801561299f576040519150601f19603f3d011682016040523d82523d6000602084013e6129a4565b606091505b5080516129c4576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612353565b506001949350505050565b606081612a155750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a3f5780612a29816136c6565b9150612a389050600a83613615565b9150612a19565b60008167ffffffffffffffff811115612a6857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a92576020820181803683370190505b5090505b841561235357612aa7600183613648565b9150612ab4600a866136e1565b612abf9060306135fd565b60f81b818381518110612ae257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612b04600a86613615565b9450612a96565b6000806000612b1a8585612b2f565b91509150612b2781612b9f565b509392505050565b600080825160411415612b665760208301516040840151606085015160001a612b5a87828585612da3565b94509450505050612b98565b825160401415612b905760208301516040840151612b85868383612e90565b935093505050612b98565b506000905060025b9250929050565b6000816004811115612bc157634e487b7160e01b600052602160045260246000fd5b1415612bca5750565b6001816004811115612bec57634e487b7160e01b600052602160045260246000fd5b1415612c3a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610c2f565b6002816004811115612c5c57634e487b7160e01b600052602160045260246000fd5b1415612caa5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610c2f565b6003816004811115612ccc57634e487b7160e01b600052602160045260246000fd5b1415612d255760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610c2f565b6004816004811115612d4757634e487b7160e01b600052602160045260246000fd5b1415612da05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610c2f565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612dda5750600090506003612e87565b8460ff16601b14158015612df257508460ff16601c14155b15612e035750600090506004612e87565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612e57573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612e8057600060019250925050612e87565b9150600090505b94509492505050565b6000806001600160ff1b03831681612ead60ff86901c601b6135fd565b9050612ebb87828885612da3565b935093505050935093915050565b828054612ed59061368b565b90600052602060002090601f016020900481019282612ef75760008555612f3d565b82601f10612f1057805160ff1916838001178555612f3d565b82800160010185558215612f3d579182015b82811115612f3d578251825591602001919060010190612f22565b50612f49929150613001565b5090565b5080546000825590600052602060002090810190612da09190613001565b828054828255906000526020600020908101928215612f3d579160200282015b82811115612f3d5763ffffffff8335168255602090920191600190910190612f8b565b828054828255906000526020600020908101928215612f3d579160200282015b82811115612f3d5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612fce565b5b80821115612f495760008155600101613002565b600067ffffffffffffffff8084111561303157613031613721565b604051601f8501601f19908116603f0116810190828211818310171561305957613059613721565b8160405280935085815286868601111561307257600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146130a357600080fd5b919050565b60008083601f8401126130b9578081fd5b50813567ffffffffffffffff8111156130d0578182fd5b6020830191508360208260051b8501011115612b9857600080fd5b803580151581146130a357600080fd5b60006020828403121561310c578081fd5b611e3d8261308c565b60008060408385031215613127578081fd5b6131308361308c565b915061313e6020840161308c565b90509250929050565b60008060006060848603121561315b578081fd5b6131648461308c565b92506131726020850161308c565b9150604084013590509250925092565b60008060008060808587031215613197578081fd5b6131a08561308c565b93506131ae6020860161308c565b925060408501359150606085013567ffffffffffffffff8111156131d0578182fd5b8501601f810187136131e0578182fd5b6131ef87823560208401613016565b91505092959194509250565b6000806040838503121561320d578182fd5b6132168361308c565b915061313e602084016130eb565b60008060408385031215613236578182fd5b61323f8361308c565b946020939093013593505050565b6000806020838503121561325f578182fd5b823567ffffffffffffffff811115613275578283fd5b613281858286016130a8565b90969095509350505050565b60006020828403121561329e578081fd5b8135611e3d81613737565b6000602082840312156132ba578081fd5b8151611e3d81613737565b6000602082840312156132d6578081fd5b813567ffffffffffffffff8111156132ec578182fd5b8201601f810184136132fc578182fd5b61235384823560208401613016565b60006020828403121561331c578081fd5b813561ffff81168114611e3d578182fd5b60006020828403121561333e578081fd5b5035919050565b60008060408385031215613357578182fd5b8235915061313e602084016130eb565b60008060006040848603121561337b578081fd5b83359250602084013567ffffffffffffffff80821115613399578283fd5b818601915086601f8301126133ac578283fd5b8135818111156133ba578384fd5b8760208285010111156133cb578384fd5b6020830194508093505050509250925092565b600080604083850312156133f0578182fd5b50508035926020909101359150565b600060208284031215613410578081fd5b813563ffffffff81168114611e3d578182fd5b600060208284031215613434578081fd5b813560ff81168114611e3d578182fd5b6000815180845261345c81602086016020860161365f565b601f01601f19169290920160200192915050565b6000845160206134838285838a0161365f565b8551918401916134968184848a0161365f565b85549201918390600181811c90808316806134b257607f831692505b8583108114156134d057634e487b7160e01b88526022600452602488fd5b8080156134e457600181146134f557613521565b60ff19851688528388019550613521565b60008b815260209020895b858110156135195781548a820152908401908801613500565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061356590830184613444565b9695505050505050565b602081526000611e3d6020830184613444565b60208082526014908201527311549493d488481058d8d95cdcc819195b9a595960621b604082015260600190565b6020808252600d908201526c1058d8d95cdcc819195b9a5959609a1b604082015260600190565b600061ffff8083168185168083038211156135f4576135f46136f5565b01949350505050565b60008219821115613610576136106136f5565b500190565b6000826136245761362461370b565b500490565b6000816000190483118215151615613643576136436136f5565b500290565b60008282101561365a5761365a6136f5565b500390565b60005b8381101561367a578181015183820152602001613662565b83811115611b765750506000910152565b600181811c9082168061369f57607f821691505b602082108114156136c057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136da576136da6136f5565b5060010190565b6000826136f0576136f061370b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114612da057600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122044a8aa8560354f4683ec0bcd96db266f432cbd6082ef6057646b98bd62c8f50b64736f6c63430008040033
Deployed Bytecode
0x6080604052600436106103bc5760003560e01c806370a08231116101f2578063b88d4fde1161010d578063dc88a1cf116100a0578063e985e9c51161006f578063e985e9c514610b33578063f2fde38b14610b53578063fb017fde14610b73578063fe2c7fee14610b9357600080fd5b8063dc88a1cf14610aa6578063e0dc850d14610ac6578063e0edeef614610ae6578063e5dfd04914610b0657600080fd5b8063c87b56dd116100dc578063c87b56dd14610a26578063cfbe735514610a46578063da3ef23f14610a66578063dc607f6814610a8657600080fd5b8063b88d4fde146109c4578063bee6348a146109e4578063c6682862146109fe578063c75f35c814610a1357600080fd5b8063a0f45b6911610185578063a475b5dd11610154578063a475b5dd14610958578063aafb60021461096d578063b3a196e91461098d578063b584b78d146109af57600080fd5b8063a0f45b69146108cb578063a205ea4214610901578063a22cb46514610923578063a43be57b1461094357600080fd5b806395d89b41116101c157806395d89b4114610857578063964c33b51461086c5780639c3e73c314610899578063a0712d68146108b857600080fd5b806370a08231146107d7578063715018a61461080d5780638611244c146108225780638da5cb5b1461083757600080fd5b80633ccfd60b116102e257806351830227116102755780636833a228116102445780636833a228146107625780636c0360eb146107825780636c19e783146107975780636c2e370b146107b757600080fd5b806351830227146106df57806355f804b3146107005780635f94c650146107205780636352211e1461074257600080fd5b8063447400bf116102b1578063447400bf1461064f57806344a0d68a1461066f57806346694b7d1461068f578063478368c3146106bf57600080fd5b80633ccfd60b146105d85780633feb5f2b146105ed57806342842e0e1461060d57806342ca1d091461062d57600080fd5b80630d06ed721161035a57806324a9ac041161032957806324a9ac0414610545578063286720c5146105655780632a484ad41461058557806332032817146105b857600080fd5b80630d06ed72146104c757806313faede6146104da57806318160ddd146104f057806323b872dd1461052557600080fd5b806306fdde031161039657806306fdde0314610429578063081812fc1461044b578063095ea7b3146104835780630c57ff69146104a357600080fd5b806301ffc9a7146103c857806303a17969146103fd57806304c98b2b1461041457600080fd5b366103c357005b600080fd5b3480156103d457600080fd5b506103e86103e336600461328d565b610bb3565b60405190151581526020015b60405180910390f35b34801561040957600080fd5b50610412610c05565b005b34801561042057600080fd5b50610412610c45565b34801561043557600080fd5b5061043e610c7e565b6040516103f4919061356f565b34801561045757600080fd5b5061046b61046636600461332d565b610d10565b6040516001600160a01b0390911681526020016103f4565b34801561048f57600080fd5b5061041261049e366004613224565b610da1565b3480156104af57600080fd5b506104b9600b5481565b6040519081526020016103f4565b6104126104d5366004613367565b610eb7565b3480156104e657600080fd5b506104b9600a5481565b3480156104fc57600080fd5b5060085461051290600160e01b900461ffff1681565b60405161ffff90911681526020016103f4565b34801561053157600080fd5b50610412610540366004613147565b611227565b34801561055157600080fd5b506104126105603660046130fb565b611232565b34801561057157600080fd5b506104b961058036600461332d565b61127e565b34801561059157600080fd5b506008546105a690600160f01b900460ff1681565b60405160ff90911681526020016103f4565b3480156105c457600080fd5b506104126105d336600461330b565b61129f565b3480156105e457600080fd5b506104126112eb565b3480156105f957600080fd5b5061046b61060836600461332d565b611440565b34801561061957600080fd5b50610412610628366004613147565b61146a565b34801561063957600080fd5b5060085461051290600160b01b900461ffff1681565b34801561065b57600080fd5b5061041261066a3660046133de565b611485565b34801561067b57600080fd5b5061041261068a36600461332d565b6114c1565b34801561069b57600080fd5b506103e86106aa36600461332d565b60126020526000908152604090205460ff1681565b3480156106cb57600080fd5b506104126106da366004613345565b6114f0565b3480156106eb57600080fd5b506008546103e890600160f81b900460ff1681565b34801561070c57600080fd5b5061041261071b3660046132c5565b61153a565b34801561072c57600080fd5b5060085461051290600160c01b900461ffff1681565b34801561074e57600080fd5b5061046b61075d36600461332d565b611577565b34801561076e57600080fd5b5061041261077d366004613423565b611619565b34801561078e57600080fd5b5061043e611663565b3480156107a357600080fd5b506104126107b23660046130fb565b6116f1565b3480156107c357600080fd5b506104126107d236600461332d565b61173d565b3480156107e357600080fd5b506104b96107f23660046130fb565b6001600160a01b03166000908152600d602052604090205490565b34801561081957600080fd5b5061041261176c565b34801561082e57600080fd5b506104126117a8565b34801561084357600080fd5b5060005461046b906001600160a01b031681565b34801561086357600080fd5b5061043e6117e3565b34801561087857600080fd5b506104b96108873660046130fb565b60106020526000908152604090205481565b3480156108a557600080fd5b506009546103e890610100900460ff1681565b6104126108c636600461332d565b6117f2565b3480156108d757600080fd5b5061046b6108e636600461332d565b600e602052600090815260409020546001600160a01b031681565b34801561090d57600080fd5b5060085461051290600160d01b900461ffff1681565b34801561092f57600080fd5b5061041261093e3660046131fb565b611ab3565b34801561094f57600080fd5b50610412611abe565b34801561096457600080fd5b50610412611af4565b34801561097957600080fd5b5060075461046b906001600160a01b031681565b34801561099957600080fd5b5060085461051290600160a01b900461ffff1681565b3480156109bb57600080fd5b5061043e611b35565b3480156109d057600080fd5b506104126109df366004613182565b611b42565b3480156109f057600080fd5b506009546103e89060ff1681565b348015610a0a57600080fd5b5061043e611b7c565b610412610a21366004613224565b611b89565b348015610a3257600080fd5b5061043e610a4136600461332d565b611c47565b348015610a5257600080fd5b50610412610a6136600461330b565b611e44565b348015610a7257600080fd5b50610412610a813660046132c5565b611e90565b348015610a9257600080fd5b506104b9610aa136600461332d565b611ecd565b348015610ab257600080fd5b50610412610ac13660046130fb565b611f5d565b348015610ad257600080fd5b50610412610ae136600461324d565b611fa9565b348015610af257600080fd5b5060085461046b906001600160a01b031681565b348015610b1257600080fd5b506104b9610b2136600461332d565b600f6020526000908152604090205481565b348015610b3f57600080fd5b506103e8610b4e366004613115565b612116565b348015610b5f57600080fd5b50610412610b6e3660046130fb565b612144565b348015610b7f57600080fd5b50610412610b8e36600461324d565b612190565b348015610b9f57600080fd5b50610412610bae3660046132c5565b6121d2565b60006001600160e01b031982166380ac58cd60e01b1480610be457506001600160e01b03198216635b5e139f60e01b145b80610bff57506001600160e01b031982166301ffc9a760e01b145b92915050565b6000546001600160a01b03163314610c385760405162461bcd60e51b8152600401610c2f90613582565b60405180910390fd5b6009805461ff0019169055565b6000546001600160a01b03163314610c6f5760405162461bcd60e51b8152600401610c2f90613582565b6009805460ff19166001179055565b606060058054610c8d9061368b565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb99061368b565b8015610d065780601f10610cdb57610100808354040283529160200191610d06565b820191906000526020600020905b815481529060010190602001808311610ce957829003601f168201915b5050505050905090565b600854600090600160e01b900461ffff16821115610d855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c2f565b506000908152601660205260409020546001600160a01b031690565b6000610dac82611577565b9050806001600160a01b0316836001600160a01b03161415610e1a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c2f565b336001600160a01b0382161480610e365750610e368133612116565b610ea85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c2f565b610eb2838361220f565b505050565b600354829082906001600160a01b0316610f045760405162461bcd60e51b815260206004820152600e60248201526d14da59db995c88139bdd0814d95d60921b6044820152606401610c2f565b6003546001600160a01b0316610f1a838361227d565b6001600160a01b031614610f625760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b6044820152606401610c2f565b60085433600090815260106020526040902054600160f01b90910460ff1690610f8c9087906135fd565b1115610fda5760405162461bcd60e51b815260206004820152601b60248201527f596f752063616e6e6f74206d696e74206d6f7265207468616e203300000000006044820152606401610c2f565b60085461ffff600160a01b8204811691610ffd918891600160c01b9004166135fd565b111561103c5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606401610c2f565b60095460ff166110845760405162461bcd60e51b8152602060048201526013602482015272283932b9b0b6329034b9903737ba1037b832b760691b6044820152606401610c2f565b600085600b546110949190613629565b9050803410156110dd5760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b6044820152606401610c2f565b8034111561111d57336108fc6110f38334613648565b6040518115909202916000818181858888f1935050505015801561111b573d6000803e3d6000fd5b505b60005b8681101561119c5761113e81600c5461113991906135fd565b61235b565b600f600083600c5461115091906135fd565b8152602081019190915260400160002055600c5461116f9082906135fd565b604051339060009060008051602061374e833981519152908290a46111956001826135fd565b9050611120565b506111a733876123cf565b8560ff16600860188282829054906101000a900461ffff166111c991906135d7565b92506101000a81548161ffff021916908361ffff1602179055508560ff166008601c8282829054906101000a900461ffff1661120591906135d7565b92506101000a81548161ffff021916908361ffff160217905550505050505050565b610eb283838361247f565b6000546001600160a01b0316331461125c5760405162461bcd60e51b8152600401610c2f90613582565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6002818154811061128e57600080fd5b600091825260209091200154905081565b6000546001600160a01b031633146112c95760405162461bcd60e51b8152600401610c2f90613582565b6008805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b6000546001600160a01b031633146113155760405162461bcd60e51b8152600401610c2f90613582565b60025461135d5760405162461bcd60e51b8152602060048201526016602482015275139bc81a5b9d995cdd1bdc9cc81cdc1958da599a595960521b6044820152606401610c2f565b4760005b60015481101561143c5760006002828154811061138e57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154111561142a5761142a600182815481106113c357634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b03166127106002848154811061140557634e487b7160e01b600052603260045260246000fd5b90600052602060002001548561141b9190613629565b6114259190613615565b6126fb565b80611434816136c6565b915050611361565b5050565b6001818154811061145057600080fd5b6000918252602090912001546001600160a01b0316905081565b610eb283838360405180602001604052806000815250611b42565b6008546001600160a01b031633146114af5760405162461bcd60e51b8152600401610c2f906135b0565b6000918252600f602052604090912055565b6000546001600160a01b031633146114eb5760405162461bcd60e51b8152600401610c2f90613582565b600a55565b6008546001600160a01b0316331461151a5760405162461bcd60e51b8152600401610c2f906135b0565b600091825260126020526040909120805460ff1916911515919091179055565b6000546001600160a01b031633146115645760405162461bcd60e51b8152600401610c2f90613582565b805161143c906013906020840190612ec9565b6000600c5482106115bd5760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081d1bdad95b88125160821b6044820152606401610c2f565b815b6001811180156115e457506000818152600e60205260409020546001600160a01b0316155b156115fb576115f4600182613648565b90506115bf565b6000908152600e60205260409020546001600160a01b031692915050565b6000546001600160a01b031633146116435760405162461bcd60e51b8152600401610c2f90613582565b6008805460ff909216600160f01b0260ff60f01b19909216919091179055565b601380546116709061368b565b80601f016020809104026020016040519081016040528092919081815260200182805461169c9061368b565b80156116e95780601f106116be576101008083540402835291602001916116e9565b820191906000526020600020905b8154815290600101906020018083116116cc57829003601f168201915b505050505081565b6000546001600160a01b0316331461171b5760405162461bcd60e51b8152600401610c2f90613582565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146117675760405162461bcd60e51b8152600401610c2f90613582565b600b55565b6000546001600160a01b031633146117965760405162461bcd60e51b8152600401610c2f90613582565b600080546001600160a01b0319169055565b6000546001600160a01b031633146117d25760405162461bcd60e51b8152600401610c2f90613582565b6009805461ff001916610100179055565b606060068054610c8d9061368b565b60085433600090815260106020526040902054600160f01b90910460ff169061181c9083906135fd565b111561186a5760405162461bcd60e51b815260206004820152601b60248201527f596f752063616e6e6f74206d696e74206d6f7265207468616e203300000000006044820152606401610c2f565b60085461ffff600160b01b820481169161188d918491600160d01b9004166135fd565b11156118cc5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606401610c2f565b600954610100900460ff166119195760405162461bcd60e51b8152602060048201526013602482015272283ab139b0b6329034b9903737ba1037b832b760691b6044820152606401610c2f565b600081600a546119299190613629565b9050803410156119725760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b6044820152606401610c2f565b803411156119b257336108fc6119888334613648565b6040518115909202916000818181858888f193505050501580156119b0573d6000803e3d6000fd5b505b60005b82811015611a2c576119ce81600c5461113991906135fd565b600f600083600c546119e091906135fd565b8152602081019190915260400160002055600c546119ff9082906135fd565b604051339060009060008051602061374e833981519152908290a4611a256001826135fd565b90506119b5565b50611a3733836123cf565b8160ff166008601a8282829054906101000a900461ffff16611a5991906135d7565b92506101000a81548161ffff021916908361ffff1602179055508160ff166008601c8282829054906101000a900461ffff16611a9591906135d7565b92506101000a81548161ffff021916908361ffff1602179055505050565b61143c338383612814565b6000546001600160a01b03163314611ae85760405162461bcd60e51b8152600401610c2f90613582565b6009805460ff19169055565b6000546001600160a01b03163314611b1e5760405162461bcd60e51b8152600401610c2f90613582565b600880546001600160f81b0316600160f81b179055565b601480546116709061368b565b611b4d84848461247f565b611b59848484846128e3565b611b76576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b601580546116709061368b565b6007546001600160a01b03163314611be35760405162461bcd60e51b815260206004820152601d60248201527f4552524f522120596f75206d75737420626520746865206d696e7465720000006044820152606401610c2f565b600c80546000908152600f6020526040808220849055915491516001600160a01b038516919060008051602061374e833981519152908290a4611c278260016123cf565b60016008601c8282829054906101000a900461ffff16611a9591906135d7565b600854606090600160e01b900461ffff16821115611cbf5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c2f565b600854600160f81b900460ff16611d625760148054611cdd9061368b565b80601f0160208091040260200160405190810160405280929190818152602001828054611d099061368b565b8015611d565780601f10611d2b57610100808354040283529160200191611d56565b820191906000526020600020905b815481529060010190602001808311611d3957829003601f168201915b50505050509050919050565b600060138054611d719061368b565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9d9061368b565b8015611dea5780601f10611dbf57610100808354040283529160200191611dea565b820191906000526020600020905b815481529060010190602001808311611dcd57829003601f168201915b505050505090506000815111611e0f5760405180602001604052806000815250611e3d565b80611e19846129f1565b6015604051602001611e2d93929190613470565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611e6e5760405162461bcd60e51b8152600401610c2f90613582565b6008805461ffff909216600160b01b0261ffff60b01b19909216919091179055565b6000546001600160a01b03163314611eba5760405162461bcd60e51b8152600401610c2f90613582565b805161143c906015906020840190612ec9565b6000600c548210611f135760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081d1bdad95b88125160821b6044820152606401610c2f565b815b600181118015611f315750600081815260116020526040902054155b15611f4857611f41600182613648565b9050611f15565b60009081526011602052604090205492915050565b6000546001600160a01b03163314611f875760405162461bcd60e51b8152600401610c2f90613582565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611fd35760405162461bcd60e51b8152600401610c2f90613582565b60015481146120395760405162461bcd60e51b815260206004820152602c60248201527f546865206e756d6265727320646f65736e2774206d617463682077697468207460448201526b686520696e766573746f727360a01b6064820152608401610c2f565b6000805b8281101561209e5783838281811061206557634e487b7160e01b600052603260045260246000fd5b905060200201602081019061207a91906133ff565b61208a9063ffffffff16836135fd565b915080612096816136c6565b91505061203d565b5080612710146120fe5760405162461bcd60e51b815260206004820152602560248201527f5468652073756d206f6620746865206e756d62657273206d75737420626520316044820152640302c3030360dc1b6064820152608401610c2f565b61210a60026000612f4d565b611b7660028484612f6b565b6001600160a01b03918216600090815260176020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b0316331461216e5760405162461bcd60e51b8152600401610c2f90613582565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146121ba5760405162461bcd60e51b8152600401610c2f90613582565b6121c660016000612f4d565b610eb260018383612fae565b6000546001600160a01b031633146121fc5760405162461bcd60e51b8152600401610c2f90613582565b805161143c906014906020840190612ec9565b600081815260166020526040902080546001600160a01b0319166001600160a01b038416908117909155819061224482611577565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6040516bffffffffffffffffffffffff1930606090811b8216602084015233901b166034820152600090819060480160408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c82018190529150605c0160405160208183030381529060405280519060200120905061235384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508593925050612b0b9050565b949350505050565b6000620f424082600454610e104261237391906136e1565b60408051602081019490945283019190915260608201526080016040516020818303038152906040528051906020012060001c6123b091906136e1565b60048190556203d09011156123c757506002919050565b506001919050565b6001600160a01b0382166000908152600d6020526040812080548392906123f79084906135fd565b90915550506001600160a01b038216600090815260106020526040812080548392906124249084906135fd565b9091555050600c80546000908152600e6020908152604080832080546001600160a01b0319166001600160a01b03881617905583548352601190915281204290558154839291906124769084906135fd565b90915550505050565b600061248a82611577565b60008381526012602052604090205490915060ff16156124e25760405162461bcd60e51b8152602060048201526013602482015272151a19481d1bdad95b881a5cc81b1bd8dad959606a1b6044820152606401610c2f565b826001600160a01b0316846001600160a01b031614156125445760405162461bcd60e51b815260206004820152601f60248201527f596f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610c2f565b806001600160a01b0316846001600160a01b03161461259c5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642066726f6d206164647265737360601b6044820152606401610c2f565b336001600160a01b03821614806125b857506125b88133612116565b806125d35750336125c883610d10565b6001600160a01b0316145b6125ef5760405162461bcd60e51b8152600401610c2f906135b0565b6125fa60008361220f565b6000828152600e6020526040812080546001600160a01b0319166001600160a01b03861617905561262c8360016135fd565b9050600061263982611577565b6001600160a01b03161461266f576000818152600e6020526040902080546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382166000908152600d60205260408120805460019290612698908490613648565b90915550506001600160a01b0384166000908152600d602052604081208054600192906126c69084906135fd565b909155505060405183906001600160a01b03808716919088169060008051602061374e83398151915290600090a45050505050565b8047101561274b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c2f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612798576040519150601f19603f3d011682016040523d82523d6000602084013e61279d565b606091505b5050905080610eb25760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c2f565b816001600160a01b0316836001600160a01b031614156128765760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c2f565b6001600160a01b03838116600081815260176020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b0384163b156129e657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612927903390899088908890600401613532565b602060405180830381600087803b15801561294157600080fd5b505af1925050508015612971575060408051601f3d908101601f1916820190925261296e918101906132a9565b60015b6129cc573d80801561299f576040519150601f19603f3d011682016040523d82523d6000602084013e6129a4565b606091505b5080516129c4576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612353565b506001949350505050565b606081612a155750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a3f5780612a29816136c6565b9150612a389050600a83613615565b9150612a19565b60008167ffffffffffffffff811115612a6857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a92576020820181803683370190505b5090505b841561235357612aa7600183613648565b9150612ab4600a866136e1565b612abf9060306135fd565b60f81b818381518110612ae257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612b04600a86613615565b9450612a96565b6000806000612b1a8585612b2f565b91509150612b2781612b9f565b509392505050565b600080825160411415612b665760208301516040840151606085015160001a612b5a87828585612da3565b94509450505050612b98565b825160401415612b905760208301516040840151612b85868383612e90565b935093505050612b98565b506000905060025b9250929050565b6000816004811115612bc157634e487b7160e01b600052602160045260246000fd5b1415612bca5750565b6001816004811115612bec57634e487b7160e01b600052602160045260246000fd5b1415612c3a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610c2f565b6002816004811115612c5c57634e487b7160e01b600052602160045260246000fd5b1415612caa5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610c2f565b6003816004811115612ccc57634e487b7160e01b600052602160045260246000fd5b1415612d255760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610c2f565b6004816004811115612d4757634e487b7160e01b600052602160045260246000fd5b1415612da05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610c2f565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612dda5750600090506003612e87565b8460ff16601b14158015612df257508460ff16601c14155b15612e035750600090506004612e87565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612e57573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612e8057600060019250925050612e87565b9150600090505b94509492505050565b6000806001600160ff1b03831681612ead60ff86901c601b6135fd565b9050612ebb87828885612da3565b935093505050935093915050565b828054612ed59061368b565b90600052602060002090601f016020900481019282612ef75760008555612f3d565b82601f10612f1057805160ff1916838001178555612f3d565b82800160010185558215612f3d579182015b82811115612f3d578251825591602001919060010190612f22565b50612f49929150613001565b5090565b5080546000825590600052602060002090810190612da09190613001565b828054828255906000526020600020908101928215612f3d579160200282015b82811115612f3d5763ffffffff8335168255602090920191600190910190612f8b565b828054828255906000526020600020908101928215612f3d579160200282015b82811115612f3d5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612fce565b5b80821115612f495760008155600101613002565b600067ffffffffffffffff8084111561303157613031613721565b604051601f8501601f19908116603f0116810190828211818310171561305957613059613721565b8160405280935085815286868601111561307257600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146130a357600080fd5b919050565b60008083601f8401126130b9578081fd5b50813567ffffffffffffffff8111156130d0578182fd5b6020830191508360208260051b8501011115612b9857600080fd5b803580151581146130a357600080fd5b60006020828403121561310c578081fd5b611e3d8261308c565b60008060408385031215613127578081fd5b6131308361308c565b915061313e6020840161308c565b90509250929050565b60008060006060848603121561315b578081fd5b6131648461308c565b92506131726020850161308c565b9150604084013590509250925092565b60008060008060808587031215613197578081fd5b6131a08561308c565b93506131ae6020860161308c565b925060408501359150606085013567ffffffffffffffff8111156131d0578182fd5b8501601f810187136131e0578182fd5b6131ef87823560208401613016565b91505092959194509250565b6000806040838503121561320d578182fd5b6132168361308c565b915061313e602084016130eb565b60008060408385031215613236578182fd5b61323f8361308c565b946020939093013593505050565b6000806020838503121561325f578182fd5b823567ffffffffffffffff811115613275578283fd5b613281858286016130a8565b90969095509350505050565b60006020828403121561329e578081fd5b8135611e3d81613737565b6000602082840312156132ba578081fd5b8151611e3d81613737565b6000602082840312156132d6578081fd5b813567ffffffffffffffff8111156132ec578182fd5b8201601f810184136132fc578182fd5b61235384823560208401613016565b60006020828403121561331c578081fd5b813561ffff81168114611e3d578182fd5b60006020828403121561333e578081fd5b5035919050565b60008060408385031215613357578182fd5b8235915061313e602084016130eb565b60008060006040848603121561337b578081fd5b83359250602084013567ffffffffffffffff80821115613399578283fd5b818601915086601f8301126133ac578283fd5b8135818111156133ba578384fd5b8760208285010111156133cb578384fd5b6020830194508093505050509250925092565b600080604083850312156133f0578182fd5b50508035926020909101359150565b600060208284031215613410578081fd5b813563ffffffff81168114611e3d578182fd5b600060208284031215613434578081fd5b813560ff81168114611e3d578182fd5b6000815180845261345c81602086016020860161365f565b601f01601f19169290920160200192915050565b6000845160206134838285838a0161365f565b8551918401916134968184848a0161365f565b85549201918390600181811c90808316806134b257607f831692505b8583108114156134d057634e487b7160e01b88526022600452602488fd5b8080156134e457600181146134f557613521565b60ff19851688528388019550613521565b60008b815260209020895b858110156135195781548a820152908401908801613500565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061356590830184613444565b9695505050505050565b602081526000611e3d6020830184613444565b60208082526014908201527311549493d488481058d8d95cdcc819195b9a595960621b604082015260600190565b6020808252600d908201526c1058d8d95cdcc819195b9a5959609a1b604082015260600190565b600061ffff8083168185168083038211156135f4576135f46136f5565b01949350505050565b60008219821115613610576136106136f5565b500190565b6000826136245761362461370b565b500490565b6000816000190483118215151615613643576136436136f5565b500290565b60008282101561365a5761365a6136f5565b500390565b60005b8381101561367a578181015183820152602001613662565b83811115611b765750506000910152565b600181811c9082168061369f57607f821691505b602082108114156136c057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136da576136da6136f5565b5060010190565b6000826136f0576136f061370b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114612da057600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122044a8aa8560354f4683ec0bcd96db266f432cbd6082ef6057646b98bd62c8f50b64736f6c63430008040033
Deployed Bytecode Sourcemap
31932:11951:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42600:351;;;;;;;;;;-1:-1:-1;42600:351:0;;;;;:::i;:::-;;:::i;:::-;;;11638:14:1;;11631:22;11613:41;;11601:2;11586:18;42600:351:0;;;;;;;;36155:79;;;;;;;;;;;;;:::i;:::-;;35892:80;;;;;;;;;;;;;:::i;33541:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34135:314::-;;;;;;;;;;-1:-1:-1;34135:314:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10936:32:1;;;10918:51;;10906:2;10891:18;34135:314:0;10873:102:1;33727:400:0;;;;;;;;;;-1:-1:-1;33727:400:0;;;;;:::i;:::-;;:::i;32585:39::-;;;;;;;;;;;;;;;;;;;22997:25:1;;;22985:2;22970:18;32585:39:0;22952:76:1;36961:983:0;;;;;;:::i;:::-;;:::i;32547:31::-;;;;;;;;;;;;;;;;32383:25;;;;;;;;;;-1:-1:-1;32383:25:0;;;;-1:-1:-1;;;32383:25:0;;;;;;;;;22832:6:1;22820:19;;;22802:38;;22790:2;22775:18;32383:25:0;22757:89:1;39700:162:0;;;;;;;;;;-1:-1:-1;39700:162:0;;;;;:::i;:::-;;:::i;35484:94::-;;;;;;;;;;-1:-1:-1;35484:94:0;;;;;:::i;:::-;;:::i;29559:32::-;;;;;;;;;;-1:-1:-1;29559:32:0;;;;;:::i;:::-;;:::i;32415:::-;;;;;;;;;;-1:-1:-1;32415:32:0;;;;-1:-1:-1;;;32415:32:0;;;;;;;;;23205:4:1;23193:17;;;23175:36;;23163:2;23148:18;32415:32:0;23130:87:1;42299:103:0;;;;;;;;;;-1:-1:-1;42299:103:0;;;;;:::i;:::-;;:::i;30296:387::-;;;;;;;;;;;;;:::i;29526:26::-;;;;;;;;;;-1:-1:-1;29526:26:0;;;;;:::i;:::-;;:::i;39870:177::-;;;;;;;;;;-1:-1:-1;39870:177:0;;;;;:::i;:::-;;:::i;32272:34::-;;;;;;;;;;-1:-1:-1;32272:34:0;;;;-1:-1:-1;;;32272:34:0;;;;;;39095:158;;;;;;;;;;-1:-1:-1;39095:158:0;;;;;:::i;:::-;;:::i;35586:82::-;;;;;;;;;;-1:-1:-1;35586:82:0;;;;;:::i;:::-;;:::i;32931:40::-;;;;;;;;;;-1:-1:-1;32931:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39261:164;;;;;;;;;;-1:-1:-1;39261:164:0;;;;;:::i;:::-;;:::i;32456:20::-;;;;;;;;;;-1:-1:-1;32456:20:0;;;;-1:-1:-1;;;32456:20:0;;;;;;41967:100;;;;;;;;;;-1:-1:-1;41967:100:0;;;;;:::i;:::-;;:::i;32313:28::-;;;;;;;;;;-1:-1:-1;32313:28:0;;;;-1:-1:-1;;;32313:28:0;;;;;;36365:298;;;;;;;;;;-1:-1:-1;36365:298:0;;;;;:::i;:::-;;:::i;35780:104::-;;;;;;;;;;-1:-1:-1;35780:104:0;;;;;:::i;:::-;;:::i;32980:21::-;;;;;;;;;;;;;:::i;30780:90::-;;;;;;;;;;-1:-1:-1;30780:90:0;;;;;:::i;:::-;;:::i;35676:96::-;;;;;;;;;;-1:-1:-1;35676:96:0;;;;;:::i;:::-;;:::i;36242:115::-;;;;;;;;;;-1:-1:-1;36242:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;36333:16:0;36306:7;36333:16;;;:9;:16;;;;;;;36242:115;29389:85;;;;;;;;;;;;;:::i;36067:80::-;;;;;;;;;;;;;:::i;29062:20::-;;;;;;;;;;-1:-1:-1;29062:20:0;;;;-1:-1:-1;;;;;29062:20:0;;;33632:87;;;;;;;;;;;;;:::i;32830:47::-;;;;;;;;;;-1:-1:-1;32830:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;32515:23;;;;;;;;;;-1:-1:-1;32515:23:0;;;;;;;;;;;37952:886;;;;;;:::i;:::-;;:::i;32726:44::-;;;;;;;;;;-1:-1:-1;32726:44:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;32726:44:0;;;32348:28;;;;;;;;;;-1:-1:-1;32348:28:0;;;;-1:-1:-1;;;32348:28:0;;;;;;34457:185;;;;;;;;;;-1:-1:-1;34457:185:0;;;;;:::i;:::-;;:::i;35980:79::-;;;;;;;;;;;;;:::i;42521:71::-;;;;;;;;;;;;;:::i;32164:29::-;;;;;;;;;;-1:-1:-1;32164:29:0;;;;-1:-1:-1;;;;;32164:29:0;;;32231:34;;;;;;;;;;-1:-1:-1;32231:34:0;;;;-1:-1:-1;;;32231:34:0;;;;;;33008:27;;;;;;;;;;;;;:::i;40055:336::-;;;;;;;;;;-1:-1:-1;40055:336:0;;;;;:::i;:::-;;:::i;32485:23::-;;;;;;;;;;-1:-1:-1;32485:23:0;;;;;;;;33042:27;;;;;;;;;;;;;:::i;38846:241::-;;;;;;:::i;:::-;;:::i;41299:660::-;;;;;;;;;;-1:-1:-1;41299:660:0;;;;;:::i;:::-;;:::i;42410:103::-;;;;;;;;;;-1:-1:-1;42410:103:0;;;;;:::i;:::-;;:::i;42187:104::-;;;;;;;;;;-1:-1:-1;42187:104:0;;;;;:::i;:::-;;:::i;36671:282::-;;;;;;;;;;-1:-1:-1;36671:282:0;;;;;:::i;:::-;;:::i;35370:106::-;;;;;;;;;;-1:-1:-1;35370:106:0;;;;;:::i;:::-;;:::i;29791:497::-;;;;;;;;;;-1:-1:-1;29791:497:0;;;;;:::i;:::-;;:::i;32200:22::-;;;;;;;;;;-1:-1:-1;32200:22:0;;;;-1:-1:-1;;;;;32200:22:0;;;32777:46;;;;;;;;;;-1:-1:-1;32777:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;34650:214;;;;;;;;;;-1:-1:-1;34650:214:0;;;;;:::i;:::-;;:::i;29280:101::-;;;;;;;;;;-1:-1:-1;29280:101:0;;;;;:::i;:::-;;:::i;29643:140::-;;;;;;;;;;-1:-1:-1;29643:140:0;;;;;:::i;:::-;;:::i;42075:104::-;;;;;;;;;;-1:-1:-1;42075:104:0;;;;;:::i;:::-;;:::i;42600:351::-;42739:4;-1:-1:-1;;;;;;42781:40:0;;-1:-1:-1;;;42781:40:0;;:105;;-1:-1:-1;;;;;;;42838:48:0;;-1:-1:-1;;;42838:48:0;42781:105;:162;;;-1:-1:-1;;;;;;;42903:40:0;;-1:-1:-1;;;42903:40:0;42781:162;42761:182;42600:351;-1:-1:-1;;42600:351:0:o;36155:79::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;;;;;;;;;36207:11:::1;:19:::0;;-1:-1:-1;;36207:19:0::1;::::0;;36155:79::o;35892:80::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;35946:11:::1;:18:::0;;-1:-1:-1;;35946:18:0::1;35960:4;35946:18;::::0;;35892:80::o;33541:83::-;33578:13;33611:5;33604:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33541:83;:::o;34135:314::-;34314:11;;34256:7;;-1:-1:-1;;;34314:11:0;;;;34303:22;;;34281:116;;;;-1:-1:-1;;;34281:116:0;;18088:2:1;34281:116:0;;;18070:21:1;18127:2;18107:18;;;18100:30;18166:34;18146:18;;;18139:62;-1:-1:-1;;;18217:18:1;;;18210:42;18269:19;;34281:116:0;18060:234:1;34281:116:0;-1:-1:-1;34417:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34417:24:0;;34135:314::o;33727:400::-;33808:13;33824:16;33832:7;33824;:16::i;:::-;33808:32;;33865:5;-1:-1:-1;;;;;33859:11:0;:2;-1:-1:-1;;;;;33859:11:0;;;33851:57;;;;-1:-1:-1;;;33851:57:0;;20016:2:1;33851:57:0;;;19998:21:1;20055:2;20035:18;;;20028:30;20094:34;20074:18;;;20067:62;-1:-1:-1;;;20145:18:1;;;20138:31;20186:19;;33851:57:0;19988:223:1;33851:57:0;33943:10;-1:-1:-1;;;;;33943:19:0;;;;:58;;;33966:35;33983:5;33990:10;33966:16;:35::i;:::-;33921:164;;;;-1:-1:-1;;;33921:164:0;;16555:2:1;33921:164:0;;;16537:21:1;16594:2;16574:18;;;16567:30;16633:34;16613:18;;;16606:62;16704:26;16684:18;;;16677:54;16748:19;;33921:164:0;16527:246:1;33921:164:0;34098:21;34107:2;34111:7;34098:8;:21::i;:::-;33727:400;;;:::o;36961:983::-;31302:6;;37082:9;;;;-1:-1:-1;;;;;31302:6:0;31294:47;;;;-1:-1:-1;;;31294:47:0;;13565:2:1;31294:47:0;;;13547:21:1;13604:2;13584:18;;;13577:30;-1:-1:-1;;;13623:18:1;;;13616:44;13677:18;;31294:47:0;13537:164:1;31294:47:0;31392:6;;-1:-1:-1;;;;;31392:6:0;31360:28;31378:9;;31360:17;:28::i;:::-;-1:-1:-1;;;;;31360:38:0;;31352:66;;;;-1:-1:-1;;;31352:66:0;;21109:2:1;31352:66:0;;;21091:21:1;21148:2;21128:18;;;21121:30;-1:-1:-1;;;21167:18:1;;;21160:45;21222:18;;31352:66:0;21081:165:1;31352:66:0;37168:15:::1;::::0;37144:10:::1;37131:24;::::0;;;:12:::1;:24;::::0;;;;;-1:-1:-1;;;37168:15:0;;::::1;;;::::0;37131:33:::1;::::0;37158:6;;37131:33:::1;:::i;:::-;:52;;37109:129;;;::::0;-1:-1:-1;;;37109:129:0;;17383:2:1;37109:129:0::1;::::0;::::1;17365:21:1::0;17422:2;17402:18;;;17395:30;17461:29;17441:18;;;17434:57;17508:18;;37109:129:0::1;17355:177:1::0;37109:129:0::1;37284:13;::::0;::::1;-1:-1:-1::0;;;37284:13:0;::::1;::::0;::::1;::::0;37257:23:::1;::::0;37274:6;;-1:-1:-1;;;37257:14:0;::::1;;:23;:::i;:::-;:40;;37249:67;;;::::0;-1:-1:-1;;;37249:67:0;;14321:2:1;37249:67:0::1;::::0;::::1;14303:21:1::0;14360:2;14340:18;;;14333:30;-1:-1:-1;;;14379:18:1;;;14372:44;14433:18;;37249:67:0::1;14293:164:1::0;37249:67:0::1;37335:11;::::0;::::1;;37327:43;;;::::0;-1:-1:-1;;;37327:43:0;;19323:2:1;37327:43:0::1;::::0;::::1;19305:21:1::0;19362:2;19342:18;;;19335:30;-1:-1:-1;;;19381:18:1;;;19374:49;19440:18;;37327:43:0::1;19295:169:1::0;37327:43:0::1;37383:17;37417:6;37403:11;;:20;;;;:::i;:::-;37383:40;;37455:9;37442;:22;;37434:55;;;::::0;-1:-1:-1;;;37434:55:0;;17739:2:1;37434:55:0::1;::::0;::::1;17721:21:1::0;17778:2;17758:18;;;17751:30;-1:-1:-1;;;17797:18:1;;;17790:50;17857:18;;37434:55:0::1;17711:170:1::0;37434:55:0::1;37518:9;37506;:21;37502:105;;;37552:10;37544:51;37573:21;37585:9:::0;37573::::1;:21;:::i;:::-;37544:51;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;37502:105;37624:9;37619:197;37643:6;37639:1;:10;37619:197;;;37707:26;37731:1;37715:13;;:17;;;;:::i;:::-;37707:7;:26::i;:::-;37674:11;:30;37702:1;37686:13;;:17;;;;:::i;:::-;37674:30:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;37674:30:0;:59;37786:13:::1;::::0;:17:::1;::::0;37802:1;;37786:17:::1;:::i;:::-;37753:51;::::0;37774:10:::1;::::0;37770:1:::1;::::0;-1:-1:-1;;;;;;;;;;;37753:51:0;37770:1;;37753:51:::1;37651:6;37656:1;37651:6:::0;::::1;:::i;:::-;;;37619:197;;;;37828:25;37834:10;37846:6;37828:5;:25::i;:::-;37890:6;37866:31;;:14;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37929:6;37908:28;;:11;;:28;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31429:1;36961:983:::0;;;;;:::o;39700:162::-;39826:28;39836:4;39842:2;39846:7;39826:9;:28::i;35484:94::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;35552:7:::1;:18:::0;;-1:-1:-1;;;;;;35552:18:0::1;-1:-1:-1::0;;;;;35552:18:0;;;::::1;::::0;;;::::1;::::0;;35484:94::o;29559:32::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29559:32:0;:::o;42299:103::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;42371:13:::1;:23:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;42371:23:0::1;-1:-1:-1::0;;;;42371:23:0;;::::1;::::0;;;::::1;::::0;;42299:103::o;30296:387::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;30352:15:::1;:22:::0;30344:61:::1;;;::::0;-1:-1:-1;;;30344:61:0;;22509:2:1;30344:61:0::1;::::0;::::1;22491:21:1::0;22548:2;22528:18;;;22521:30;-1:-1:-1;;;22567:18:1;;;22560:52;22629:18;;30344:61:0::1;22481:172:1::0;30344:61:0::1;30432:21;30418:11;30466:210;30490:9;:16:::0;30486:20;::::1;30466:210;;;30553:1;30532:15;30548:1;30532:18;;;;;;-1:-1:-1::0;;;30532:18:0::1;;;;;;;;;;;;;;;;;:22;30528:137;;;30575:74;30601:9;30611:1;30601:12;;;;;;-1:-1:-1::0;;;30601:12:0::1;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;30601:12:0::1;30643:5;30622:15;30638:1;30622:18;;;;;;-1:-1:-1::0;;;30622:18:0::1;;;;;;;;;;;;;;;;;30616:3;:24;;;;:::i;:::-;:32;;;;:::i;:::-;30575:17;:74::i;:::-;30508:3:::0;::::1;::::0;::::1;:::i;:::-;;;;30466:210;;;;29263:1;30296:387::o:0;29526:26::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29526:26:0;;-1:-1:-1;29526:26:0;:::o;39870:177::-;40000:39;40017:4;40023:2;40027:7;40000:39;;;;;;;;;;;;:16;:39::i;39095:158::-;39180:7;;-1:-1:-1;;;;;39180:7:0;39166:10;:21;39158:47;;;;-1:-1:-1;;;39158:47:0;;;;;;;:::i;:::-;39216:20;;;;:11;:20;;;;;;:29;39095:158::o;35586:82::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;35648:4:::1;:12:::0;35586:82::o;39261:164::-;39352:7;;-1:-1:-1;;;;;39352:7:0;39338:10;:21;39330:47;;;;-1:-1:-1;;;39330:47:0;;;;;;;:::i;:::-;39388:20;;;;:11;:20;;;;;;:29;;-1:-1:-1;;39388:29:0;;;;;;;;;;39261:164::o;41967:100::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;42041:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;36365:298::-:0;36429:7;36467:13;;36457:7;:23;36449:52;;;;-1:-1:-1;;;36449:52:0;;19671:2:1;36449:52:0;;;19653:21:1;19710:2;19690:18;;;19683:30;-1:-1:-1;;;19729:18:1;;;19722:46;19785:18;;36449:52:0;19643:166:1;36449:52:0;36527:7;36545:80;36557:1;36552:2;:6;:37;;;;-1:-1:-1;36587:1:0;36562:13;;;:9;:13;;;;;;-1:-1:-1;;;;;36562:13:0;:27;36552:37;36545:80;;;36606:7;36612:1;36606:7;;:::i;:::-;;;36545:80;;;36642:13;;;;:9;:13;;;;;;-1:-1:-1;;;;;36642:13:0;;36365:298;-1:-1:-1;;36365:298:0:o;35780:104::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;35852:15:::1;:24:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;35852:24:0::1;-1:-1:-1::0;;;;35852:24:0;;::::1;::::0;;;::::1;::::0;;35780:104::o;32980:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30780:90::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;30846:6:::1;:16:::0;;-1:-1:-1;;;;;;30846:16:0::1;-1:-1:-1::0;;;;;30846:16:0;;;::::1;::::0;;;::::1;::::0;;30780:90::o;35676:96::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;35745:11:::1;:19:::0;35676:96::o;29389:85::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;29464:1:::1;29448:18:::0;;-1:-1:-1;;;;;;29448:18:0::1;::::0;;29389:85::o;36067:80::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;36121:11:::1;:18:::0;;-1:-1:-1;;36121:18:0::1;;;::::0;;36067:80::o;33632:87::-;33671:13;33704:7;33697:14;;;;;:::i;37952:886::-;38069:15;;38045:10;38032:24;;;;:12;:24;;;;;;-1:-1:-1;;;38069:15:0;;;;;;38032:33;;38059:6;;38032:33;:::i;:::-;:52;;38010:129;;;;-1:-1:-1;;;38010:129:0;;17383:2:1;38010:129:0;;;17365:21:1;17422:2;17402:18;;;17395:30;17461:29;17441:18;;;17434:57;17508:18;;38010:129:0;17355:177:1;38010:129:0;38185:13;;;-1:-1:-1;;;38185:13:0;;;;;38158:23;;38175:6;;-1:-1:-1;;;38158:14:0;;;:23;:::i;:::-;:40;;38150:67;;;;-1:-1:-1;;;38150:67:0;;14321:2:1;38150:67:0;;;14303:21:1;14360:2;14340:18;;;14333:30;-1:-1:-1;;;14379:18:1;;;14372:44;14433:18;;38150:67:0;14293:164:1;38150:67:0;38236:11;;;;;;;38228:43;;;;-1:-1:-1;;;38228:43:0;;21453:2:1;38228:43:0;;;21435:21:1;21492:2;21472:18;;;21465:30;-1:-1:-1;;;21511:18:1;;;21504:49;21570:18;;38228:43:0;21425:169:1;38228:43:0;38284:17;38311:6;38304:4;;:13;;;;:::i;:::-;38284:33;;38349:9;38336;:22;;38328:55;;;;-1:-1:-1;;;38328:55:0;;17739:2:1;38328:55:0;;;17721:21:1;17778:2;17758:18;;;17751:30;-1:-1:-1;;;17797:18:1;;;17790:50;17857:18;;38328:55:0;17711:170:1;38328:55:0;38412:9;38400;:21;38396:105;;;38446:10;38438:51;38467:21;38479:9;38467;:21;:::i;:::-;38438:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38396:105;38518:9;38513:197;38537:6;38533:1;:10;38513:197;;;38601:26;38625:1;38609:13;;:17;;;;:::i;38601:26::-;38568:11;:30;38596:1;38580:13;;:17;;;;:::i;:::-;38568:30;;;;;;;;;;;-1:-1:-1;38568:30:0;:59;38680:13;;:17;;38696:1;;38680:17;:::i;:::-;38647:51;;38668:10;;38664:1;;-1:-1:-1;;;;;;;;;;;38647:51:0;38664:1;;38647:51;38545:6;38550:1;38545:6;;:::i;:::-;;;38513:197;;;;38722:25;38728:10;38740:6;38722:5;:25::i;:::-;38784:6;38760:31;;:14;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38823:6;38802:28;;:11;;:28;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37952:886;;:::o;34457:185::-;34584:50;34603:10;34615:8;34625;34584:18;:50::i;35980:79::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;36032:11:::1;:19:::0;;-1:-1:-1;;36032:19:0::1;::::0;;35980:79::o;42521:71::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;42569:8:::1;:15:::0;;-1:-1:-1;;;;;42569:15:0::1;-1:-1:-1::0;;;42569:15:0::1;::::0;;42521:71::o;33008:27::-;;;;;;;:::i;40055:336::-;40214:28;40224:4;40230:2;40234:7;40214:9;:28::i;:::-;40260:48;40283:4;40289:2;40293:7;40302:5;40260:22;:48::i;:::-;40255:129;;40332:40;;-1:-1:-1;;;40332:40:0;;;;;;;;;;;40255:129;40055:336;;;;:::o;33042:27::-;;;;;;;:::i;38846:241::-;33271:14;;-1:-1:-1;;;;;33271:14:0;33257:10;:28;33249:70;;;;-1:-1:-1;;;33249:70:0;;12847:2:1;33249:70:0;;;12829:21:1;12886:2;12866:18;;;12859:30;12925:31;12905:18;;;12898:59;12974:18;;33249:70:0;12819:179:1;33249:70:0;38947:13:::1;::::0;;38935:26:::1;::::0;;;:11:::1;:26;::::0;;;;;:35;;;39011:13;;38986:39;;-1:-1:-1;;;;;38986:39:0;::::1;::::0;38935:26;-1:-1:-1;;;;;;;;;;;38986:39:0;38935:26;;38986:39:::1;39038:12;39044:2;39048:1;39038:5;:12::i;:::-;39078:1;39063:11;;:16;;;;;;;;;;;;;;;;:::i;41299:660::-:0;41414:11;;41355:13;;-1:-1:-1;;;41414:11:0;;;;41403:22;;;41381:119;;;;-1:-1:-1;;;41381:119:0;;18501:2:1;41381:119:0;;;18483:21:1;18540:2;18520:18;;;18513:30;18579:34;18559:18;;;18552:62;-1:-1:-1;;;18630:18:1;;;18623:45;18685:19;;41381:119:0;18473:237:1;41381:119:0;41517:8;;-1:-1:-1;;;41517:8:0;;;;41513:70;;41558:13;41551:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41299:660;;;:::o;41513:70::-;41595:28;41626:7;41595:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41695:1;41670:14;41664:28;:32;:287;;;;;;;;;;;;;;;;;41788:14;41829:18;:7;:16;:18::i;:::-;41874:13;41745:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41664:287;41644:307;41299:660;-1:-1:-1;;;41299:660:0:o;42410:103::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;42482:13:::1;:23:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;42482:23:0::1;-1:-1:-1::0;;;;42482:23:0;;::::1;::::0;;;::::1;::::0;;42410:103::o;42187:104::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;42263:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;36671:282::-:0;36729:4;36764:13;;36754:7;:23;36746:52;;;;-1:-1:-1;;;36746:52:0;;19671:2:1;36746:52:0;;;19653:21:1;19710:2;19690:18;;;19683:30;-1:-1:-1;;;19729:18:1;;;19722:46;19785:18;;36746:52:0;19643:166:1;36746:52:0;36824:7;36842:72;36854:1;36849:2;:6;:29;;;;-1:-1:-1;36859:14:0;;;;:10;:14;;;;;;:19;36849:29;36842:72;;;36895:7;36901:1;36895:7;;:::i;:::-;;;36842:72;;;36931:14;;;;:10;:14;;;;;;;36671:282;-1:-1:-1;;36671:282:0:o;35370:106::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;35444:14:::1;:24:::0;;-1:-1:-1;;;;;;35444:24:0::1;-1:-1:-1::0;;;;;35444:24:0;;;::::1;::::0;;;::::1;::::0;;35370:106::o;29791:497::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;29918:9:::1;:16:::0;29899:35;::::1;29877:129;;;::::0;-1:-1:-1;;;29877:129:0;;13908:2:1;29877:129:0::1;::::0;::::1;13890:21:1::0;13947:2;13927:18;;;13920:30;13986:34;13966:18;;;13959:62;-1:-1:-1;;;14037:18:1;;;14030:42;14089:19;;29877:129:0::1;13880:234:1::0;29877:129:0::1;30019:11;30050:9:::0;30045:91:::1;30065:19:::0;;::::1;30045:91;;;30113:8;;30122:1;30113:11;;;;;-1:-1:-1::0;;;30113:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30106:18;::::0;::::1;;::::0;::::1;:::i;:::-;::::0;-1:-1:-1;30086:3:0;::::1;::::0;::::1;:::i;:::-;;;;30045:91;;;;30154:3;30161:5;30154:12;30146:62;;;::::0;-1:-1:-1;;;30146:62:0;;18917:2:1;30146:62:0::1;::::0;::::1;18899:21:1::0;18956:2;18936:18;;;18929:30;18995:34;18975:18;;;18968:62;-1:-1:-1;;;19046:18:1;;;19039:35;19091:19;;30146:62:0::1;18889:227:1::0;30146:62:0::1;30221:22;30228:15;;30221:22;:::i;:::-;30254:26;:15;30272:8:::0;;30254:26:::1;:::i;34650:214::-:0;-1:-1:-1;;;;;34821:25:0;;;34792:4;34821:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34650:214::o;29280:101::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;29356:5:::1;:17:::0;;-1:-1:-1;;;;;;29356:17:0::1;-1:-1:-1::0;;;;;29356:17:0;;;::::1;::::0;;;::::1;::::0;;29280:101::o;29643:140::-;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;29726:16:::1;29733:9;;29726:16;:::i;:::-;29753:22;:9;29765:10:::0;;29753:22:::1;:::i;42075:104::-:0;29222:5;;-1:-1:-1;;;;;29222:5:0;29208:10;:19;29200:52;;;;-1:-1:-1;;;29200:52:0;;;;;;;:::i;:::-;42151:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;34872:167::-:0;34947:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34947:29:0;-1:-1:-1;;;;;34947:29:0;;;;;;;;:24;;35001:16;34947:24;35001:7;:16::i;:::-;-1:-1:-1;;;;;34992:39:0;;;;;;;;;;;34872:167;;:::o;30878:348::-;31031:34;;-1:-1:-1;;31048:4:0;8213:2:1;8209:15;;;8205:24;;31031:34:0;;;8193:37:1;31054:10:0;8264:15:1;;8260:24;8246:12;;;8239:46;30981:7:0;;;;8301:12:1;;31031:34:0;;;-1:-1:-1;;31031:34:0;;;;;;;;;;31021:45;;31031:34;31021:45;;;;10102:66:1;31108:58:0;;;10090:79:1;;;;10185:12;;;10178:28;;;31021:45:0;-1:-1:-1;10222:12:1;;31108:58:0;;;;;;;;;;;;31084:93;;;;;;31077:100;;31195:23;31208:9;;31195:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31195:4:0;;:23;-1:-1:-1;;31195:12:0;:23;-1:-1:-1;31195:23:0:i;:::-;31188:30;30878:348;-1:-1:-1;;;;30878:348:0:o;31580:345::-;31632:7;31835;31747;31756:4;;31780;31762:15;:22;;;;:::i;:::-;31730:55;;;;;;10640:19:1;;;;10675:12;;10668:28;;;;10712:12;;;10705:28;10749:12;;31730:55:0;;;;;;;;;;;;31698:106;;;;;;31672:147;;:170;;;;:::i;:::-;31652:4;:190;;;31864:6;-1:-1:-1;31853:27:0;;;-1:-1:-1;31879:1:0;;31580:345;-1:-1:-1;31580:345:0:o;31853:27::-;-1:-1:-1;31908:1:0;;31580:345;-1:-1:-1;31580:345:0:o;39433:259::-;-1:-1:-1;;;;;39496:13:0;;;;;;:9;:13;;;;;:23;;39513:6;;39496:13;:23;;39513:6;;39496:23;:::i;:::-;;;;-1:-1:-1;;;;;;;39530:16:0;;;;;;:12;:16;;;;;:26;;39550:6;;39530:16;:26;;39550:6;;39530:26;:::i;:::-;;;;-1:-1:-1;;39577:13:0;;;39567:24;;;;:9;:24;;;;;;;;:29;;-1:-1:-1;;;;;;39567:29:0;-1:-1:-1;;;;;39567:29:0;;;;;39618:13;;39607:25;;:10;:25;;;;;39635:15;39607:43;;39661:23;;39678:6;;39577:13;39567:24;39661:23;;39678:6;;39661:23;:::i;:::-;;;;-1:-1:-1;;;;39433:259:0:o;40399:892::-;40515:16;40534;40542:7;40534;:16::i;:::-;40572:20;;;;:11;:20;;;;;;40515:35;;-1:-1:-1;40572:20:0;;40571:21;40563:53;;;;-1:-1:-1;;;40563:53:0;;21801:2:1;40563:53:0;;;21783:21:1;21840:2;21820:18;;;21813:30;-1:-1:-1;;;21859:18:1;;;21852:49;21918:18;;40563:53:0;21773:169:1;40563:53:0;40643:2;-1:-1:-1;;;;;40635:10:0;:4;-1:-1:-1;;;;;40635:10:0;;;40627:54;;;;-1:-1:-1;;;40627:54:0;;22149:2:1;40627:54:0;;;22131:21:1;22188:2;22168:18;;;22161:30;22227:33;22207:18;;;22200:61;22278:18;;40627:54:0;22121:181:1;40627:54:0;40708:8;-1:-1:-1;;;;;40700:16:0;:4;-1:-1:-1;;;;;40700:16:0;;40692:49;;;;-1:-1:-1;;;40692:49:0;;16206:2:1;40692:49:0;;;16188:21:1;16245:2;16225:18;;;16218:30;-1:-1:-1;;;16264:18:1;;;16257:50;16324:18;;40692:49:0;16178:170:1;40692:49:0;40774:10;-1:-1:-1;;;;;40774:22:0;;;;:81;;;40817:38;40834:8;40844:10;40817:16;:38::i;:::-;40774:136;;;-1:-1:-1;40900:10:0;40876:20;40888:7;40876:11;:20::i;:::-;-1:-1:-1;;;;;40876:34:0;;40774:136;40752:199;;;;-1:-1:-1;;;40752:199:0;;;;;;;:::i;:::-;40964:29;40981:1;40985:7;40964:8;:29::i;:::-;41006:18;;;;:9;:18;;;;;:23;;-1:-1:-1;;;;;;41006:23:0;-1:-1:-1;;;;;41006:23:0;;;;;41059:11;41006:18;-1:-1:-1;41059:11:0;:::i;:::-;41042:28;-1:-1:-1;41114:1:0;41087:15;41042:28;41087:7;:15::i;:::-;-1:-1:-1;;;;;41087:29:0;;41083:90;;41133:17;;;;:9;:17;;;;;:28;;-1:-1:-1;;;;;;41133:28:0;-1:-1:-1;;;;;41133:28:0;;;;;41083:90;-1:-1:-1;;;;;41185:19:0;;;;;;:9;:19;;;;;:24;;41208:1;;41185:19;:24;;41208:1;;41185:24;:::i;:::-;;;;-1:-1:-1;;;;;;;41220:13:0;;;;;;:9;:13;;;;;:18;;41237:1;;41220:13;:18;;41237:1;;41220:18;:::i;:::-;;;;-1:-1:-1;;41256:27:0;;41275:7;;-1:-1:-1;;;;;41256:27:0;;;;;;;;-1:-1:-1;;;;;;;;;;;41256:27:0;;;;40399:892;;;;;:::o;14260:317::-;14375:6;14350:21;:31;;14342:73;;;;-1:-1:-1;;;14342:73:0;;15848:2:1;14342:73:0;;;15830:21:1;15887:2;15867:18;;;15860:30;15926:31;15906:18;;;15899:59;15975:18;;14342:73:0;15820:179:1;14342:73:0;14429:12;14447:9;-1:-1:-1;;;;;14447:14:0;14469:6;14447:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14428:52;;;14499:7;14491:78;;;;-1:-1:-1;;;14491:78:0;;15018:2:1;14491:78:0;;;15000:21:1;15057:2;15037:18;;;15030:30;15096:34;15076:18;;;15069:62;15167:28;15147:18;;;15140:56;15213:19;;14491:78:0;14990:248:1;35047:315:0;35202:8;-1:-1:-1;;;;;35193:17:0;:5;-1:-1:-1;;;;;35193:17:0;;;35185:55;;;;-1:-1:-1;;;35185:55:0;;14664:2:1;35185:55:0;;;14646:21:1;14703:2;14683:18;;;14676:30;14742:27;14722:18;;;14715:55;14787:18;;35185:55:0;14636:175:1;35185:55:0;-1:-1:-1;;;;;35251:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;35251:46:0;;;;;;;;;;35313:41;;11613::1;;;35313::0;;11586:18:1;35313:41:0;;;;;;;35047:315;;;:::o;42959:921::-;43114:4;-1:-1:-1;;;;;43135:13:0;;13294:19;:23;43131:742;;43188:173;;-1:-1:-1;;;43188:173:0;;-1:-1:-1;;;;;43188:36:0;;;;;:173;;43247:10;;43280:4;;43307:7;;43337:5;;43188:173;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43188:173:0;;;;;;;;-1:-1:-1;;43188:173:0;;;;;;;;;;;;:::i;:::-;;;43167:651;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43548:13:0;;43544:259;;43598:40;;-1:-1:-1;;;43598:40:0;;;;;;;;;;;43544:259;43753:6;43747:13;43738:6;43734:2;43730:15;43723:38;43167:651;-1:-1:-1;;;;;;43425:55:0;-1:-1:-1;;;43425:55:0;;-1:-1:-1;43418:62:0;;43131:742;-1:-1:-1;43857:4:0;42959:921;;;;;;:::o;473:723::-;529:13;750:10;746:53;;-1:-1:-1;;777:10:0;;;;;;;;;;;;-1:-1:-1;;;777:10:0;;;;;473:723::o;746:53::-;824:5;809:12;865:78;872:9;;865:78;;898:8;;;;:::i;:::-;;-1:-1:-1;921:10:0;;-1:-1:-1;929:2:0;921:10;;:::i;:::-;;;865:78;;;953:19;985:6;975:17;;;;;;-1:-1:-1;;;975:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;975:17:0;;953:39;;1003:154;1010:10;;1003:154;;1037:11;1047:1;1037:11;;:::i;:::-;;-1:-1:-1;1106:10:0;1114:2;1106:5;:10;:::i;:::-;1093:24;;:2;:24;:::i;:::-;1080:39;;1063:6;1070;1063:14;;;;;;-1:-1:-1;;;1063:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;1063:56:0;;;;;;;;-1:-1:-1;1134:11:0;1143:2;1134:11;;:::i;:::-;;;1003:154;;6649:231;6727:7;6748:17;6767:18;6789:27;6800:4;6806:9;6789:10;:27::i;:::-;6747:69;;;;6827:18;6839:5;6827:11;:18::i;:::-;-1:-1:-1;6863:9:0;6649:231;-1:-1:-1;;;6649:231:0:o;4539:1308::-;4620:7;4629:12;4854:9;:16;4874:2;4854:22;4850:990;;;5150:4;5135:20;;5129:27;5200:4;5185:20;;5179:27;5258:4;5243:20;;5237:27;4893:9;5229:36;5301:25;5312:4;5229:36;5129:27;5179;5301:10;:25::i;:::-;5294:32;;;;;;;;;4850:990;5348:9;:16;5368:2;5348:22;5344:496;;;5623:4;5608:20;;5602:27;5674:4;5659:20;;5653:27;5716:23;5727:4;5602:27;5653;5716:10;:23::i;:::-;5709:30;;;;;;;;5344:496;-1:-1:-1;5788:1:0;;-1:-1:-1;5792:35:0;5344:496;4539:1308;;;;;:::o;2810:643::-;2888:20;2879:5;:29;;;;;;-1:-1:-1;;;2879:29:0;;;;;;;;;;2875:571;;;2810:643;:::o;2875:571::-;2986:29;2977:5;:38;;;;;;-1:-1:-1;;;2977:38:0;;;;;;;;;;2973:473;;;3032:34;;-1:-1:-1;;;3032:34:0;;12494:2:1;3032:34:0;;;12476:21:1;12533:2;12513:18;;;12506:30;12572:26;12552:18;;;12545:54;12616:18;;3032:34:0;12466:174:1;2973:473:0;3097:35;3088:5;:44;;;;;;-1:-1:-1;;;3088:44:0;;;;;;;;;;3084:362;;;3149:41;;-1:-1:-1;;;3149:41:0;;13205:2:1;3149:41:0;;;13187:21:1;13244:2;13224:18;;;13217:30;13283:33;13263:18;;;13256:61;13334:18;;3149:41:0;13177:181:1;3084:362:0;3221:30;3212:5;:39;;;;;;-1:-1:-1;;;3212:39:0;;;;;;;;;;3208:238;;;3268:44;;-1:-1:-1;;;3268:44:0;;15445:2:1;3268:44:0;;;15427:21:1;15484:2;15464:18;;;15457:30;15523:34;15503:18;;;15496:62;-1:-1:-1;;;15574:18:1;;;15567:32;15616:19;;3268:44:0;15417:224:1;3208:238:0;3343:30;3334:5;:39;;;;;;-1:-1:-1;;;3334:39:0;;;;;;;;;;3330:116;;;3390:44;;-1:-1:-1;;;3390:44:0;;16980:2:1;3390:44:0;;;16962:21:1;17019:2;16999:18;;;16992:30;17058:34;17038:18;;;17031:62;-1:-1:-1;;;17109:18:1;;;17102:32;17151:19;;3390:44:0;16952:224:1;3330:116:0;2810:643;:::o;8101:1632::-;8232:7;;9166:66;9153:79;;9149:163;;;-1:-1:-1;9265:1:0;;-1:-1:-1;9269:30:0;9249:51;;9149:163;9326:1;:7;;9331:2;9326:7;;:18;;;;;9337:1;:7;;9342:2;9337:7;;9326:18;9322:102;;;-1:-1:-1;9377:1:0;;-1:-1:-1;9381:30:0;9361:51;;9322:102;9538:24;;;9521:14;9538:24;;;;;;;;;11892:25:1;;;11965:4;11953:17;;11933:18;;;11926:45;;;;11987:18;;;11980:34;;;12030:18;;;12023:34;;;9538:24:0;;11864:19:1;;9538:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9538:24:0;;-1:-1:-1;;9538:24:0;;;-1:-1:-1;;;;;;;9577:20:0;;9573:103;;9630:1;9634:29;9614:50;;;;;;;9573:103;9696:6;-1:-1:-1;9704:20:0;;-1:-1:-1;8101:1632:0;;;;;;;;:::o;7143:344::-;7257:7;;-1:-1:-1;;;;;7303:80:0;;7257:7;7410:25;7426:3;7411:18;;;7433:2;7410:25;:::i;:::-;7394:42;;7454:25;7465:4;7471:1;7474;7477;7454:10;:25::i;:::-;7447:32;;;;;;7143:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:391::-;891:8;901:6;955:3;948:4;940:6;936:17;932:27;922:2;;978:6;970;963:22;922:2;-1:-1:-1;1006:20:1;;1049:18;1038:30;;1035:2;;;1088:8;1078;1071:26;1035:2;1132:4;1124:6;1120:17;1108:29;;1192:3;1185:4;1175:6;1172:1;1168:14;1160:6;1156:27;1152:38;1149:47;1146:2;;;1209:1;1206;1199:12;1224:160;1289:20;;1345:13;;1338:21;1328:32;;1318:2;;1374:1;1371;1364:12;1389:196;1448:6;1501:2;1489:9;1480:7;1476:23;1472:32;1469:2;;;1522:6;1514;1507:22;1469:2;1550:29;1569:9;1550:29;:::i;1590:270::-;1658:6;1666;1719:2;1707:9;1698:7;1694:23;1690:32;1687:2;;;1740:6;1732;1725:22;1687:2;1768:29;1787:9;1768:29;:::i;:::-;1758:39;;1816:38;1850:2;1839:9;1835:18;1816:38;:::i;:::-;1806:48;;1677:183;;;;;:::o;1865:338::-;1942:6;1950;1958;2011:2;1999:9;1990:7;1986:23;1982:32;1979:2;;;2032:6;2024;2017:22;1979:2;2060:29;2079:9;2060:29;:::i;:::-;2050:39;;2108:38;2142:2;2131:9;2127:18;2108:38;:::i;:::-;2098:48;;2193:2;2182:9;2178:18;2165:32;2155:42;;1969:234;;;;;:::o;2208:696::-;2303:6;2311;2319;2327;2380:3;2368:9;2359:7;2355:23;2351:33;2348:2;;;2402:6;2394;2387:22;2348:2;2430:29;2449:9;2430:29;:::i;:::-;2420:39;;2478:38;2512:2;2501:9;2497:18;2478:38;:::i;:::-;2468:48;;2563:2;2552:9;2548:18;2535:32;2525:42;;2618:2;2607:9;2603:18;2590:32;2645:18;2637:6;2634:30;2631:2;;;2682:6;2674;2667:22;2631:2;2710:22;;2763:4;2755:13;;2751:27;-1:-1:-1;2741:2:1;;2797:6;2789;2782:22;2741:2;2825:73;2890:7;2885:2;2872:16;2867:2;2863;2859:11;2825:73;:::i;:::-;2815:83;;;2338:566;;;;;;;:::o;2909:264::-;2974:6;2982;3035:2;3023:9;3014:7;3010:23;3006:32;3003:2;;;3056:6;3048;3041:22;3003:2;3084:29;3103:9;3084:29;:::i;:::-;3074:39;;3132:35;3163:2;3152:9;3148:18;3132:35;:::i;3178:264::-;3246:6;3254;3307:2;3295:9;3286:7;3282:23;3278:32;3275:2;;;3328:6;3320;3313:22;3275:2;3356:29;3375:9;3356:29;:::i;:::-;3346:39;3432:2;3417:18;;;;3404:32;;-1:-1:-1;;;3265:177:1:o;3447:457::-;3533:6;3541;3594:2;3582:9;3573:7;3569:23;3565:32;3562:2;;;3615:6;3607;3600:22;3562:2;3660:9;3647:23;3693:18;3685:6;3682:30;3679:2;;;3730:6;3722;3715:22;3679:2;3774:70;3836:7;3827:6;3816:9;3812:22;3774:70;:::i;:::-;3863:8;;3748:96;;-1:-1:-1;3552:352:1;-1:-1:-1;;;;3552:352:1:o;4370:255::-;4428:6;4481:2;4469:9;4460:7;4456:23;4452:32;4449:2;;;4502:6;4494;4487:22;4449:2;4546:9;4533:23;4565:30;4589:5;4565:30;:::i;4630:259::-;4699:6;4752:2;4740:9;4731:7;4727:23;4723:32;4720:2;;;4773:6;4765;4758:22;4720:2;4810:9;4804:16;4829:30;4853:5;4829:30;:::i;4894:480::-;4963:6;5016:2;5004:9;4995:7;4991:23;4987:32;4984:2;;;5037:6;5029;5022:22;4984:2;5082:9;5069:23;5115:18;5107:6;5104:30;5101:2;;;5152:6;5144;5137:22;5101:2;5180:22;;5233:4;5225:13;;5221:27;-1:-1:-1;5211:2:1;;5267:6;5259;5252:22;5211:2;5295:73;5360:7;5355:2;5342:16;5337:2;5333;5329:11;5295:73;:::i;5379:292::-;5437:6;5490:2;5478:9;5469:7;5465:23;5461:32;5458:2;;;5511:6;5503;5496:22;5458:2;5555:9;5542:23;5605:6;5598:5;5594:18;5587:5;5584:29;5574:2;;5632:6;5624;5617:22;5676:190;5735:6;5788:2;5776:9;5767:7;5763:23;5759:32;5756:2;;;5809:6;5801;5794:22;5756:2;-1:-1:-1;5837:23:1;;5746:120;-1:-1:-1;5746:120:1:o;5871:258::-;5936:6;5944;5997:2;5985:9;5976:7;5972:23;5968:32;5965:2;;;6018:6;6010;6003:22;5965:2;6059:9;6046:23;6036:33;;6088:35;6119:2;6108:9;6104:18;6088:35;:::i;6134:709::-;6213:6;6221;6229;6282:2;6270:9;6261:7;6257:23;6253:32;6250:2;;;6303:6;6295;6288:22;6250:2;6344:9;6331:23;6321:33;;6405:2;6394:9;6390:18;6377:32;6428:18;6469:2;6461:6;6458:14;6455:2;;;6490:6;6482;6475:22;6455:2;6533:6;6522:9;6518:22;6508:32;;6578:7;6571:4;6567:2;6563:13;6559:27;6549:2;;6605:6;6597;6590:22;6549:2;6650;6637:16;6676:2;6668:6;6665:14;6662:2;;;6697:6;6689;6682:22;6662:2;6747:7;6742:2;6733:6;6729:2;6725:15;6721:24;6718:37;6715:2;;;6773:6;6765;6758:22;6715:2;6809;6805;6801:11;6791:21;;6831:6;6821:16;;;;;6240:603;;;;;:::o;6848:258::-;6916:6;6924;6977:2;6965:9;6956:7;6952:23;6948:32;6945:2;;;6998:6;6990;6983:22;6945:2;-1:-1:-1;;7026:23:1;;;7096:2;7081:18;;;7068:32;;-1:-1:-1;6935:171:1:o;7111:296::-;7169:6;7222:2;7210:9;7201:7;7197:23;7193:32;7190:2;;;7243:6;7235;7228:22;7190:2;7287:9;7274:23;7337:10;7330:5;7326:22;7319:5;7316:33;7306:2;;7368:6;7360;7353:22;7412:289;7469:6;7522:2;7510:9;7501:7;7497:23;7493:32;7490:2;;;7543:6;7535;7528:22;7490:2;7587:9;7574:23;7637:4;7630:5;7626:16;7619:5;7616:27;7606:2;;7662:6;7654;7647:22;7706:257;7747:3;7785:5;7779:12;7812:6;7807:3;7800:19;7828:63;7884:6;7877:4;7872:3;7868:14;7861:4;7854:5;7850:16;7828:63;:::i;:::-;7945:2;7924:15;-1:-1:-1;;7920:29:1;7911:39;;;;7952:4;7907:50;;7755:208;-1:-1:-1;;7755:208:1:o;8324:1531::-;8548:3;8586:6;8580:13;8612:4;8625:51;8669:6;8664:3;8659:2;8651:6;8647:15;8625:51;:::i;:::-;8739:13;;8698:16;;;;8761:55;8739:13;8698:16;8783:15;;;8761:55;:::i;:::-;8907:13;;8838:20;;;8878:3;;8967:1;8989:18;;;;9042;;;;9069:2;;9147:4;9137:8;9133:19;9121:31;;9069:2;9210;9200:8;9197:16;9177:18;9174:40;9171:2;;;-1:-1:-1;;;9237:33:1;;9293:4;9290:1;9283:15;9323:4;9244:3;9311:17;9171:2;9354:18;9381:110;;;;9505:1;9500:330;;;;9347:483;;9381:110;-1:-1:-1;;9416:24:1;;9402:39;;9461:20;;;;-1:-1:-1;9381:110:1;;9500:330;23269:4;23288:17;;;23338:4;23322:21;;9595:3;9611:169;9625:8;9622:1;9619:15;9611:169;;;9707:14;;9692:13;;;9685:37;9750:16;;;;9642:10;;9611:169;;;9615:3;;9811:8;9804:5;9800:20;9793:27;;9347:483;-1:-1:-1;9846:3:1;;8556:1299;-1:-1:-1;;;;;;;;;;;8556:1299:1:o;10980:488::-;-1:-1:-1;;;;;11249:15:1;;;11231:34;;11301:15;;11296:2;11281:18;;11274:43;11348:2;11333:18;;11326:34;;;11396:3;11391:2;11376:18;;11369:31;;;11174:4;;11417:45;;11442:19;;11434:6;11417:45;:::i;:::-;11409:53;11183:285;-1:-1:-1;;;;;;11183:285:1:o;12068:219::-;12217:2;12206:9;12199:21;12180:4;12237:44;12277:2;12266:9;12262:18;12254:6;12237:44;:::i;20216:344::-;20418:2;20400:21;;;20457:2;20437:18;;;20430:30;-1:-1:-1;;;20491:2:1;20476:18;;20469:50;20551:2;20536:18;;20390:170::o;20565:337::-;20767:2;20749:21;;;20806:2;20786:18;;;20779:30;-1:-1:-1;;;20840:2:1;20825:18;;20818:43;20893:2;20878:18;;20739:163::o;23354:224::-;23393:3;23421:6;23454:2;23451:1;23447:10;23484:2;23481:1;23477:10;23515:3;23511:2;23507:12;23502:3;23499:21;23496:2;;;23523:18;;:::i;:::-;23559:13;;23401:177;-1:-1:-1;;;;23401:177:1:o;23583:128::-;23623:3;23654:1;23650:6;23647:1;23644:13;23641:2;;;23660:18;;:::i;:::-;-1:-1:-1;23696:9:1;;23631:80::o;23716:120::-;23756:1;23782;23772:2;;23787:18;;:::i;:::-;-1:-1:-1;23821:9:1;;23762:74::o;23841:168::-;23881:7;23947:1;23943;23939:6;23935:14;23932:1;23929:21;23924:1;23917:9;23910:17;23906:45;23903:2;;;23954:18;;:::i;:::-;-1:-1:-1;23994:9:1;;23893:116::o;24014:125::-;24054:4;24082:1;24079;24076:8;24073:2;;;24087:18;;:::i;:::-;-1:-1:-1;24124:9:1;;24063:76::o;24144:258::-;24216:1;24226:113;24240:6;24237:1;24234:13;24226:113;;;24316:11;;;24310:18;24297:11;;;24290:39;24262:2;24255:10;24226:113;;;24357:6;24354:1;24351:13;24348:2;;;-1:-1:-1;;24392:1:1;24374:16;;24367:27;24197:205::o;24407:380::-;24486:1;24482:12;;;;24529;;;24550:2;;24604:4;24596:6;24592:17;24582:27;;24550:2;24657;24649:6;24646:14;24626:18;24623:38;24620:2;;;24703:10;24698:3;24694:20;24691:1;24684:31;24738:4;24735:1;24728:15;24766:4;24763:1;24756:15;24620:2;;24462:325;;;:::o;24792:135::-;24831:3;-1:-1:-1;;24852:17:1;;24849:2;;;24872:18;;:::i;:::-;-1:-1:-1;24919:1:1;24908:13;;24839:88::o;24932:112::-;24964:1;24990;24980:2;;24995:18;;:::i;:::-;-1:-1:-1;25029:9:1;;24970:74::o;25049:127::-;25110:10;25105:3;25101:20;25098:1;25091:31;25141:4;25138:1;25131:15;25165:4;25162:1;25155:15;25181:127;25242:10;25237:3;25233:20;25230:1;25223:31;25273:4;25270:1;25263:15;25297:4;25294:1;25287:15;25313:127;25374:10;25369:3;25365:20;25362:1;25355:31;25405:4;25402:1;25395:15;25429:4;25426:1;25419:15;25445:131;-1:-1:-1;;;;;;25519:32:1;;25509:43;;25499:2;;25566:1;25563;25556:12
Swarm Source
ipfs://44a8aa8560354f4683ec0bcd96db266f432cbd6082ef6057646b98bd62c8f50b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.