Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
300 PNW2
Holders
124
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 PNW2Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Pigeons2
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-22 */ // SPDX-License-Identifier: MIT //Developer Info: //Written by Blockchainguy.net //Email: [email protected] //Instagram: @sheraz.manzoor pragma solidity ^0.8.0; pragma solidity ^0.8.0; interface IERC165 { function supportsInterface(bytes4 interfaceId) external view returns (bool); } pragma solidity ^0.8.0; interface IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } pragma solidity ^0.8.0; interface IERC721 is IERC165 { event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address owner); function safeTransferFrom( address from, address to, uint256 tokenId ) external; function transferFrom( address from, address to, uint256 tokenId ) external; function approve(address to, uint256 tokenId) external; function getApproved(uint256 tokenId) external view returns (address operator); function setApprovalForAll(address operator, bool _approved) external; function isApprovedForAll(address owner, address operator) external view returns (bool); function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } pragma solidity ^0.8.0; interface IERC721Metadata is IERC721 { function name() external view returns (string memory); function symbol() external view returns (string memory); function tokenURI(uint256 tokenId) external view returns (string memory); } pragma solidity ^0.8.0; interface IERC721Enumerable is IERC721 { function totalSupply() external view returns (uint256); function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); function tokenByIndex(uint256 index) external view returns (uint256); } pragma solidity ^0.8.1; library Address { function isContract(address account) internal view returns (bool) { return account.code.length > 0; } 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" ); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } 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" ); } 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); } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } 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); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } 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); } function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } pragma solidity ^0.8.0; abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() { _setOwner(_msgSender()); } function owner() public view virtual returns (address) { return _owner; } modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; function toString(uint256 value) internal pure returns (string memory) { // 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); } 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); } 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); } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; abstract contract ERC165 is IERC165 { function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.0; abstract contract ReentrancyGuard { // word because each write operation emits an extra SLOAD to first read the // back. This is the compiler's defense against contract upgrades and // but in exchange the refund on every call to nonReentrant will be lower in // transaction's gas, it is best to keep them low in cases like this one, to uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } modifier nonReentrant() { require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); _status = _ENTERED; _; // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } pragma solidity ^0.8.0; contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; string private _name; string private _symbol; // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; mapping(address => AddressData) private _addressData; mapping(uint256 => address) private _tokenApprovals; mapping(address => mapping(address => bool)) private _operatorApprovals; constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } function totalSupply() public view override returns (uint256) { return currentIndex; } function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } function balanceOf(address owner) public view override returns (uint256) { require( owner != address(0), "ERC721A: balance query for the zero address" ); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } function _baseURI() internal view virtual returns (string memory) { return ""; } function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } function getApproved(uint256 tokenId) public view override returns (address) { require( _exists(tokenId), "ERC721A: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } 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); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721A: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } pragma solidity ^0.8.0; library MerkleProof { function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { computedHash = _efficientHash(computedHash, proofElement); } else { computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } 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)); } } abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } contract Pigeons2 is EIP712, Ownable, ERC721A, ReentrancyGuard { string private constant SIGNING_DOMAIN = "WEB3CLUB"; string private constant SIGNATURE_VERSION = "1"; bool public publicSale = false; bool public privateSale = false; uint256 public maxPerTx = 3; uint256 public maxPerAddress = 3; uint256 public maxToken = 300; uint256 public mintLimit = 135; uint256 public price = 0.07 ether; string private _baseTokenURI= "https://jher.vercel.app/api/nft/"; string public _extension = ""; address private whitelistVerify = 0xbF3e689B25F460F695FC5a6715aA9c74de79e52F; mapping(uint => uint256) public voucherIds; constructor() ERC721A("Pigeons of New York: Phase 2", "PNW2", 1000, maxToken) EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION) {} modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } function mint(uint256 quantity) external payable callerIsUser { require(publicSale, "SALE_HAS_NOT_STARTED_YET"); require(totalSupply() + quantity < maxToken, "NOT_ENOUGH_SUPPLY_TO_MINT_DESIRED_AMOUNT"); require(totalSupply() + quantity < mintLimit, "Exceeding Mint Reached."); require(quantity > 0, "CANNOT_MINT_THAT_MANY"); require(msg.value == price * quantity, "INVALID_ETH"); _safeMint(msg.sender, quantity); } function mint_presale(uint256 quantity, uint256 id, bytes memory signature) public payable { require(publicSale, "SALE_HAS_NOT_STARTED_YET"); require(totalSupply() + quantity < maxToken, "NOT_ENOUGH_SUPPLY_TO_MINT_DESIRED_AMOUNT"); require(totalSupply() + quantity < mintLimit, "Exceeding Mint Reached."); require(quantity > 0, "CANNOT_MINT_THAT_MANY"); require(quantity <= maxPerTx, "You cannot mint more than the limit."); require(numberMinted(msg.sender) + quantity <= maxPerAddress, "PER_WALLET_LIMIT_REACHED"); require(msg.value == price * quantity, "INVALID_ETH"); require(check(id,signature) == whitelistVerify, "You are not whitelisted."); require(voucherIds[id] == 0, "Invalid Voucher. Try Again."); _safeMint(msg.sender, quantity); voucherIds[id] = 1; } function sendGifts(address[] memory _wallets) external onlyOwner{ require(totalSupply() + _wallets.length <= maxToken, "Max Supply Reached."); for(uint i = 0; i < _wallets.length; i++) _safeMint(_wallets[i], 1); } function sendGiftsToWallet(address _wallet, uint256 _num) external onlyOwner{ require(totalSupply() + _num <= maxToken, "Max Supply Reached."); _safeMint(_wallet, _num); } function check(uint id, bytes memory signature) public view returns(address){ return _verify(id, signature); } function _verify(uint id, bytes memory signature) internal view returns(address){ bytes32 digest = _hash(id); return ECDSA.recover(digest, signature); } function _hash(uint id) internal view returns(bytes32){ return _hashTypedDataV4(keccak256(abi.encode( keccak256("EIP712Domain(uint id)"), id ))); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setPrice(uint256 _PriceInWEI) external onlyOwner { price = _PriceInWEI; } function setMaxLimits(uint256 t_max_per_tx, uint256 t_max_per_address) external onlyOwner { maxPerTx = t_max_per_tx; maxPerAddress = t_max_per_address; } function setMintLimit(uint256 temp) external onlyOwner { mintLimit = temp; } function flipMintState() external onlyOwner { publicSale = !publicSale; } function flipPresaleState() external onlyOwner { privateSale = !privateSale; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function withdraw() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } function updateExtension(string memory _temp) onlyOwner public { _extension = _temp; } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) { return ownershipOf(tokenId); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory _tokenURI = super.tokenURI(tokenId); return bytes(_tokenURI).length > 0 ? string(abi.encodePacked(_tokenURI, _extension)) : ""; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_extension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"check","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"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":"maxPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint_presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"sendGifts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_num","type":"uint256"}],"name":"sendGiftsToWallet","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"t_max_per_tx","type":"uint256"},{"internalType":"uint256","name":"t_max_per_address","type":"uint256"}],"name":"setMaxLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"temp","type":"uint256"}],"name":"setMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_PriceInWEI","type":"uint256"}],"name":"setPrice","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_temp","type":"string"}],"name":"updateExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"voucherIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60006001819055600855600a805461ffff191690556003600b819055600c5561012c600d556087600e5566f8b0a10e470000600f556101c060405260206101808190527f68747470733a2f2f6a6865722e76657263656c2e6170702f6170692f6e66742f6101a09081526200007891601091906200036d565b5060408051602081019182905260009081905262000099916011916200036d565b50601280546001600160a01b03191673bf3e689b25f460f695fc5a6715aa9c74de79e52f179055348015620000cd57600080fd5b50604080518082018252601c81527f506967656f6e73206f66204e657720596f726b3a20506861736520320000000060208083019190915282518084018452600481526328272b9960e11b81830152600d548451808601865260088152672ba2a119a1a62aa160c11b8185019081528651808801885260018152603160f81b908601529051902060e08190527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66101008190524660a081815288517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818901819052818b0195909552606081810194909452608080820193909352308183018190528a51808303909301835260c0918201909a528151919097012090529590951b909252610120939093529091906103e8906200020a336200031d565b60008111620002775760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620002d95760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b60648201526084016200026e565b8351620002ee9060029060208701906200036d565b508251620003049060039060208601906200036d565b5061016091909152610140525050600160095562000450565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200037b9062000413565b90600052602060002090601f0160209004810192826200039f5760008555620003ea565b82601f10620003ba57805160ff1916838001178555620003ea565b82800160010185558215620003ea579182015b82811115620003ea578251825591602001919060010190620003cd565b50620003f8929150620003fc565b5090565b5b80821115620003f85760008155600101620003fd565b600181811c908216806200042857607f821691505b602082108114156200044a57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160601c60e051610100516101205161014051610160516133dd620004c460003960008181611cce01528181611cf8015261214e01526000505060006127f3015260006128420152600061281d01526000612776015260006127a0015260006127ca01526133dd6000f3fe6080604052600436106102675760003560e01c80639231ab2a11610144578063c87b56dd116100b6578063dc33e6811161007a578063dc33e6811461070a578063e57deb391461072a578063e985e9c51461074a578063f2fde38b14610793578063f81227d4146107b3578063f968adbe146107c857600080fd5b8063c87b56dd1461068b578063ca69e323146106ab578063d1f919ed146106c1578063d7224ba0146106e1578063db5e735c146106f757600080fd5b8063a035b1fe11610108578063a035b1fe146105d6578063a0712d68146105ec578063a22cb465146105ff578063ab34ee4f1461061f578063b88d4fde1461064c578063ba1f879f1461066c57600080fd5b80639231ab2a1461051e57806395d89b411461056b578063996517cf146105805780639d913ef5146105965780639e6a1d7d146105b657600080fd5b80634f6ccce7116101dd57806370a08231116101a157806370a082311461046b578063715018a61461048b5780637c8255db146104a05780637e6182d9146104c05780638da5cb5b146104e057806391b7f5ed146104fe57600080fd5b80634f6ccce7146103e057806355f804b31461040057806359c74f29146104205780636352211e14610435578063639814e01461045557600080fd5b806323b872dd1161022f57806323b872dd1461033c5780632f745c591461035c57806333bc1c5c1461037c5780633ae1dd9d146103965780633ccfd60b146103ab57806342842e0e146103c057600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102c3578063095ea7b3146102fb57806318160ddd1461031d575b600080fd5b34801561027857600080fd5b5061028c610287366004612d5c565b6107de565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b661084b565b6040516102989190613068565b3480156102cf57600080fd5b506102e36102de366004612e4f565b6108dd565b6040516001600160a01b039091168152602001610298565b34801561030757600080fd5b5061031b610316366004612c7f565b61096d565b005b34801561032957600080fd5b506001545b604051908152602001610298565b34801561034857600080fd5b5061031b610357366004612ba0565b610a85565b34801561036857600080fd5b5061032e610377366004612c7f565b610a90565b34801561038857600080fd5b50600a5461028c9060ff1681565b3480156103a257600080fd5b506102b6610c08565b3480156103b757600080fd5b5061031b610c96565b3480156103cc57600080fd5b5061031b6103db366004612ba0565b610cef565b3480156103ec57600080fd5b5061032e6103fb366004612e4f565b610d0a565b34801561040c57600080fd5b5061031b61041b366004612d96565b610d73565b34801561042c57600080fd5b5061031b610da9565b34801561044157600080fd5b506102e3610450366004612e4f565b610de7565b34801561046157600080fd5b5061032e600c5481565b34801561047757600080fd5b5061032e610486366004612b52565b610df9565b34801561049757600080fd5b5061031b610e8a565b3480156104ac57600080fd5b5061031b6104bb366004612ca9565b610ec0565b3480156104cc57600080fd5b5061031b6104db366004612e07565b610f86565b3480156104ec57600080fd5b506000546001600160a01b03166102e3565b34801561050a57600080fd5b5061031b610519366004612e4f565b610fc3565b34801561052a57600080fd5b5061053e610539366004612e4f565b610ff2565b6040805182516001600160a01b031681526020928301516001600160401b03169281019290925201610298565b34801561057757600080fd5b506102b661100f565b34801561058c57600080fd5b5061032e600e5481565b3480156105a257600080fd5b5061031b6105b1366004612eae565b61101e565b3480156105c257600080fd5b5061031b6105d1366004612e4f565b611053565b3480156105e257600080fd5b5061032e600f5481565b61031b6105fa366004612e4f565b611082565b34801561060b57600080fd5b5061031b61061a366004612c43565b61124c565b34801561062b57600080fd5b5061032e61063a366004612e4f565b60136020526000908152604090205481565b34801561065857600080fd5b5061031b610667366004612bdc565b611311565b34801561067857600080fd5b50600a5461028c90610100900460ff1681565b34801561069757600080fd5b506102b66106a6366004612e4f565b61134a565b3480156106b757600080fd5b5061032e600d5481565b3480156106cd57600080fd5b5061031b6106dc366004612c7f565b6113c9565b3480156106ed57600080fd5b5061032e60085481565b61031b610705366004612ed0565b611458565b34801561071657600080fd5b5061032e610725366004612b52565b611774565b34801561073657600080fd5b506102e3610745366004612e68565b61177f565b34801561075657600080fd5b5061028c610765366004612b6d565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561079f57600080fd5b5061031b6107ae366004612b52565b61178b565b3480156107bf57600080fd5b5061031b611823565b3480156107d457600080fd5b5061032e600b5481565b60006001600160e01b031982166380ac58cd60e01b148061080f57506001600160e01b03198216635b5e139f60e01b145b8061082a57506001600160e01b0319821663780e9d6360e01b145b8061084557506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461085a906132b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610886906132b9565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050905090565b60006108ea826001541190565b6109515760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061097882610de7565b9050806001600160a01b0316836001600160a01b031614156109e75760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610948565b336001600160a01b0382161480610a035750610a038133610765565b610a755760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610948565b610a8083838361186a565b505050565b610a808383836118c6565b6000610a9b83610df9565b8210610af45760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610948565b6000610aff60015490565b905060008060005b83811015610ba8576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610b5957805192505b876001600160a01b0316836001600160a01b03161415610b955786841415610b875750935061084592505050565b83610b91816132f4565b9450505b5080610ba0816132f4565b915050610b07565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610948565b60118054610c15906132b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c41906132b9565b8015610c8e5780601f10610c6357610100808354040283529160200191610c8e565b820191906000526020600020905b815481529060010190602001808311610c7157829003601f168201915b505050505081565b6000546001600160a01b03163314610cc05760405162461bcd60e51b81526004016109489061307b565b60405133904780156108fc02916000818181858888f19350505050158015610cec573d6000803e3d6000fd5b50565b610a8083838360405180602001604052806000815250611311565b6000610d1560015490565b8210610d6f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610948565b5090565b6000546001600160a01b03163314610d9d5760405162461bcd60e51b81526004016109489061307b565b610a80601083836129b6565b6000546001600160a01b03163314610dd35760405162461bcd60e51b81526004016109489061307b565b600a805460ff19811660ff90911615179055565b6000610df282611c4c565b5192915050565b60006001600160a01b038216610e655760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610948565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b03163314610eb45760405162461bcd60e51b81526004016109489061307b565b610ebe6000611df5565b565b6000546001600160a01b03163314610eea5760405162461bcd60e51b81526004016109489061307b565b600d548151600154610efc91906131ec565b1115610f405760405162461bcd60e51b815260206004820152601360248201527226b0bc1029bab838363c902932b0b1b432b21760691b6044820152606401610948565b60005b8151811015610f8257610f70828281518110610f6157610f61613365565b60200260200101516001611e45565b80610f7a816132f4565b915050610f43565b5050565b6000546001600160a01b03163314610fb05760405162461bcd60e51b81526004016109489061307b565b8051610f82906011906020840190612a36565b6000546001600160a01b03163314610fed5760405162461bcd60e51b81526004016109489061307b565b600f55565b604080518082019091526000808252602082015261084582611c4c565b60606003805461085a906132b9565b6000546001600160a01b031633146110485760405162461bcd60e51b81526004016109489061307b565b600b91909155600c55565b6000546001600160a01b0316331461107d5760405162461bcd60e51b81526004016109489061307b565b600e55565b3233146110d15760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610948565b600a5460ff1661111e5760405162461bcd60e51b815260206004820152601860248201527714d0531157d21054d7d393d517d4d5105495115117d6515560421b6044820152606401610948565b600d548161112b60015490565b61113591906131ec565b106111525760405162461bcd60e51b8152600401610948906130ff565b600e548161115f60015490565b61116991906131ec565b106111b05760405162461bcd60e51b815260206004820152601760248201527622bc31b2b2b234b7339026b4b73a102932b0b1b432b21760491b6044820152606401610948565b600081116111f85760405162461bcd60e51b815260206004820152601560248201527443414e4e4f545f4d494e545f544841545f4d414e5960581b6044820152606401610948565b80600f546112069190613218565b34146112425760405162461bcd60e51b815260206004820152600b60248201526a0929cac82989288be8aa8960ab1b6044820152606401610948565b610cec3382611e45565b6001600160a01b0382163314156112a55760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610948565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61131c8484846118c6565b61132884848484611e5f565b6113445760405162461bcd60e51b815260040161094890613147565b50505050565b6060611357826001541190565b6113735760405162461bcd60e51b8152600401610948906130b0565b600061137e83611f6d565b9050600081511161139e57604051806020016040528060008152506113c2565b8060116040516020016113b2929190612f7a565b6040516020818303038152906040525b9392505050565b6000546001600160a01b031633146113f35760405162461bcd60e51b81526004016109489061307b565b600d548161140060015490565b61140a91906131ec565b111561144e5760405162461bcd60e51b815260206004820152601360248201527226b0bc1029bab838363c902932b0b1b432b21760691b6044820152606401610948565b610f828282611e45565b600a5460ff166114a55760405162461bcd60e51b815260206004820152601860248201527714d0531157d21054d7d393d517d4d5105495115117d6515560421b6044820152606401610948565b600d54836114b260015490565b6114bc91906131ec565b106114d95760405162461bcd60e51b8152600401610948906130ff565b600e54836114e660015490565b6114f091906131ec565b106115375760405162461bcd60e51b815260206004820152601760248201527622bc31b2b2b234b7339026b4b73a102932b0b1b432b21760491b6044820152606401610948565b6000831161157f5760405162461bcd60e51b815260206004820152601560248201527443414e4e4f545f4d494e545f544841545f4d414e5960581b6044820152606401610948565b600b548311156115dd5760405162461bcd60e51b8152602060048201526024808201527f596f752063616e6e6f74206d696e74206d6f7265207468616e20746865206c6960448201526336b4ba1760e11b6064820152608401610948565b600c54836115ea33611774565b6115f491906131ec565b11156116425760405162461bcd60e51b815260206004820152601860248201527f5045525f57414c4c45545f4c494d49545f5245414348454400000000000000006044820152606401610948565b82600f546116509190613218565b341461168c5760405162461bcd60e51b815260206004820152600b60248201526a0929cac82989288be8aa8960ab1b6044820152606401610948565b6012546001600160a01b03166116a2838361177f565b6001600160a01b0316146116f85760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742077686974656c69737465642e00000000000000006044820152606401610948565b600082815260136020526040902054156117545760405162461bcd60e51b815260206004820152601b60248201527f496e76616c696420566f75636865722e2054727920416761696e2e00000000006044820152606401610948565b61175e3384611e45565b5060009081526013602052604090206001905550565b600061084582611fdb565b60006113c28383612079565b6000546001600160a01b031633146117b55760405162461bcd60e51b81526004016109489061307b565b6001600160a01b03811661181a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610948565b610cec81611df5565b6000546001600160a01b0316331461184d5760405162461bcd60e51b81526004016109489061307b565b600a805461ff001981166101009182900460ff1615909102179055565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006118d182611c4c565b80519091506000906001600160a01b0316336001600160a01b031614806119085750336118fd846108dd565b6001600160a01b0316145b8061191a5750815161191a9033610765565b9050806119845760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610948565b846001600160a01b031682600001516001600160a01b0316146119f85760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610948565b6001600160a01b038416611a5c5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610948565b611a6c600084846000015161186a565b6001600160a01b0385166000908152600560205260408120805460019290611a9e9084906001600160801b0316613237565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092611aea918591166131ca565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611b718460016131ec565b6000818152600460205260409020549091506001600160a01b0316611c0257611b9b816001541190565b15611c025760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152611c6b826001541190565b611cca5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610948565b60007f00000000000000000000000000000000000000000000000000000000000000008310611d2b57611d1d7f00000000000000000000000000000000000000000000000000000000000000008461325f565b611d289060016131ec565b90505b825b818110611d94576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611d8157949350505050565b5080611d8c816132a2565b915050611d2d565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610948565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610f82828260405180602001604052806000815250612091565b60006001600160a01b0384163b15611f6157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ea390339089908890889060040161302b565b602060405180830381600087803b158015611ebd57600080fd5b505af1925050508015611eed575060408051601f3d908101601f19168201909252611eea91810190612d79565b60015b611f47573d808015611f1b576040519150601f19603f3d011682016040523d82523d6000602084013e611f20565b606091505b508051611f3f5760405162461bcd60e51b815260040161094890613147565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f65565b5060015b949350505050565b6060611f7a826001541190565b611f965760405162461bcd60e51b8152600401610948906130b0565b6000611fa061236b565b90506000815111611fc057604051806020016040528060008152506113c2565b80611fca8461237a565b6040516020016113b2929190612f4b565b60006001600160a01b03821661204d5760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610948565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b60008061208584612477565b9050611f6581846124cc565b6001546001600160a01b0384166120f45760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610948565b6120ff816001541190565b1561214c5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610948565b7f00000000000000000000000000000000000000000000000000000000000000008311156121c75760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610948565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906122239087906131ca565b6001600160801b0316815260200185836020015161224191906131ca565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156123605760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46123246000888488611e5f565b6123405760405162461bcd60e51b815260040161094890613147565b8161234a816132f4565b9250508080612358906132f4565b9150506122d7565b506001819055611c44565b60606010805461085a906132b9565b60608161239e5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123c857806123b2816132f4565b91506123c19050600a83613204565b91506123a2565b6000816001600160401b038111156123e2576123e261337b565b6040519080825280601f01601f19166020018201604052801561240c576020820181803683370190505b5090505b8415611f655761242160018361325f565b915061242e600a8661330f565b6124399060306131ec565b60f81b81838151811061244e5761244e613365565b60200101906001600160f81b031916908160001a905350612470600a86613204565b9450612410565b604080517f092b584b565f9711d79732cb738ace6cf7a206eb6277470732d92d8cc83ad275602082015290810182905260009061084590606001604051602081830303815290604052805190602001206124f0565b60008060006124db858561253e565b915091506124e8816125ae565b509392505050565b60006108456124fd612769565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000808251604114156125755760208301516040840151606085015160001a61256987828585612890565b945094505050506125a7565b82516040141561259f576020830151604084015161259486838361297d565b9350935050506125a7565b506000905060025b9250929050565b60008160048111156125c2576125c261334f565b14156125cb5750565b60018160048111156125df576125df61334f565b141561262d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610948565b60028160048111156126415761264161334f565b141561268f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610948565b60038160048111156126a3576126a361334f565b14156126fc5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610948565b60048160048111156127105761271061334f565b1415610cec5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610948565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156127c257507f000000000000000000000000000000000000000000000000000000000000000046145b156127ec57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156128c75750600090506003612974565b8460ff16601b141580156128df57508460ff16601c14155b156128f05750600090506004612974565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612944573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661296d57600060019250925050612974565b9150600090505b94509492505050565b6000806001600160ff1b0383168161299a60ff86901c601b6131ec565b90506129a887828885612890565b935093505050935093915050565b8280546129c2906132b9565b90600052602060002090601f0160209004810192826129e45760008555612a2a565b82601f106129fd5782800160ff19823516178555612a2a565b82800160010185558215612a2a579182015b82811115612a2a578235825591602001919060010190612a0f565b50610d6f929150612aaa565b828054612a42906132b9565b90600052602060002090601f016020900481019282612a645760008555612a2a565b82601f10612a7d57805160ff1916838001178555612a2a565b82800160010185558215612a2a579182015b82811115612a2a578251825591602001919060010190612a8f565b5b80821115610d6f5760008155600101612aab565b60006001600160401b03831115612ad857612ad861337b565b612aeb601f8401601f191660200161319a565b9050828152838383011115612aff57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612b2d57600080fd5b919050565b600082601f830112612b4357600080fd5b6113c283833560208501612abf565b600060208284031215612b6457600080fd5b6113c282612b16565b60008060408385031215612b8057600080fd5b612b8983612b16565b9150612b9760208401612b16565b90509250929050565b600080600060608486031215612bb557600080fd5b612bbe84612b16565b9250612bcc60208501612b16565b9150604084013590509250925092565b60008060008060808587031215612bf257600080fd5b612bfb85612b16565b9350612c0960208601612b16565b92506040850135915060608501356001600160401b03811115612c2b57600080fd5b612c3787828801612b32565b91505092959194509250565b60008060408385031215612c5657600080fd5b612c5f83612b16565b915060208301358015158114612c7457600080fd5b809150509250929050565b60008060408385031215612c9257600080fd5b612c9b83612b16565b946020939093013593505050565b60006020808385031215612cbc57600080fd5b82356001600160401b0380821115612cd357600080fd5b818501915085601f830112612ce757600080fd5b813581811115612cf957612cf961337b565b8060051b9150612d0a84830161319a565b8181528481019084860184860187018a1015612d2557600080fd5b600095505b83861015612d4f57612d3b81612b16565b835260019590950194918601918601612d2a565b5098975050505050505050565b600060208284031215612d6e57600080fd5b81356113c281613391565b600060208284031215612d8b57600080fd5b81516113c281613391565b60008060208385031215612da957600080fd5b82356001600160401b0380821115612dc057600080fd5b818501915085601f830112612dd457600080fd5b813581811115612de357600080fd5b866020828501011115612df557600080fd5b60209290920196919550909350505050565b600060208284031215612e1957600080fd5b81356001600160401b03811115612e2f57600080fd5b8201601f81018413612e4057600080fd5b611f6584823560208401612abf565b600060208284031215612e6157600080fd5b5035919050565b60008060408385031215612e7b57600080fd5b8235915060208301356001600160401b03811115612e9857600080fd5b612ea485828601612b32565b9150509250929050565b60008060408385031215612ec157600080fd5b50508035926020909101359150565b600080600060608486031215612ee557600080fd5b833592506020840135915060408401356001600160401b03811115612f0957600080fd5b612f1586828701612b32565b9150509250925092565b60008151808452612f37816020860160208601613276565b601f01601f19169290920160200192915050565b60008351612f5d818460208801613276565b835190830190612f71818360208801613276565b01949350505050565b600083516020612f8d8285838901613276565b845491840191600090600181811c9080831680612fab57607f831692505b858310811415612fc957634e487b7160e01b85526022600452602485fd5b808015612fdd5760018114612fee5761301b565b60ff1985168852838801955061301b565b60008b81526020902060005b858110156130135781548a820152908401908801612ffa565b505083880195505b50939a9950505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061305e90830184612f1f565b9695505050505050565b6020815260006113c26020830184612f1f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526028908201527f4e4f545f454e4f5547485f535550504c595f544f5f4d494e545f4445534952456040820152671117d05353d5539560c21b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b604051601f8201601f191681016001600160401b03811182821017156131c2576131c261337b565b604052919050565b60006001600160801b03808316818516808303821115612f7157612f71613323565b600082198211156131ff576131ff613323565b500190565b60008261321357613213613339565b500490565b600081600019048311821515161561323257613232613323565b500290565b60006001600160801b038381169083168181101561325757613257613323565b039392505050565b60008282101561327157613271613323565b500390565b60005b83811015613291578181015183820152602001613279565b838111156113445750506000910152565b6000816132b1576132b1613323565b506000190190565b600181811c908216806132cd57607f821691505b602082108114156132ee57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561330857613308613323565b5060010190565b60008261331e5761331e613339565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610cec57600080fdfea2646970667358221220c7737205e61dc754a6205a2cb021acfa64c1bc9deb4e89d1c3a966f86b37a94964736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102675760003560e01c80639231ab2a11610144578063c87b56dd116100b6578063dc33e6811161007a578063dc33e6811461070a578063e57deb391461072a578063e985e9c51461074a578063f2fde38b14610793578063f81227d4146107b3578063f968adbe146107c857600080fd5b8063c87b56dd1461068b578063ca69e323146106ab578063d1f919ed146106c1578063d7224ba0146106e1578063db5e735c146106f757600080fd5b8063a035b1fe11610108578063a035b1fe146105d6578063a0712d68146105ec578063a22cb465146105ff578063ab34ee4f1461061f578063b88d4fde1461064c578063ba1f879f1461066c57600080fd5b80639231ab2a1461051e57806395d89b411461056b578063996517cf146105805780639d913ef5146105965780639e6a1d7d146105b657600080fd5b80634f6ccce7116101dd57806370a08231116101a157806370a082311461046b578063715018a61461048b5780637c8255db146104a05780637e6182d9146104c05780638da5cb5b146104e057806391b7f5ed146104fe57600080fd5b80634f6ccce7146103e057806355f804b31461040057806359c74f29146104205780636352211e14610435578063639814e01461045557600080fd5b806323b872dd1161022f57806323b872dd1461033c5780632f745c591461035c57806333bc1c5c1461037c5780633ae1dd9d146103965780633ccfd60b146103ab57806342842e0e146103c057600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102c3578063095ea7b3146102fb57806318160ddd1461031d575b600080fd5b34801561027857600080fd5b5061028c610287366004612d5c565b6107de565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b661084b565b6040516102989190613068565b3480156102cf57600080fd5b506102e36102de366004612e4f565b6108dd565b6040516001600160a01b039091168152602001610298565b34801561030757600080fd5b5061031b610316366004612c7f565b61096d565b005b34801561032957600080fd5b506001545b604051908152602001610298565b34801561034857600080fd5b5061031b610357366004612ba0565b610a85565b34801561036857600080fd5b5061032e610377366004612c7f565b610a90565b34801561038857600080fd5b50600a5461028c9060ff1681565b3480156103a257600080fd5b506102b6610c08565b3480156103b757600080fd5b5061031b610c96565b3480156103cc57600080fd5b5061031b6103db366004612ba0565b610cef565b3480156103ec57600080fd5b5061032e6103fb366004612e4f565b610d0a565b34801561040c57600080fd5b5061031b61041b366004612d96565b610d73565b34801561042c57600080fd5b5061031b610da9565b34801561044157600080fd5b506102e3610450366004612e4f565b610de7565b34801561046157600080fd5b5061032e600c5481565b34801561047757600080fd5b5061032e610486366004612b52565b610df9565b34801561049757600080fd5b5061031b610e8a565b3480156104ac57600080fd5b5061031b6104bb366004612ca9565b610ec0565b3480156104cc57600080fd5b5061031b6104db366004612e07565b610f86565b3480156104ec57600080fd5b506000546001600160a01b03166102e3565b34801561050a57600080fd5b5061031b610519366004612e4f565b610fc3565b34801561052a57600080fd5b5061053e610539366004612e4f565b610ff2565b6040805182516001600160a01b031681526020928301516001600160401b03169281019290925201610298565b34801561057757600080fd5b506102b661100f565b34801561058c57600080fd5b5061032e600e5481565b3480156105a257600080fd5b5061031b6105b1366004612eae565b61101e565b3480156105c257600080fd5b5061031b6105d1366004612e4f565b611053565b3480156105e257600080fd5b5061032e600f5481565b61031b6105fa366004612e4f565b611082565b34801561060b57600080fd5b5061031b61061a366004612c43565b61124c565b34801561062b57600080fd5b5061032e61063a366004612e4f565b60136020526000908152604090205481565b34801561065857600080fd5b5061031b610667366004612bdc565b611311565b34801561067857600080fd5b50600a5461028c90610100900460ff1681565b34801561069757600080fd5b506102b66106a6366004612e4f565b61134a565b3480156106b757600080fd5b5061032e600d5481565b3480156106cd57600080fd5b5061031b6106dc366004612c7f565b6113c9565b3480156106ed57600080fd5b5061032e60085481565b61031b610705366004612ed0565b611458565b34801561071657600080fd5b5061032e610725366004612b52565b611774565b34801561073657600080fd5b506102e3610745366004612e68565b61177f565b34801561075657600080fd5b5061028c610765366004612b6d565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561079f57600080fd5b5061031b6107ae366004612b52565b61178b565b3480156107bf57600080fd5b5061031b611823565b3480156107d457600080fd5b5061032e600b5481565b60006001600160e01b031982166380ac58cd60e01b148061080f57506001600160e01b03198216635b5e139f60e01b145b8061082a57506001600160e01b0319821663780e9d6360e01b145b8061084557506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461085a906132b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610886906132b9565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050905090565b60006108ea826001541190565b6109515760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061097882610de7565b9050806001600160a01b0316836001600160a01b031614156109e75760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610948565b336001600160a01b0382161480610a035750610a038133610765565b610a755760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610948565b610a8083838361186a565b505050565b610a808383836118c6565b6000610a9b83610df9565b8210610af45760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610948565b6000610aff60015490565b905060008060005b83811015610ba8576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610b5957805192505b876001600160a01b0316836001600160a01b03161415610b955786841415610b875750935061084592505050565b83610b91816132f4565b9450505b5080610ba0816132f4565b915050610b07565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610948565b60118054610c15906132b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c41906132b9565b8015610c8e5780601f10610c6357610100808354040283529160200191610c8e565b820191906000526020600020905b815481529060010190602001808311610c7157829003601f168201915b505050505081565b6000546001600160a01b03163314610cc05760405162461bcd60e51b81526004016109489061307b565b60405133904780156108fc02916000818181858888f19350505050158015610cec573d6000803e3d6000fd5b50565b610a8083838360405180602001604052806000815250611311565b6000610d1560015490565b8210610d6f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610948565b5090565b6000546001600160a01b03163314610d9d5760405162461bcd60e51b81526004016109489061307b565b610a80601083836129b6565b6000546001600160a01b03163314610dd35760405162461bcd60e51b81526004016109489061307b565b600a805460ff19811660ff90911615179055565b6000610df282611c4c565b5192915050565b60006001600160a01b038216610e655760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610948565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b03163314610eb45760405162461bcd60e51b81526004016109489061307b565b610ebe6000611df5565b565b6000546001600160a01b03163314610eea5760405162461bcd60e51b81526004016109489061307b565b600d548151600154610efc91906131ec565b1115610f405760405162461bcd60e51b815260206004820152601360248201527226b0bc1029bab838363c902932b0b1b432b21760691b6044820152606401610948565b60005b8151811015610f8257610f70828281518110610f6157610f61613365565b60200260200101516001611e45565b80610f7a816132f4565b915050610f43565b5050565b6000546001600160a01b03163314610fb05760405162461bcd60e51b81526004016109489061307b565b8051610f82906011906020840190612a36565b6000546001600160a01b03163314610fed5760405162461bcd60e51b81526004016109489061307b565b600f55565b604080518082019091526000808252602082015261084582611c4c565b60606003805461085a906132b9565b6000546001600160a01b031633146110485760405162461bcd60e51b81526004016109489061307b565b600b91909155600c55565b6000546001600160a01b0316331461107d5760405162461bcd60e51b81526004016109489061307b565b600e55565b3233146110d15760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610948565b600a5460ff1661111e5760405162461bcd60e51b815260206004820152601860248201527714d0531157d21054d7d393d517d4d5105495115117d6515560421b6044820152606401610948565b600d548161112b60015490565b61113591906131ec565b106111525760405162461bcd60e51b8152600401610948906130ff565b600e548161115f60015490565b61116991906131ec565b106111b05760405162461bcd60e51b815260206004820152601760248201527622bc31b2b2b234b7339026b4b73a102932b0b1b432b21760491b6044820152606401610948565b600081116111f85760405162461bcd60e51b815260206004820152601560248201527443414e4e4f545f4d494e545f544841545f4d414e5960581b6044820152606401610948565b80600f546112069190613218565b34146112425760405162461bcd60e51b815260206004820152600b60248201526a0929cac82989288be8aa8960ab1b6044820152606401610948565b610cec3382611e45565b6001600160a01b0382163314156112a55760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610948565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61131c8484846118c6565b61132884848484611e5f565b6113445760405162461bcd60e51b815260040161094890613147565b50505050565b6060611357826001541190565b6113735760405162461bcd60e51b8152600401610948906130b0565b600061137e83611f6d565b9050600081511161139e57604051806020016040528060008152506113c2565b8060116040516020016113b2929190612f7a565b6040516020818303038152906040525b9392505050565b6000546001600160a01b031633146113f35760405162461bcd60e51b81526004016109489061307b565b600d548161140060015490565b61140a91906131ec565b111561144e5760405162461bcd60e51b815260206004820152601360248201527226b0bc1029bab838363c902932b0b1b432b21760691b6044820152606401610948565b610f828282611e45565b600a5460ff166114a55760405162461bcd60e51b815260206004820152601860248201527714d0531157d21054d7d393d517d4d5105495115117d6515560421b6044820152606401610948565b600d54836114b260015490565b6114bc91906131ec565b106114d95760405162461bcd60e51b8152600401610948906130ff565b600e54836114e660015490565b6114f091906131ec565b106115375760405162461bcd60e51b815260206004820152601760248201527622bc31b2b2b234b7339026b4b73a102932b0b1b432b21760491b6044820152606401610948565b6000831161157f5760405162461bcd60e51b815260206004820152601560248201527443414e4e4f545f4d494e545f544841545f4d414e5960581b6044820152606401610948565b600b548311156115dd5760405162461bcd60e51b8152602060048201526024808201527f596f752063616e6e6f74206d696e74206d6f7265207468616e20746865206c6960448201526336b4ba1760e11b6064820152608401610948565b600c54836115ea33611774565b6115f491906131ec565b11156116425760405162461bcd60e51b815260206004820152601860248201527f5045525f57414c4c45545f4c494d49545f5245414348454400000000000000006044820152606401610948565b82600f546116509190613218565b341461168c5760405162461bcd60e51b815260206004820152600b60248201526a0929cac82989288be8aa8960ab1b6044820152606401610948565b6012546001600160a01b03166116a2838361177f565b6001600160a01b0316146116f85760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742077686974656c69737465642e00000000000000006044820152606401610948565b600082815260136020526040902054156117545760405162461bcd60e51b815260206004820152601b60248201527f496e76616c696420566f75636865722e2054727920416761696e2e00000000006044820152606401610948565b61175e3384611e45565b5060009081526013602052604090206001905550565b600061084582611fdb565b60006113c28383612079565b6000546001600160a01b031633146117b55760405162461bcd60e51b81526004016109489061307b565b6001600160a01b03811661181a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610948565b610cec81611df5565b6000546001600160a01b0316331461184d5760405162461bcd60e51b81526004016109489061307b565b600a805461ff001981166101009182900460ff1615909102179055565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006118d182611c4c565b80519091506000906001600160a01b0316336001600160a01b031614806119085750336118fd846108dd565b6001600160a01b0316145b8061191a5750815161191a9033610765565b9050806119845760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610948565b846001600160a01b031682600001516001600160a01b0316146119f85760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610948565b6001600160a01b038416611a5c5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610948565b611a6c600084846000015161186a565b6001600160a01b0385166000908152600560205260408120805460019290611a9e9084906001600160801b0316613237565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092611aea918591166131ca565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611b718460016131ec565b6000818152600460205260409020549091506001600160a01b0316611c0257611b9b816001541190565b15611c025760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152611c6b826001541190565b611cca5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610948565b60007f00000000000000000000000000000000000000000000000000000000000003e88310611d2b57611d1d7f00000000000000000000000000000000000000000000000000000000000003e88461325f565b611d289060016131ec565b90505b825b818110611d94576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611d8157949350505050565b5080611d8c816132a2565b915050611d2d565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610948565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610f82828260405180602001604052806000815250612091565b60006001600160a01b0384163b15611f6157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ea390339089908890889060040161302b565b602060405180830381600087803b158015611ebd57600080fd5b505af1925050508015611eed575060408051601f3d908101601f19168201909252611eea91810190612d79565b60015b611f47573d808015611f1b576040519150601f19603f3d011682016040523d82523d6000602084013e611f20565b606091505b508051611f3f5760405162461bcd60e51b815260040161094890613147565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f65565b5060015b949350505050565b6060611f7a826001541190565b611f965760405162461bcd60e51b8152600401610948906130b0565b6000611fa061236b565b90506000815111611fc057604051806020016040528060008152506113c2565b80611fca8461237a565b6040516020016113b2929190612f4b565b60006001600160a01b03821661204d5760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610948565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b60008061208584612477565b9050611f6581846124cc565b6001546001600160a01b0384166120f45760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610948565b6120ff816001541190565b1561214c5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610948565b7f00000000000000000000000000000000000000000000000000000000000003e88311156121c75760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610948565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906122239087906131ca565b6001600160801b0316815260200185836020015161224191906131ca565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156123605760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46123246000888488611e5f565b6123405760405162461bcd60e51b815260040161094890613147565b8161234a816132f4565b9250508080612358906132f4565b9150506122d7565b506001819055611c44565b60606010805461085a906132b9565b60608161239e5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123c857806123b2816132f4565b91506123c19050600a83613204565b91506123a2565b6000816001600160401b038111156123e2576123e261337b565b6040519080825280601f01601f19166020018201604052801561240c576020820181803683370190505b5090505b8415611f655761242160018361325f565b915061242e600a8661330f565b6124399060306131ec565b60f81b81838151811061244e5761244e613365565b60200101906001600160f81b031916908160001a905350612470600a86613204565b9450612410565b604080517f092b584b565f9711d79732cb738ace6cf7a206eb6277470732d92d8cc83ad275602082015290810182905260009061084590606001604051602081830303815290604052805190602001206124f0565b60008060006124db858561253e565b915091506124e8816125ae565b509392505050565b60006108456124fd612769565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000808251604114156125755760208301516040840151606085015160001a61256987828585612890565b945094505050506125a7565b82516040141561259f576020830151604084015161259486838361297d565b9350935050506125a7565b506000905060025b9250929050565b60008160048111156125c2576125c261334f565b14156125cb5750565b60018160048111156125df576125df61334f565b141561262d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610948565b60028160048111156126415761264161334f565b141561268f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610948565b60038160048111156126a3576126a361334f565b14156126fc5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610948565b60048160048111156127105761271061334f565b1415610cec5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610948565b6000306001600160a01b037f000000000000000000000000a76aab0aa0587b52b9a57c400c9a7001f7a8472c161480156127c257507f000000000000000000000000000000000000000000000000000000000000000146145b156127ec57507f7de7fec22df330aee5fb5d333348657720f64c7482834856a58ea653647f294190565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f7465fde7fb0420a03855c8bac7d7dd705d61d0241d0d293890335916e0da8ea2828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156128c75750600090506003612974565b8460ff16601b141580156128df57508460ff16601c14155b156128f05750600090506004612974565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612944573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661296d57600060019250925050612974565b9150600090505b94509492505050565b6000806001600160ff1b0383168161299a60ff86901c601b6131ec565b90506129a887828885612890565b935093505050935093915050565b8280546129c2906132b9565b90600052602060002090601f0160209004810192826129e45760008555612a2a565b82601f106129fd5782800160ff19823516178555612a2a565b82800160010185558215612a2a579182015b82811115612a2a578235825591602001919060010190612a0f565b50610d6f929150612aaa565b828054612a42906132b9565b90600052602060002090601f016020900481019282612a645760008555612a2a565b82601f10612a7d57805160ff1916838001178555612a2a565b82800160010185558215612a2a579182015b82811115612a2a578251825591602001919060010190612a8f565b5b80821115610d6f5760008155600101612aab565b60006001600160401b03831115612ad857612ad861337b565b612aeb601f8401601f191660200161319a565b9050828152838383011115612aff57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612b2d57600080fd5b919050565b600082601f830112612b4357600080fd5b6113c283833560208501612abf565b600060208284031215612b6457600080fd5b6113c282612b16565b60008060408385031215612b8057600080fd5b612b8983612b16565b9150612b9760208401612b16565b90509250929050565b600080600060608486031215612bb557600080fd5b612bbe84612b16565b9250612bcc60208501612b16565b9150604084013590509250925092565b60008060008060808587031215612bf257600080fd5b612bfb85612b16565b9350612c0960208601612b16565b92506040850135915060608501356001600160401b03811115612c2b57600080fd5b612c3787828801612b32565b91505092959194509250565b60008060408385031215612c5657600080fd5b612c5f83612b16565b915060208301358015158114612c7457600080fd5b809150509250929050565b60008060408385031215612c9257600080fd5b612c9b83612b16565b946020939093013593505050565b60006020808385031215612cbc57600080fd5b82356001600160401b0380821115612cd357600080fd5b818501915085601f830112612ce757600080fd5b813581811115612cf957612cf961337b565b8060051b9150612d0a84830161319a565b8181528481019084860184860187018a1015612d2557600080fd5b600095505b83861015612d4f57612d3b81612b16565b835260019590950194918601918601612d2a565b5098975050505050505050565b600060208284031215612d6e57600080fd5b81356113c281613391565b600060208284031215612d8b57600080fd5b81516113c281613391565b60008060208385031215612da957600080fd5b82356001600160401b0380821115612dc057600080fd5b818501915085601f830112612dd457600080fd5b813581811115612de357600080fd5b866020828501011115612df557600080fd5b60209290920196919550909350505050565b600060208284031215612e1957600080fd5b81356001600160401b03811115612e2f57600080fd5b8201601f81018413612e4057600080fd5b611f6584823560208401612abf565b600060208284031215612e6157600080fd5b5035919050565b60008060408385031215612e7b57600080fd5b8235915060208301356001600160401b03811115612e9857600080fd5b612ea485828601612b32565b9150509250929050565b60008060408385031215612ec157600080fd5b50508035926020909101359150565b600080600060608486031215612ee557600080fd5b833592506020840135915060408401356001600160401b03811115612f0957600080fd5b612f1586828701612b32565b9150509250925092565b60008151808452612f37816020860160208601613276565b601f01601f19169290920160200192915050565b60008351612f5d818460208801613276565b835190830190612f71818360208801613276565b01949350505050565b600083516020612f8d8285838901613276565b845491840191600090600181811c9080831680612fab57607f831692505b858310811415612fc957634e487b7160e01b85526022600452602485fd5b808015612fdd5760018114612fee5761301b565b60ff1985168852838801955061301b565b60008b81526020902060005b858110156130135781548a820152908401908801612ffa565b505083880195505b50939a9950505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061305e90830184612f1f565b9695505050505050565b6020815260006113c26020830184612f1f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526028908201527f4e4f545f454e4f5547485f535550504c595f544f5f4d494e545f4445534952456040820152671117d05353d5539560c21b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b604051601f8201601f191681016001600160401b03811182821017156131c2576131c261337b565b604052919050565b60006001600160801b03808316818516808303821115612f7157612f71613323565b600082198211156131ff576131ff613323565b500190565b60008261321357613213613339565b500490565b600081600019048311821515161561323257613232613323565b500290565b60006001600160801b038381169083168181101561325757613257613323565b039392505050565b60008282101561327157613271613323565b500390565b60005b83811015613291578181015183820152602001613279565b838111156113445750506000910152565b6000816132b1576132b1613323565b506000190190565b600181811c908216806132cd57607f821691505b602082108114156132ee57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561330857613308613323565b5060010190565b60008261331e5761331e613339565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610cec57600080fdfea2646970667358221220c7737205e61dc754a6205a2cb021acfa64c1bc9deb4e89d1c3a966f86b37a94964736f6c63430008070033
Deployed Bytecode Sourcemap
36772:5127:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13250:422;;;;;;;;;;-1:-1:-1;13250:422:0;;;;;:::i;:::-;;:::i;:::-;;;9926:14:1;;9919:22;9901:41;;9889:2;9874:18;13250:422:0;;;;;;;;15036:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16245:292::-;;;;;;;;;;-1:-1:-1;16245:292:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9224:32:1;;;9206:51;;9194:2;9179:18;16245:292:0;9060:203:1;15826:413:0;;;;;;;;;;-1:-1:-1;15826:413:0;;;;;:::i;:::-;;:::i;:::-;;12040:100;;;;;;;;;;-1:-1:-1;12120:12:0;;12040:100;;;25811:25:1;;;25799:2;25784:18;12040:100:0;25665:177:1;17080:162:0;;;;;;;;;;-1:-1:-1;17080:162:0;;;;;:::i;:::-;;:::i;12380:864::-;;;;;;;;;;-1:-1:-1;12380:864:0;;;;;:::i;:::-;;:::i;36956:30::-;;;;;;;;;;-1:-1:-1;36956:30:0;;;;;;;;37292:29;;;;;;;;;;;;;:::i;40900:109::-;;;;;;;;;;;;;:::i;17248:177::-;;;;;;;;;;-1:-1:-1;17248:177:0;;;;;:::i;:::-;;:::i;12146:228::-;;;;;;;;;;-1:-1:-1;12146:228:0;;;;;:::i;:::-;;:::i;40786:106::-;;;;;;;;;;-1:-1:-1;40786:106:0;;;;;:::i;:::-;;:::i;40593:87::-;;;;;;;;;;;;;:::i;14906:124::-;;;;;;;;;;-1:-1:-1;14906:124:0;;;;;:::i;:::-;;:::i;37067:32::-;;;;;;;;;;;;;;;;13678:258;;;;;;;;;;-1:-1:-1;13678:258:0;;;;;:::i;:::-;;:::i;7234:94::-;;;;;;;;;;;;;:::i;39097:251::-;;;;;;;;;;-1:-1:-1;39097:251:0;;;;;:::i;:::-;;:::i;41015:100::-;;;;;;;;;;-1:-1:-1;41015:100:0;;;;;:::i;:::-;;:::i;7015:87::-;;;;;;;;;;-1:-1:-1;7061:7:0;7088:6;-1:-1:-1;;;;;7088:6:0;7015:87;;40204:96;;;;;;;;;;-1:-1:-1;40204:96:0;;;;;:::i;:::-;;:::i;41242:167::-;;;;;;;;;;-1:-1:-1;41242:167:0;;;;;:::i;:::-;;:::i;:::-;;;;25530:13:1;;-1:-1:-1;;;;;25526:39:1;25508:58;;25626:4;25614:17;;;25608:24;-1:-1:-1;;;;;25604:49:1;25582:20;;;25575:79;;;;25481:18;41242:167:0;25300:360:1;15142:104:0;;;;;;;;;;;;;:::i;37142:30::-;;;;;;;;;;;;;;;;40308:178;;;;;;;;;;-1:-1:-1;40308:178:0;;;;;:::i;:::-;;:::i;40492:93::-;;;;;;;;;;-1:-1:-1;40492:93:0;;;;;:::i;:::-;;:::i;37179:33::-;;;;;;;;;;;;;;;;37731:475;;;;;;:::i;:::-;;:::i;16543:311::-;;;;;;;;;;-1:-1:-1;16543:311:0;;;;;:::i;:::-;;:::i;37413:42::-;;;;;;;;;;-1:-1:-1;37413:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;17431:355;;;;;;;;;;-1:-1:-1;17431:355:0;;;;;:::i;:::-;;:::i;36993:31::-;;;;;;;;;;-1:-1:-1;36993:31:0;;;;;;;;;;;41417:479;;;;;;;;;;-1:-1:-1;41417:479:0;;;;;:::i;:::-;;:::i;37106:29::-;;;;;;;;;;;;;;;;39353:202;;;;;;;;;;-1:-1:-1;39353:202:0;;;;;:::i;:::-;;:::i;21052:43::-;;;;;;;;;;;;;;;;38212:877;;;;;;:::i;:::-;;:::i;41121:113::-;;;;;;;;;;-1:-1:-1;41121:113:0;;;;;:::i;:::-;;:::i;39563:124::-;;;;;;;;;;-1:-1:-1;39563:124:0;;;;;:::i;:::-;;:::i;16860:214::-;;;;;;;;;;-1:-1:-1;16860:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;17031:25:0;;;17002:4;17031:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;16860:214;7334:229;;;;;;;;;;-1:-1:-1;7334:229:0;;;;;:::i;:::-;;:::i;40686:92::-;;;;;;;;;;;;;:::i;37033:27::-;;;;;;;;;;;;;;;;13250:422;13397:4;-1:-1:-1;;;;;;13439:40:0;;-1:-1:-1;;;13439:40:0;;:105;;-1:-1:-1;;;;;;;13496:48:0;;-1:-1:-1;;;13496:48:0;13439:105;:172;;;-1:-1:-1;;;;;;;13561:50:0;;-1:-1:-1;;;13561:50:0;13439:172;:225;;;-1:-1:-1;;;;;;;;;;9706:40:0;;;13628:36;13419:245;13250:422;-1:-1:-1;;13250:422:0:o;15036:100::-;15090:13;15123:5;15116:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15036:100;:::o;16245:292::-;16349:7;16396:16;16404:7;17883:12;;-1:-1:-1;17873:22:0;17792:111;16396:16;16374:111;;;;-1:-1:-1;;;16374:111:0;;24685:2:1;16374:111:0;;;24667:21:1;24724:2;24704:18;;;24697:30;24763:34;24743:18;;;24736:62;-1:-1:-1;;;24814:18:1;;;24807:43;24867:19;;16374:111:0;;;;;;;;;-1:-1:-1;16505:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;16505:24:0;;16245:292::o;15826:413::-;15899:13;15915:24;15931:7;15915:15;:24::i;:::-;15899:40;;15964:5;-1:-1:-1;;;;;15958:11:0;:2;-1:-1:-1;;;;;15958:11:0;;;15950:58;;;;-1:-1:-1;;;15950:58:0;;21218:2:1;15950:58:0;;;21200:21:1;21257:2;21237:18;;;21230:30;21296:34;21276:18;;;21269:62;-1:-1:-1;;;21347:18:1;;;21340:32;21389:19;;15950:58:0;21016:398:1;15950:58:0;6602:10;-1:-1:-1;;;;;16043:21:0;;;;:62;;-1:-1:-1;16068:37:0;16085:5;6602:10;16860:214;:::i;16068:37::-;16021:169;;;;-1:-1:-1;;;16021:169:0;;16496:2:1;16021:169:0;;;16478:21:1;16535:2;16515:18;;;16508:30;16574:34;16554:18;;;16547:62;16645:27;16625:18;;;16618:55;16690:19;;16021:169:0;16294:421:1;16021:169:0;16203:28;16212:2;16216:7;16225:5;16203:8;:28::i;:::-;15888:351;15826:413;;:::o;17080:162::-;17206:28;17216:4;17222:2;17226:7;17206:9;:28::i;12380:864::-;12505:7;12546:16;12556:5;12546:9;:16::i;:::-;12538:5;:24;12530:71;;;;-1:-1:-1;;;12530:71:0;;11882:2:1;12530:71:0;;;11864:21:1;11921:2;11901:18;;;11894:30;11960:34;11940:18;;;11933:62;-1:-1:-1;;;12011:18:1;;;12004:32;12053:19;;12530:71:0;11680:398:1;12530:71:0;12612:22;12637:13;12120:12;;;12040:100;12637:13;12612:38;;12661:19;12695:25;12749:9;12744:426;12768:14;12764:1;:18;12744:426;;;12804:31;12838:14;;;:11;:14;;;;;;;;;12804:48;;;;;;;;;-1:-1:-1;;;;;12804:48:0;;;;;-1:-1:-1;;;12804:48:0;;;-1:-1:-1;;;;;12804:48:0;;;;;;;;12871:28;12867:103;;12940:14;;;-1:-1:-1;12867:103:0;13009:5;-1:-1:-1;;;;;12988:26:0;:17;-1:-1:-1;;;;;12988:26:0;;12984:175;;;13054:5;13039:11;:20;13035:77;;;-1:-1:-1;13091:1:0;-1:-1:-1;13084:8:0;;-1:-1:-1;;;13084:8:0;13035:77;13130:13;;;;:::i;:::-;;;;12984:175;-1:-1:-1;12784:3:0;;;;:::i;:::-;;;;12744:426;;;-1:-1:-1;13180:56:0;;-1:-1:-1;;;13180:56:0;;23854:2:1;13180:56:0;;;23836:21:1;23893:2;23873:18;;;23866:30;23932:34;23912:18;;;23905:62;-1:-1:-1;;;23983:18:1;;;23976:44;24037:19;;13180:56:0;23652:410:1;37292:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40900:109::-;7061:7;7088:6;-1:-1:-1;;;;;7088:6:0;6602:10;7148:23;7140:68;;;;-1:-1:-1;;;7140:68:0;;;;;;;:::i;:::-;40950:51:::1;::::0;40958:10:::1;::::0;40979:21:::1;40950:51:::0;::::1;;;::::0;::::1;::::0;;;40979:21;40958:10;40950:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;40900:109::o:0;17248:177::-;17378:39;17395:4;17401:2;17405:7;17378:39;;;;;;;;;;;;:16;:39::i;12146:228::-;12249:7;12290:13;12120:12;;;12040:100;12290:13;12282:5;:21;12274:69;;;;-1:-1:-1;;;12274:69:0;;14153:2:1;12274:69:0;;;14135:21:1;14192:2;14172:18;;;14165:30;14231:34;14211:18;;;14204:62;-1:-1:-1;;;14282:18:1;;;14275:33;14325:19;;12274:69:0;13951:399:1;12274:69:0;-1:-1:-1;12361:5:0;12146:228::o;40786:106::-;7061:7;7088:6;-1:-1:-1;;;;;7088:6:0;6602:10;7148:23;7140:68;;;;-1:-1:-1;;;7140:68:0;;;;;;;:::i;:::-;40861:23:::1;:13;40877:7:::0;;40861:23:::1;:::i;40593:87::-:0;7061:7;7088:6;-1:-1:-1;;;;;7088:6:0;6602:10;7148:23;7140:68;;;;-1:-1:-1;;;7140:68:0;;;;;;;:::i;:::-;40662:10:::1;::::0;;-1:-1:-1;;40648:24:0;::::1;40662:10;::::0;;::::1;40661:11;40648:24;::::0;;40593:87::o;14906:124::-;14970:7;14997:20;15009:7;14997:11;:20::i;:::-;:25;;14906:124;-1:-1:-1;;14906:124:0:o;13678:258::-;13742:7;-1:-1:-1;;;;;13784:19:0;;13762:112;;;;-1:-1:-1;;;13762:112:0;;16922:2:1;13762:112:0;;;16904:21:1;16961:2;16941:18;;;16934:30;17000:34;16980:18;;;16973:62;-1:-1:-1;;;17051:18:1;;;17044:41;17102:19;;13762:112:0;16720:407:1;13762:112:0;-1:-1:-1;;;;;;13900:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;13900:27:0;;13678:258::o;7234:94::-;7061:7;7088:6;-1:-1:-1;;;;;7088:6:0;6602:10;7148:23;7140:68;;;;-1:-1:-1;;;7140:68:0;;;;;;;:::i;:::-;7299:21:::1;7317:1;7299:9;:21::i;:::-;7234:94::o:0;39097:251::-;7061:7;7088:6;-1:-1:-1;;;;;7088:6:0;6602:10;7148:23;7140:68;;;;-1:-1:-1;;;7140:68:0;;;;;;;:::i;:::-;39215:8:::1;::::0;39196:15;;12120:12;;39180:31:::1;;;;:::i;:::-;:43;;39172:75;;;::::0;-1:-1:-1;;;39172:75:0;;23506:2:1;39172:75:0::1;::::0;::::1;23488:21:1::0;23545:2;23525:18;;;23518:30;-1:-1:-1;;;23564:18:1;;;23557:49;23623:18;;39172:75:0::1;23304:343:1::0;39172:75:0::1;39262:6;39258:80;39278:8;:15;39274:1;:19;39258:80;;;39313:25;39323:8;39332:1;39323:11;;;;;;;;:::i;:::-;;;;;;;39336:1;39313:9;:25::i;:::-;39295:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39258:80;;;;39097:251:::0;:::o;41015:100::-;7061:7;7088:6;-1:-1:-1;;;;;7088:6:0;6602:10;7148:23;7140:68;;;;-1:-1:-1;;;7140:68:0;;;;;;;:::i;:::-;41089:18;;::::1;::::0;:10:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;40204:96::-:0;7061:7;7088:6;-1:-1:-1;;;;;7088:6:0;6602:10;7148:23;7140:68;;;;-1:-1:-1;;;7140:68:0;;;;;;;:::i;:::-;40273:5:::1;:19:::0;40204:96::o;41242:167::-;-1:-1:-1;;;;;;;;;;;;;;;;;41381:20:0;41393:7;41381:11;:20::i;15142:104::-;15198:13;15231:7;15224:14;;;;;:::i;40308:178::-;7061:7;7088:6;-1:-1:-1;;;;;7088:6:0;6602:10;7148:23;7140:68;;;;-1:-1:-1;;;7140:68:0;;;;;;;:::i;:::-;40411:8:::1;:23:::0;;;;40445:13:::1;:33:::0;40308:178::o;40492:93::-;7061:7;7088:6;-1:-1:-1;;;;;7088:6:0;6602:10;7148:23;7140:68;;;;-1:-1:-1;;;7140:68:0;;;;;;;:::i;:::-;40560:9:::1;:16:::0;40492:93::o;37731:475::-;37643:9;37656:10;37643:23;37635:66;;;;-1:-1:-1;;;37635:66:0;;15784:2:1;37635:66:0;;;15766:21:1;15823:2;15803:18;;;15796:30;15862:32;15842:18;;;15835:60;15912:18;;37635:66:0;15582:354:1;37635:66:0;37812:10:::1;::::0;::::1;;37804:47;;;::::0;-1:-1:-1;;;37804:47:0;;21621:2:1;37804:47:0::1;::::0;::::1;21603:21:1::0;21660:2;21640:18;;;21633:30;-1:-1:-1;;;21679:18:1;;;21672:54;21743:18;;37804:47:0::1;21419:348:1::0;37804:47:0::1;37897:8;;37886;37870:13;12120:12:::0;;;12040:100;37870:13:::1;:24;;;;:::i;:::-;:35;37862:88;;;;-1:-1:-1::0;;;37862:88:0::1;;;;;;;:::i;:::-;37996:9;;37985:8;37969:13;12120:12:::0;;;12040:100;37969:13:::1;:24;;;;:::i;:::-;:36;37961:72;;;::::0;-1:-1:-1;;;37961:72:0;;23154:2:1;37961:72:0::1;::::0;::::1;23136:21:1::0;23193:2;23173:18;;;23166:30;-1:-1:-1;;;23212:18:1;;;23205:53;23275:18;;37961:72:0::1;22952:347:1::0;37961:72:0::1;38063:1;38052:8;:12;38044:46;;;::::0;-1:-1:-1;;;38044:46:0;;12645:2:1;38044:46:0::1;::::0;::::1;12627:21:1::0;12684:2;12664:18;;;12657:30;-1:-1:-1;;;12703:18:1;;;12696:51;12764:18;;38044:46:0::1;12443:345:1::0;38044:46:0::1;38130:8;38122:5;;:16;;;;:::i;:::-;38109:9;:29;38101:53;;;::::0;-1:-1:-1;;;38101:53:0;;13402:2:1;38101:53:0::1;::::0;::::1;13384:21:1::0;13441:2;13421:18;;;13414:30;-1:-1:-1;;;13460:18:1;;;13453:41;13511:18;;38101:53:0::1;13200:335:1::0;38101:53:0::1;38167:31;38177:10;38189:8;38167:9;:31::i;16543:311::-:0;-1:-1:-1;;;;;16661:24:0;;6602:10;16661:24;;16653:63;;;;-1:-1:-1;;;16653:63:0;;19326:2:1;16653:63:0;;;19308:21:1;19365:2;19345:18;;;19338:30;19404:28;19384:18;;;19377:56;19450:18;;16653:63:0;19124:350:1;16653:63:0;6602:10;16729:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;16729:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;16729:53:0;;;;;;;;;;16798:48;;9901:41:1;;;16729:42:0;;6602:10;16798:48;;9874:18:1;16798:48:0;;;;;;;16543:311;;:::o;17431:355::-;17590:28;17600:4;17606:2;17610:7;17590:9;:28::i;:::-;17651:48;17674:4;17680:2;17684:7;17693:5;17651:22;:48::i;:::-;17629:149;;;;-1:-1:-1;;;17629:149:0;;;;;;;:::i;:::-;17431:355;;;;:::o;41417:479::-;41535:13;41588:16;41596:7;17883:12;;-1:-1:-1;17873:22:0;17792:111;41588:16;41566:113;;;;-1:-1:-1;;;41566:113:0;;;;;;;:::i;:::-;41692:23;41718;41733:7;41718:14;:23::i;:::-;41692:49;;41798:1;41778:9;41772:23;:27;:116;;;;;;;;;;;;;;;;;41843:9;41854:10;41826:39;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41772:116;41752:136;41417:479;-1:-1:-1;;;41417:479:0:o;39353:202::-;7061:7;7088:6;-1:-1:-1;;;;;7088:6:0;6602:10;7148:23;7140:68;;;;-1:-1:-1;;;7140:68:0;;;;;;;:::i;:::-;39476:8:::1;;39468:4;39452:13;12120:12:::0;;;12040:100;39452:13:::1;:20;;;;:::i;:::-;:32;;39444:64;;;::::0;-1:-1:-1;;;39444:64:0;;23506:2:1;39444:64:0::1;::::0;::::1;23488:21:1::0;23545:2;23525:18;;;23518:30;-1:-1:-1;;;23564:18:1;;;23557:49;23623:18;;39444:64:0::1;23304:343:1::0;39444:64:0::1;39523:24;39533:7;39542:4;39523:9;:24::i;38212:877::-:0;38322:10;;;;38314:47;;;;-1:-1:-1;;;38314:47:0;;21621:2:1;38314:47:0;;;21603:21:1;21660:2;21640:18;;;21633:30;-1:-1:-1;;;21679:18:1;;;21672:54;21743:18;;38314:47:0;21419:348:1;38314:47:0;38407:8;;38396;38380:13;12120:12;;;12040:100;38380:13;:24;;;;:::i;:::-;:35;38372:88;;;;-1:-1:-1;;;38372:88:0;;;;;;;:::i;:::-;38506:9;;38495:8;38479:13;12120:12;;;12040:100;38479:13;:24;;;;:::i;:::-;:36;38471:72;;;;-1:-1:-1;;;38471:72:0;;23154:2:1;38471:72:0;;;23136:21:1;23193:2;23173:18;;;23166:30;-1:-1:-1;;;23212:18:1;;;23205:53;23275:18;;38471:72:0;22952:347:1;38471:72:0;38573:1;38562:8;:12;38554:46;;;;-1:-1:-1;;;38554:46:0;;12645:2:1;38554:46:0;;;12627:21:1;12684:2;12664:18;;;12657:30;-1:-1:-1;;;12703:18:1;;;12696:51;12764:18;;38554:46:0;12443:345:1;38554:46:0;38631:8;;38619;:20;;38611:69;;;;-1:-1:-1;;;38611:69:0;;17737:2:1;38611:69:0;;;17719:21:1;17776:2;17756:18;;;17749:30;17815:34;17795:18;;;17788:62;-1:-1:-1;;;17866:18:1;;;17859:34;17910:19;;38611:69:0;17535:400:1;38611:69:0;38738:13;;38726:8;38699:24;38712:10;38699:12;:24::i;:::-;:35;;;;:::i;:::-;:52;;38691:89;;;;-1:-1:-1;;;38691:89:0;;16143:2:1;38691:89:0;;;16125:21:1;16182:2;16162:18;;;16155:30;16221:26;16201:18;;;16194:54;16265:18;;38691:89:0;15941:348:1;38691:89:0;38820:8;38812:5;;:16;;;;:::i;:::-;38799:9;:29;38791:53;;;;-1:-1:-1;;;38791:53:0;;13402:2:1;38791:53:0;;;13384:21:1;13441:2;13421:18;;;13414:30;-1:-1:-1;;;13460:18:1;;;13453:41;13511:18;;38791:53:0;13200:335:1;38791:53:0;38886:15;;-1:-1:-1;;;;;38886:15:0;38863:19;38869:2;38872:9;38863:5;:19::i;:::-;-1:-1:-1;;;;;38863:38:0;;38855:75;;;;-1:-1:-1;;;38855:75:0;;20865:2:1;38855:75:0;;;20847:21:1;20904:2;20884:18;;;20877:30;20943:26;20923:18;;;20916:54;20987:18;;38855:75:0;20663:348:1;38855:75:0;38949:14;;;;:10;:14;;;;;;:19;38941:59;;;;-1:-1:-1;;;38941:59:0;;20100:2:1;38941:59:0;;;20082:21:1;20139:2;20119:18;;;20112:30;20178:29;20158:18;;;20151:57;20225:18;;38941:59:0;19898:351:1;38941:59:0;39021:31;39031:10;39043:8;39021:9;:31::i;:::-;-1:-1:-1;39063:14:0;;;;:10;:14;;;;;39080:1;39063:18;;-1:-1:-1;38212:877:0:o;41121:113::-;41179:7;41206:20;41220:5;41206:13;:20::i;39563:124::-;39631:7;39657:22;39665:2;39669:9;39657:7;:22::i;7334:229::-;7061:7;7088:6;-1:-1:-1;;;;;7088:6:0;6602:10;7148:23;7140:68;;;;-1:-1:-1;;;7140:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7437:22:0;::::1;7415:110;;;::::0;-1:-1:-1;;;7415:110:0;;12995:2:1;7415:110:0::1;::::0;::::1;12977:21:1::0;13034:2;13014:18;;;13007:30;13073:34;13053:18;;;13046:62;-1:-1:-1;;;13124:18:1;;;13117:36;13170:19;;7415:110:0::1;12793:402:1::0;7415:110:0::1;7536:19;7546:8;7536:9;:19::i;40686:92::-:0;7061:7;7088:6;-1:-1:-1;;;;;7088:6:0;6602:10;7148:23;7140:68;;;;-1:-1:-1;;;7140:68:0;;;;;;;:::i;:::-;40759:11:::1;::::0;;-1:-1:-1;;40744:26:0;::::1;40759:11;::::0;;;::::1;;;40758:12;40744:26:::0;;::::1;;::::0;;40686:92::o;20848:196::-;20963:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;20963:29:0;-1:-1:-1;;;;;20963:29:0;;;;;;;;;21008:28;;20963:24;;21008:28;;;;;;;20848:196;;;:::o;19302:1540::-;19417:35;19455:20;19467:7;19455:11;:20::i;:::-;19530:18;;19417:58;;-1:-1:-1;19488:22:0;;-1:-1:-1;;;;;19514:34:0;6602:10;-1:-1:-1;;;;;19514:34:0;;:87;;;-1:-1:-1;6602:10:0;19565:20;19577:7;19565:11;:20::i;:::-;-1:-1:-1;;;;;19565:36:0;;19514:87;:154;;;-1:-1:-1;19635:18:0;;19618:50;;6602:10;16860:214;:::i;19618:50::-;19488:181;;19704:17;19682:117;;;;-1:-1:-1;;;19682:117:0;;19681:2:1;19682:117:0;;;19663:21:1;19720:2;19700:18;;;19693:30;19759:34;19739:18;;;19732:62;-1:-1:-1;;;19810:18:1;;;19803:48;19868:19;;19682:117:0;19479:414:1;19682:117:0;19856:4;-1:-1:-1;;;;;19834:26:0;:13;:18;;;-1:-1:-1;;;;;19834:26:0;;19812:114;;;;-1:-1:-1;;;19812:114:0;;18142:2:1;19812:114:0;;;18124:21:1;18181:2;18161:18;;;18154:30;18220:34;18200:18;;;18193:62;-1:-1:-1;;;18271:18:1;;;18264:36;18317:19;;19812:114:0;17940:402:1;19812:114:0;-1:-1:-1;;;;;19945:16:0;;19937:66;;;;-1:-1:-1;;;19937:66:0;;14557:2:1;19937:66:0;;;14539:21:1;14596:2;14576:18;;;14569:30;14635:34;14615:18;;;14608:62;-1:-1:-1;;;14686:18:1;;;14679:35;14731:19;;19937:66:0;14355:401:1;19937:66:0;20070:49;20087:1;20091:7;20100:13;:18;;;20070:8;:49::i;:::-;-1:-1:-1;;;;;20132:18:0;;;;;;:12;:18;;;;;:31;;20162:1;;20132:18;:31;;20162:1;;-1:-1:-1;;;;;20132:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;20132:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;20174:16:0;;-1:-1:-1;20174:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;20174:16:0;;:29;;-1:-1:-1;;20174:29:0;;:::i;:::-;;;-1:-1:-1;;;;;20174:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20237:43:0;;;;;;;;-1:-1:-1;;;;;20237:43:0;;;;;-1:-1:-1;;;;;20263:15:0;20237:43;;;;;;;;;-1:-1:-1;20214:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;20214:66:0;-1:-1:-1;;;;;;20214:66:0;;;;;;;;;;;20427:11;20226:7;-1:-1:-1;20427:11:0;:::i;:::-;20494:1;20453:24;;;:11;:24;;;;;:29;20405:33;;-1:-1:-1;;;;;;20453:29:0;20449:288;;20517:20;20525:11;17883:12;;-1:-1:-1;17873:22:0;17792:111;20517:20;20513:213;;;20585:125;;;;;;;;20622:18;;-1:-1:-1;;;;;20585:125:0;;;;;;20663:28;;;;-1:-1:-1;;;;;20585:125:0;;;;;;;;;-1:-1:-1;20558:24:0;;;:11;:24;;;;;;;:152;;;;;;;;;-1:-1:-1;;;20558:152:0;-1:-1:-1;;;;;;20558:152:0;;;;;;;;;;;;20513:213;20773:7;20769:2;-1:-1:-1;;;;;20754:27:0;20763:4;-1:-1:-1;;;;;20754:27:0;;;;;;;;;;;20792:42;19406:1436;;;19302:1540;;;:::o;14218:682::-;-1:-1:-1;;;;;;;;;;;;;;;;;14353:16:0;14361:7;17883:12;;-1:-1:-1;17873:22:0;17792:111;14353:16;14345:71;;;;-1:-1:-1;;;14345:71:0;;13742:2:1;14345:71:0;;;13724:21:1;13781:2;13761:18;;;13754:30;13820:34;13800:18;;;13793:62;-1:-1:-1;;;13871:18:1;;;13864:40;13921:19;;14345:71:0;13540:406:1;14345:71:0;14429:26;14481:12;14470:7;:23;14466:103;;14531:22;14541:12;14531:7;:22;:::i;:::-;:26;;14556:1;14531:26;:::i;:::-;14510:47;;14466:103;14601:7;14581:242;14618:18;14610:4;:26;14581:242;;14661:31;14695:17;;;:11;:17;;;;;;;;;14661:51;;;;;;;;;-1:-1:-1;;;;;14661:51:0;;;;;-1:-1:-1;;;14661:51:0;;;-1:-1:-1;;;;;14661:51:0;;;;;;;;14731:28;14727:85;;14787:9;14218:682;-1:-1:-1;;;;14218:682:0:o;14727:85::-;-1:-1:-1;14638:6:0;;;;:::i;:::-;;;;14581:242;;;-1:-1:-1;14835:57:0;;-1:-1:-1;;;14835:57:0;;24269:2:1;14835:57:0;;;24251:21:1;24308:2;24288:18;;;24281:30;24347:34;24327:18;;;24320:62;-1:-1:-1;;;24398:18:1;;;24391:45;24453:19;;14835:57:0;24067:411:1;7571:173:0;7627:16;7646:6;;-1:-1:-1;;;;;7663:17:0;;;-1:-1:-1;;;;;;7663:17:0;;;;;;7696:40;;7646:6;;;;;;;7696:40;;7627:16;7696:40;7616:128;7571:173;:::o;17911:104::-;17980:27;17990:2;17994:8;17980:27;;;;;;;;;;;;:9;:27::i;21953:985::-;22108:4;-1:-1:-1;;;;;22129:13:0;;2614:19;:23;22125:806;;22182:175;;-1:-1:-1;;;22182:175:0;;-1:-1:-1;;;;;22182:36:0;;;;;:175;;6602:10;;22276:4;;22303:7;;22333:5;;22182:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22182:175:0;;;;;;;;-1:-1:-1;;22182:175:0;;;;;;;;;;;;:::i;:::-;;;22161:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22544:13:0;;22540:321;;22587:109;;-1:-1:-1;;;22587:109:0;;;;;;;:::i;22540:321::-;22811:6;22805:13;22796:6;22792:2;22788:15;22781:38;22161:715;-1:-1:-1;;;;;;22421:55:0;-1:-1:-1;;;22421:55:0;;-1:-1:-1;22414:62:0;;22125:806;-1:-1:-1;22915:4:0;22125:806;21953:985;;;;;;:::o;15252:468::-;15370:13;15423:16;15431:7;17883:12;;-1:-1:-1;17873:22:0;17792:111;15423:16;15401:113;;;;-1:-1:-1;;;15401:113:0;;;;;;;:::i;:::-;15527:21;15551:10;:8;:10::i;:::-;15527:34;;15616:1;15598:7;15592:21;:25;:120;;;;;;;;;;;;;;;;;15661:7;15670:18;:7;:16;:18::i;:::-;15644:45;;;;;;;;;:::i;13944:266::-;14005:7;-1:-1:-1;;;;;14047:19:0;;14025:118;;;;-1:-1:-1;;;14025:118:0;;14963:2:1;14025:118:0;;;14945:21:1;15002:2;14982:18;;;14975:30;15041:34;15021:18;;;15014:62;-1:-1:-1;;;15092:18:1;;;15085:47;15149:19;;14025:118:0;14761:413:1;14025:118:0;-1:-1:-1;;;;;;14169:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;14169:32:0;;-1:-1:-1;;;;;14169:32:0;;13944:266::o;39695:175::-;39767:7;39786:14;39803:9;39809:2;39803:5;:9::i;:::-;39786:26;;39830:32;39844:6;39852:9;39830:13;:32::i;18021:1275::-;18167:12;;-1:-1:-1;;;;;18198:16:0;;18190:62;;;;-1:-1:-1;;;18190:62:0;;22752:2:1;18190:62:0;;;22734:21:1;22791:2;22771:18;;;22764:30;22830:34;22810:18;;;22803:62;-1:-1:-1;;;22881:18:1;;;22874:31;22922:19;;18190:62:0;22550:397:1;18190:62:0;18272:21;18280:12;17883;;-1:-1:-1;17873:22:0;17792:111;18272:21;18271:22;18263:64;;;;-1:-1:-1;;;18263:64:0;;22394:2:1;18263:64:0;;;22376:21:1;22433:2;22413:18;;;22406:30;22472:31;22452:18;;;22445:59;22521:18;;18263:64:0;22192:353:1;18263:64:0;18358:12;18346:8;:24;;18338:71;;;;-1:-1:-1;;;18338:71:0;;25099:2:1;18338:71:0;;;25081:21:1;25138:2;25118:18;;;25111:30;25177:34;25157:18;;;25150:62;-1:-1:-1;;;25228:18:1;;;25221:32;25270:19;;18338:71:0;24897:398:1;18338:71:0;-1:-1:-1;;;;;18529:16:0;;18496:30;18529:16;;;:12;:16;;;;;;;;;18496:49;;;;;;;;;-1:-1:-1;;;;;18496:49:0;;;;;-1:-1:-1;;;18496:49:0;;;;;;;;;;;18575:135;;;;;;;;18601:19;;18496:49;;18575:135;;;18601:39;;18631:8;;18601:39;:::i;:::-;-1:-1:-1;;;;;18575:135:0;;;;;18690:8;18655:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;18575:135:0;;;;;;-1:-1:-1;;;;;18556:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;-1:-1:-1;;;18556:154:0;;;;;;;;;;;;18749:43;;;;;;;;;;-1:-1:-1;;;;;18775:15:0;18749:43;;;;;;;;18721:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;18721:71:0;-1:-1:-1;;;;;;18721:71:0;;;;;;;;;;;;;;;;;;18733:12;;18853:325;18877:8;18873:1;:12;18853:325;;;18912:38;;18937:12;;-1:-1:-1;;;;;18912:38:0;;;18929:1;;18912:38;;18929:1;;18912:38;18991:59;19022:1;19026:2;19030:12;19044:5;18991:22;:59::i;:::-;18965:172;;;;-1:-1:-1;;;18965:172:0;;;;;;;:::i;:::-;19152:14;;;;:::i;:::-;;;;18887:3;;;;;:::i;:::-;;;;18853:325;;;-1:-1:-1;19190:12:0;:27;;;19228:60;17431:355;40082:114;40142:13;40175;40168:20;;;;;:::i;7916:656::-;7972:13;8126:10;8122:53;;-1:-1:-1;;8153:10:0;;;;;;;;;;;;-1:-1:-1;;;8153:10:0;;;;;7916:656::o;8122:53::-;8200:5;8185:12;8241:78;8248:9;;8241:78;;8274:8;;;;:::i;:::-;;-1:-1:-1;8297:10:0;;-1:-1:-1;8305:2:0;8297:10;;:::i;:::-;;;8241:78;;;8329:19;8361:6;-1:-1:-1;;;;;8351:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8351:17:0;;8329:39;;8379:154;8386:10;;8379:154;;8413:11;8423:1;8413:11;;:::i;:::-;;-1:-1:-1;8482:10:0;8490:2;8482:5;:10;:::i;:::-;8469:24;;:2;:24;:::i;:::-;8456:39;;8439:6;8446;8439:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8439:56:0;;;;;;;;-1:-1:-1;8510:11:0;8519:2;8510:11;;:::i;:::-;;;8379:154;;39878:196;39977:87;;;40002:34;39977:87;;;10621:25:1;10662:18;;;10655:34;;;39924:7:0;;39950:116;;10594:18:1;;39977:87:0;;;;;;;;;;;;39967:98;;;;;;39950:16;:116::i;28367:231::-;28445:7;28466:17;28485:18;28507:27;28518:4;28524:9;28507:10;:27::i;:::-;28465:69;;;;28545:18;28557:5;28545:11;:18::i;:::-;-1:-1:-1;28581:9:0;28367:231;-1:-1:-1;;;28367:231:0:o;36600:167::-;36677:7;36704:55;36726:20;:18;:20::i;:::-;36748:10;33411:57;;-1:-1:-1;;;33411:57:0;;;8921:27:1;8964:11;;;8957:27;;;9000:12;;;8993:28;;;33374:7:0;;9037:12:1;;33411:57:0;;;;;;;;;;;;33401:68;;;;;;33394:75;;33281:196;;;;;26257:1308;26338:7;26347:12;26572:9;:16;26592:2;26572:22;26568:990;;;26868:4;26853:20;;26847:27;26918:4;26903:20;;26897:27;26976:4;26961:20;;26955:27;26611:9;26947:36;27019:25;27030:4;26947:36;26847:27;26897;27019:10;:25::i;:::-;27012:32;;;;;;;;;26568:990;27066:9;:16;27086:2;27066:22;27062:496;;;27341:4;27326:20;;27320:27;27392:4;27377:20;;27371:27;27434:23;27445:4;27320:27;27371;27434:10;:23::i;:::-;27427:30;;;;;;;;27062:496;-1:-1:-1;27506:1:0;;-1:-1:-1;27510:35:0;27062:496;26257:1308;;;;;:::o;24528:643::-;24606:20;24597:5;:29;;;;;;;;:::i;:::-;;24593:571;;;24528:643;:::o;24593:571::-;24704:29;24695:5;:38;;;;;;;;:::i;:::-;;24691:473;;;24750:34;;-1:-1:-1;;;24750:34:0;;11529:2:1;24750:34:0;;;11511:21:1;11568:2;11548:18;;;11541:30;11607:26;11587:18;;;11580:54;11651:18;;24750:34:0;11327:348:1;24691:473:0;24815:35;24806:5;:44;;;;;;;;:::i;:::-;;24802:362;;;24867:41;;-1:-1:-1;;;24867:41:0;;12285:2:1;24867:41:0;;;12267:21:1;12324:2;12304:18;;;12297:30;12363:33;12343:18;;;12336:61;12414:18;;24867:41:0;12083:355:1;24802:362:0;24939:30;24930:5;:39;;;;;;;;:::i;:::-;;24926:238;;;24986:44;;-1:-1:-1;;;24986:44:0;;15381:2:1;24986:44:0;;;15363:21:1;15420:2;15400:18;;;15393:30;15459:34;15439:18;;;15432:62;-1:-1:-1;;;15510:18:1;;;15503:32;15552:19;;24986:44:0;15179:398:1;24926:238:0;25061:30;25052:5;:39;;;;;;;;:::i;:::-;;25048:116;;;25108:44;;-1:-1:-1;;;25108:44:0;;17334:2:1;25108:44:0;;;17316:21:1;17373:2;17353:18;;;17346:30;17412:34;17392:18;;;17385:62;-1:-1:-1;;;17463:18:1;;;17456:32;17505:19;;25108:44:0;17132:398:1;35373:314:0;35426:7;35458:4;-1:-1:-1;;;;;35467:12:0;35450:29;;:66;;;;;35500:16;35483:13;:33;35450:66;35446:234;;;-1:-1:-1;35540:24:0;;35373:314::o;35446:234::-;-1:-1:-1;35876:73:0;;;35626:10;35876:73;;;;10212:25:1;;;;35638:12:0;10253:18:1;;;10246:34;35652:15:0;10296:18:1;;;10289:34;35920:13:0;10339:18:1;;;10332:34;35943:4:0;10382:19:1;;;;10375:61;;;;35876:73:0;;;;;;;;;;10184:19:1;;;;35876:73:0;;;35866:84;;;;;;35373:314::o;29819:1632::-;29950:7;;30884:66;30871:79;;30867:163;;;-1:-1:-1;30983:1:0;;-1:-1:-1;30987:30:0;30967:51;;30867:163;31044:1;:7;;31049:2;31044:7;;:18;;;;;31055:1;:7;;31060:2;31055:7;;31044:18;31040:102;;;-1:-1:-1;31095:1:0;;-1:-1:-1;31099:30:0;31079:51;;31040:102;31256:24;;;31239:14;31256:24;;;;;;;;;10927:25:1;;;11000:4;10988:17;;10968:18;;;10961:45;;;;11022:18;;;11015:34;;;11065:18;;;11058:34;;;31256:24:0;;10899:19:1;;31256:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31256:24:0;;-1:-1:-1;;31256:24:0;;;-1:-1:-1;;;;;;;31295:20:0;;31291:103;;31348:1;31352:29;31332:50;;;;;;;31291:103;31414:6;-1:-1:-1;31422:20:0;;-1:-1:-1;29819:1632:0;;;;;;;;:::o;28861:344::-;28975:7;;-1:-1:-1;;;;;29021:80:0;;28975:7;29128:25;29144:3;29129:18;;;29151:2;29128:25;:::i;:::-;29112:42;;29172:25;29183:4;29189:1;29192;29195;29172:10;:25::i;:::-;29165:32;;;;;;28861:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:220::-;645:5;698:3;691:4;683:6;679:17;675:27;665:55;;716:1;713;706:12;665:55;738:79;813:3;804:6;791:20;784:4;776:6;772:17;738:79;:::i;828:186::-;887:6;940:2;928:9;919:7;915:23;911:32;908:52;;;956:1;953;946:12;908:52;979:29;998:9;979:29;:::i;1019:260::-;1087:6;1095;1148:2;1136:9;1127:7;1123:23;1119:32;1116:52;;;1164:1;1161;1154:12;1116:52;1187:29;1206:9;1187:29;:::i;:::-;1177:39;;1235:38;1269:2;1258:9;1254:18;1235:38;:::i;:::-;1225:48;;1019:260;;;;;:::o;1284:328::-;1361:6;1369;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1469:29;1488:9;1469:29;:::i;:::-;1459:39;;1517:38;1551:2;1540:9;1536:18;1517:38;:::i;:::-;1507:48;;1602:2;1591:9;1587:18;1574:32;1564:42;;1284:328;;;;;:::o;1617:537::-;1712:6;1720;1728;1736;1789:3;1777:9;1768:7;1764:23;1760:33;1757:53;;;1806:1;1803;1796:12;1757:53;1829:29;1848:9;1829:29;:::i;:::-;1819:39;;1877:38;1911:2;1900:9;1896:18;1877:38;:::i;:::-;1867:48;;1962:2;1951:9;1947:18;1934:32;1924:42;;2017:2;2006:9;2002:18;1989:32;-1:-1:-1;;;;;2036:6:1;2033:30;2030:50;;;2076:1;2073;2066:12;2030:50;2099:49;2140:7;2131:6;2120:9;2116:22;2099:49;:::i;:::-;2089:59;;;1617:537;;;;;;;:::o;2159:347::-;2224:6;2232;2285:2;2273:9;2264:7;2260:23;2256:32;2253:52;;;2301:1;2298;2291:12;2253:52;2324:29;2343:9;2324:29;:::i;:::-;2314:39;;2403:2;2392:9;2388:18;2375:32;2450:5;2443:13;2436:21;2429:5;2426:32;2416:60;;2472:1;2469;2462:12;2416:60;2495:5;2485:15;;;2159:347;;;;;:::o;2511:254::-;2579:6;2587;2640:2;2628:9;2619:7;2615:23;2611:32;2608:52;;;2656:1;2653;2646:12;2608:52;2679:29;2698:9;2679:29;:::i;:::-;2669:39;2755:2;2740:18;;;;2727:32;;-1:-1:-1;;;2511:254:1:o;2770:963::-;2854:6;2885:2;2928;2916:9;2907:7;2903:23;2899:32;2896:52;;;2944:1;2941;2934:12;2896:52;2984:9;2971:23;-1:-1:-1;;;;;3054:2:1;3046:6;3043:14;3040:34;;;3070:1;3067;3060:12;3040:34;3108:6;3097:9;3093:22;3083:32;;3153:7;3146:4;3142:2;3138:13;3134:27;3124:55;;3175:1;3172;3165:12;3124:55;3211:2;3198:16;3233:2;3229;3226:10;3223:36;;;3239:18;;:::i;:::-;3285:2;3282:1;3278:10;3268:20;;3308:28;3332:2;3328;3324:11;3308:28;:::i;:::-;3370:15;;;3401:12;;;;3433:11;;;3463;;;3459:20;;3456:33;-1:-1:-1;3453:53:1;;;3502:1;3499;3492:12;3453:53;3524:1;3515:10;;3534:169;3548:2;3545:1;3542:9;3534:169;;;3605:23;3624:3;3605:23;:::i;:::-;3593:36;;3566:1;3559:9;;;;;3649:12;;;;3681;;3534:169;;;-1:-1:-1;3722:5:1;2770:963;-1:-1:-1;;;;;;;;2770:963:1:o;3738:245::-;3796:6;3849:2;3837:9;3828:7;3824:23;3820:32;3817:52;;;3865:1;3862;3855:12;3817:52;3904:9;3891:23;3923:30;3947:5;3923:30;:::i;3988:249::-;4057:6;4110:2;4098:9;4089:7;4085:23;4081:32;4078:52;;;4126:1;4123;4116:12;4078:52;4158:9;4152:16;4177:30;4201:5;4177:30;:::i;4242:592::-;4313:6;4321;4374:2;4362:9;4353:7;4349:23;4345:32;4342:52;;;4390:1;4387;4380:12;4342:52;4430:9;4417:23;-1:-1:-1;;;;;4500:2:1;4492:6;4489:14;4486:34;;;4516:1;4513;4506:12;4486:34;4554:6;4543:9;4539:22;4529:32;;4599:7;4592:4;4588:2;4584:13;4580:27;4570:55;;4621:1;4618;4611:12;4570:55;4661:2;4648:16;4687:2;4679:6;4676:14;4673:34;;;4703:1;4700;4693:12;4673:34;4748:7;4743:2;4734:6;4730:2;4726:15;4722:24;4719:37;4716:57;;;4769:1;4766;4759:12;4716:57;4800:2;4792:11;;;;;4822:6;;-1:-1:-1;4242:592:1;;-1:-1:-1;;;;4242:592:1:o;4839:450::-;4908:6;4961:2;4949:9;4940:7;4936:23;4932:32;4929:52;;;4977:1;4974;4967:12;4929:52;5017:9;5004:23;-1:-1:-1;;;;;5042:6:1;5039:30;5036:50;;;5082:1;5079;5072:12;5036:50;5105:22;;5158:4;5150:13;;5146:27;-1:-1:-1;5136:55:1;;5187:1;5184;5177:12;5136:55;5210:73;5275:7;5270:2;5257:16;5252:2;5248;5244:11;5210:73;:::i;5294:180::-;5353:6;5406:2;5394:9;5385:7;5381:23;5377:32;5374:52;;;5422:1;5419;5412:12;5374:52;-1:-1:-1;5445:23:1;;5294:180;-1:-1:-1;5294:180:1:o;5479:388::-;5556:6;5564;5617:2;5605:9;5596:7;5592:23;5588:32;5585:52;;;5633:1;5630;5623:12;5585:52;5669:9;5656:23;5646:33;;5730:2;5719:9;5715:18;5702:32;-1:-1:-1;;;;;5749:6:1;5746:30;5743:50;;;5789:1;5786;5779:12;5743:50;5812:49;5853:7;5844:6;5833:9;5829:22;5812:49;:::i;:::-;5802:59;;;5479:388;;;;;:::o;5872:248::-;5940:6;5948;6001:2;5989:9;5980:7;5976:23;5972:32;5969:52;;;6017:1;6014;6007:12;5969:52;-1:-1:-1;;6040:23:1;;;6110:2;6095:18;;;6082:32;;-1:-1:-1;5872:248:1:o;6125:456::-;6211:6;6219;6227;6280:2;6268:9;6259:7;6255:23;6251:32;6248:52;;;6296:1;6293;6286:12;6248:52;6332:9;6319:23;6309:33;;6389:2;6378:9;6374:18;6361:32;6351:42;;6444:2;6433:9;6429:18;6416:32;-1:-1:-1;;;;;6463:6:1;6460:30;6457:50;;;6503:1;6500;6493:12;6457:50;6526:49;6567:7;6558:6;6547:9;6543:22;6526:49;:::i;:::-;6516:59;;;6125:456;;;;;:::o;6586:257::-;6627:3;6665:5;6659:12;6692:6;6687:3;6680:19;6708:63;6764:6;6757:4;6752:3;6748:14;6741:4;6734:5;6730:16;6708:63;:::i;:::-;6825:2;6804:15;-1:-1:-1;;6800:29:1;6791:39;;;;6832:4;6787:50;;6586:257;-1:-1:-1;;6586:257:1:o;6848:470::-;7027:3;7065:6;7059:13;7081:53;7127:6;7122:3;7115:4;7107:6;7103:17;7081:53;:::i;:::-;7197:13;;7156:16;;;;7219:57;7197:13;7156:16;7253:4;7241:17;;7219:57;:::i;:::-;7292:20;;6848:470;-1:-1:-1;;;;6848:470:1:o;7323:1335::-;7499:3;7537:6;7531:13;7563:4;7576:51;7620:6;7615:3;7610:2;7602:6;7598:15;7576:51;:::i;:::-;7712:13;;7649:16;;;;7685:1;;7772;7794:18;;;;7847;;;;7874:93;;7952:4;7942:8;7938:19;7926:31;;7874:93;8015:2;8005:8;8002:16;7982:18;7979:40;7976:167;;;-1:-1:-1;;;8042:33:1;;8098:4;8095:1;8088:15;8128:4;8049:3;8116:17;7976:167;8159:18;8186:110;;;;8310:1;8305:328;;;;8152:481;;8186:110;-1:-1:-1;;8221:24:1;;8207:39;;8266:20;;;;-1:-1:-1;8186:110:1;;8305:328;26200:1;26193:14;;;26237:4;26224:18;;8400:1;8414:169;8428:8;8425:1;8422:15;8414:169;;;8510:14;;8495:13;;;8488:37;8553:16;;;;8445:10;;8414:169;;;8418:3;;8614:8;8607:5;8603:20;8596:27;;8152:481;-1:-1:-1;8649:3:1;;7323:1335;-1:-1:-1;;;;;;;;;;7323:1335:1:o;9268:488::-;-1:-1:-1;;;;;9537:15:1;;;9519:34;;9589:15;;9584:2;9569:18;;9562:43;9636:2;9621:18;;9614:34;;;9684:3;9679:2;9664:18;;9657:31;;;9462:4;;9705:45;;9730:19;;9722:6;9705:45;:::i;:::-;9697:53;9268:488;-1:-1:-1;;;;;;9268:488:1:o;11103:219::-;11252:2;11241:9;11234:21;11215:4;11272:44;11312:2;11301:9;11297:18;11289:6;11272:44;:::i;18347:356::-;18549:2;18531:21;;;18568:18;;;18561:30;18627:34;18622:2;18607:18;;18600:62;18694:2;18679:18;;18347:356::o;18708:411::-;18910:2;18892:21;;;18949:2;18929:18;;;18922:30;18988:34;18983:2;18968:18;;18961:62;-1:-1:-1;;;19054:2:1;19039:18;;19032:45;19109:3;19094:19;;18708:411::o;20254:404::-;20456:2;20438:21;;;20495:2;20475:18;;;20468:30;20534:34;20529:2;20514:18;;20507:62;-1:-1:-1;;;20600:2:1;20585:18;;20578:38;20648:3;20633:19;;20254:404::o;21772:415::-;21974:2;21956:21;;;22013:2;21993:18;;;21986:30;22052:34;22047:2;22032:18;;22025:62;-1:-1:-1;;;22118:2:1;22103:18;;22096:49;22177:3;22162:19;;21772:415::o;25847:275::-;25918:2;25912:9;25983:2;25964:13;;-1:-1:-1;;25960:27:1;25948:40;;-1:-1:-1;;;;;26003:34:1;;26039:22;;;26000:62;25997:88;;;26065:18;;:::i;:::-;26101:2;26094:22;25847:275;;-1:-1:-1;25847:275:1:o;26253:253::-;26293:3;-1:-1:-1;;;;;26382:2:1;26379:1;26375:10;26412:2;26409:1;26405:10;26443:3;26439:2;26435:12;26430:3;26427:21;26424:47;;;26451:18;;:::i;26511:128::-;26551:3;26582:1;26578:6;26575:1;26572:13;26569:39;;;26588:18;;:::i;:::-;-1:-1:-1;26624:9:1;;26511:128::o;26644:120::-;26684:1;26710;26700:35;;26715:18;;:::i;:::-;-1:-1:-1;26749:9:1;;26644:120::o;26769:168::-;26809:7;26875:1;26871;26867:6;26863:14;26860:1;26857:21;26852:1;26845:9;26838:17;26834:45;26831:71;;;26882:18;;:::i;:::-;-1:-1:-1;26922:9:1;;26769:168::o;26942:246::-;26982:4;-1:-1:-1;;;;;27095:10:1;;;;27065;;27117:12;;;27114:38;;;27132:18;;:::i;:::-;27169:13;;26942:246;-1:-1:-1;;;26942:246:1:o;27193:125::-;27233:4;27261:1;27258;27255:8;27252:34;;;27266:18;;:::i;:::-;-1:-1:-1;27303:9:1;;27193:125::o;27323:258::-;27395:1;27405:113;27419:6;27416:1;27413:13;27405:113;;;27495:11;;;27489:18;27476:11;;;27469:39;27441:2;27434:10;27405:113;;;27536:6;27533:1;27530:13;27527:48;;;-1:-1:-1;;27571:1:1;27553:16;;27546:27;27323:258::o;27586:136::-;27625:3;27653:5;27643:39;;27662:18;;:::i;:::-;-1:-1:-1;;;27698:18:1;;27586:136::o;27727:380::-;27806:1;27802:12;;;;27849;;;27870:61;;27924:4;27916:6;27912:17;27902:27;;27870:61;27977:2;27969:6;27966:14;27946:18;27943:38;27940:161;;;28023:10;28018:3;28014:20;28011:1;28004:31;28058:4;28055:1;28048:15;28086:4;28083:1;28076:15;27940:161;;27727:380;;;:::o;28112:135::-;28151:3;-1:-1:-1;;28172:17:1;;28169:43;;;28192:18;;:::i;:::-;-1:-1:-1;28239:1:1;28228:13;;28112:135::o;28252:112::-;28284:1;28310;28300:35;;28315:18;;:::i;:::-;-1:-1:-1;28349:9:1;;28252:112::o;28369:127::-;28430:10;28425:3;28421:20;28418:1;28411:31;28461:4;28458:1;28451:15;28485:4;28482:1;28475:15;28501:127;28562:10;28557:3;28553:20;28550:1;28543:31;28593:4;28590:1;28583:15;28617:4;28614:1;28607:15;28633:127;28694:10;28689:3;28685:20;28682:1;28675:31;28725:4;28722:1;28715:15;28749:4;28746:1;28739:15;28765:127;28826:10;28821:3;28817:20;28814:1;28807:31;28857:4;28854:1;28847:15;28881:4;28878:1;28871:15;28897:127;28958:10;28953:3;28949:20;28946:1;28939:31;28989:4;28986:1;28979:15;29013:4;29010:1;29003:15;29029:131;-1:-1:-1;;;;;;29103:32:1;;29093:43;;29083:71;;29150:1;29147;29140:12
Swarm Source
ipfs://c7737205e61dc754a6205a2cb021acfa64c1bc9deb4e89d1c3a966f86b37a949
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.