ERC-721
Overview
Max Total Supply
0 MYSTIC
Holders
316
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MYSTICLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MysticWizards
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT /* * * Mystic Wizards Contract * * Contract by Matt Casanova [Twitter: @DevGuyThings] * * Launched on Hashku * */ pragma solidity 0.8.10; import "./Hashku.sol"; // MYSTIC WIZARDS WITHDRAWAL ADDRESS: 0x82d2d60103A9455Efe466831e38d1418927b1358 contract MysticWizards is Hashku { uint public presalePrice = 50000000000000000; mapping(uint256 => uint256) public tokenAffinities; constructor() Hashku( "Mystic Wizards", "MYSTIC", "https://storage.hashku.com/api/mystic-wizards/main/", "MYSTIC", 7777, 10, 20, 60000000000000000, 5, 0x82d2d60103A9455Efe466831e38d1418927b1358 ) { } // convenience function used by Hashku to check max for UI function maxMintPerTransaction() public view override returns (uint256) { if (isPublic) { return maxMintPerTransactionNumber; } return 0; } // convenience function used by Hashku to check max for UI; 0 is unlimited function maxMintPerAddress() public view override returns (uint256) { if (isPublic) { return 0; } return maxMintPerAddressNumber; } // convenience function used by Hashku to check max for UI function price() public view override returns (uint256) { if (isPublic) { return priceNumber; } return presalePrice; } // public minting: max tokens per transaction only function shop(uint256 _amount) external override payable { require(_amount <= maxMintPerTransactionNumber, "max_mintable"); require(nextToken() + _amount <= maxTokens, "not_enough_tokens"); require(!isClosed, "is_closed"); require(isPublic, "not_public"); require(priceNumber * _amount == msg.value, "incorrect_funds"); for (uint256 i = 0; i < _amount; i++) { mint(_msgSender()); } } // pre-sale minting: max tokens per address, signature required function shop(uint256 _amount, bytes memory _signature) external override payable { require(tokensMinted[_msgSender()] + _amount <= maxMintPerAddressNumber, "max_minted"); require(nextToken() + _amount <= maxTokens, "not_enough_tokens"); require(!isPublic, "is_public"); require(!isClosed, "is_closed"); require(verifySignature(_signature), "invalid_signature"); require(presalePrice * _amount == msg.value, "incorrect_funds"); tokensMinted[_msgSender()] += _amount; for (uint256 i = 0; i < _amount; i++) { mint(_msgSender()); } } function setPresalePrice(uint256 _price) external onlyOwner { presalePrice = _price; } function setTokenAffinities(uint256[] calldata _tokenIds, uint256[] calldata _affinityIds) external onlyOwner { require(_tokenIds.length == _affinityIds.length, "amount_mismatch"); for (uint256 i = 0; i < _tokenIds.length; i++) { tokenAffinities[_tokenIds[i]] = _affinityIds[i]; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "./Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 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)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT /* * * Hashku Contract * * Contract by Matt Casanova [Twitter: @DevGuyThings] * * To be used as base contract for ERC721 when minting on Hashku * */ pragma solidity 0.8.10; import "./ERC721.sol"; import "./IERC2981.sol"; import "./Ownable.sol"; import "./Address.sol"; import "./Strings.sol"; import "./Context.sol"; import "./Counters.sol"; import "./ECDSA.sol"; import "./SafeMath.sol"; contract Hashku is Context, Ownable, ERC721, IERC2981 { using Address for address; using Strings for uint256; using Counters for Counters.Counter; using ECDSA for bytes32; Counters.Counter private tokenIdTracker; string public baseTokenURI; string public key = "SHOP"; string public group = "init"; uint256 internal maxMintPerAddressNumber; uint256 internal maxMintPerTransactionNumber; uint256 public maxTokens; uint256 internal priceNumber; bool public isPublic; bool public isClosed; mapping(address => uint256) public tokensMinted; address public withdrawalAddress; address public verifySigner; uint256 public royaltyPercent; address public proxyRegistryAddress; event ContractUpdated(string _type); modifier onlyWithdrawer() { require(withdrawalAddress != address(0), "no_withdrawals"); require(withdrawalAddress == _msgSender(), "not_allowed"); _; } constructor( string memory _name, string memory _symbol, string memory _baseTokenURI, string memory _key, uint256 _maxTokens, uint256 _maxMintPerAddress, uint256 _maxMintPerTransaction, uint256 _price, uint256 _royaltyPercent, address _withdrawalAddress ) ERC721(_name, _symbol) { baseTokenURI = _baseTokenURI; key = _key; maxTokens = _maxTokens; maxMintPerAddressNumber = _maxMintPerAddress; maxMintPerTransactionNumber = _maxMintPerTransaction; priceNumber = _price; royaltyPercent = _royaltyPercent; withdrawalAddress = _withdrawalAddress; verifySigner = _msgSender(); } // support IERC2981 function supportsInterface(bytes4 _interfaceId) public view virtual override (ERC721, IERC165) returns (bool) { return _interfaceId == type(IERC2981).interfaceId || super.supportsInterface(_interfaceId); } // return the token URI for a specific token function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "no_token"); return bytes(baseTokenURI).length > 0 ? string(abi.encodePacked(baseTokenURI, _tokenId.toString())) : ""; } // internal mint function, incrementing token function mint(address _to) internal { _safeMint(_to, tokenIdTracker.current()); tokenIdTracker.increment(); } // owner sends NFTs to addresses function send(address[] calldata _addresses, uint256[] calldata _amounts) external onlyOwner { require(_addresses.length == _amounts.length, "amount_mismatch"); uint256 total; for (uint256 t = 0; t < _amounts.length; t++) { total += _amounts[t]; } require(nextToken() + total <= maxTokens, "not_enough_tokens"); delete total; for (uint256 i = 0; i < _addresses.length; i++) { for (uint256 a = 0; a < _amounts[i]; a++) { mint(_addresses[i]); } } } // buy NFTs - version without signature required for public mint function shop(uint256 _amount) external virtual payable { require(nextToken() + _amount <= maxTokens, "not_enough_tokens"); if (maxMintPerAddressNumber > 0) { require(tokensMinted[_msgSender()] + _amount <= maxMintPerAddressNumber, "max_minted"); } if (maxMintPerTransactionNumber > 0) { require(_amount <= maxMintPerTransactionNumber, "max_mintable"); } require(!isClosed, "is_closed"); require(isPublic, "not_public"); require(priceNumber * _amount == msg.value, "incorrect_funds"); for (uint256 i = 0; i < _amount; i++) { mint(_msgSender()); } } // buy NFTs function shop(uint256 _amount, bytes memory _signature) external virtual payable { require(nextToken() + _amount <= maxTokens, "not_enough_tokens"); if (maxMintPerAddressNumber > 0) { require(tokensMinted[_msgSender()] + _amount <= maxMintPerAddressNumber, "max_minted"); } if (maxMintPerTransactionNumber > 0) { require(_amount <= maxMintPerTransactionNumber, "max_mintable"); } require(!isClosed, "is_closed"); require(verifySignature(_signature), "invalid_signature"); require(priceNumber * _amount == msg.value, "incorrect_funds"); for (uint256 i = 0; i < _amount; i++) { mint(_msgSender()); } } // return the id for the next token that will be minted function nextToken() public view returns (uint256) { return tokenIdTracker.current(); } // convenience method for front end to call contract and check if a user can mint function canMint(uint256 _amount) public view virtual returns (bool) { if (maxTokens > 0) { if (nextToken() + _amount > maxTokens) { return false; } } if (maxMintPerTransactionNumber > 0) { if (_amount > maxMintPerTransactionNumber) { return false; } } if (maxMintPerAddressNumber > 0) { if (tokensMinted[_msgSender()] + _amount > maxMintPerAddressNumber) { return false; } } return true; } // convenience function used by dapp to check max for interface function price() public view virtual returns (uint256) { return priceNumber; } // convenience function used by dapp to check max for interface function maxMintPerAddress() public view virtual returns (uint256) { return maxMintPerAddressNumber; } // convenience function used by dapp to check max for interface function maxMintPerTransaction() public view virtual returns (uint256) { return maxMintPerTransactionNumber; } // check if a msg sender is eligible to shop - public version without signature required function eligible() public view virtual returns (bool) { if (isClosed) { return false; } return isPublic; } // check if a msg sender is eligible to shop function eligible(bytes memory _signature) public view virtual returns (bool) { if (isClosed) { return false; } if (isPublic) { return true; } return verifySignature(_signature); } // owner can ONLY decrease the total number of available tokens function decreaseMaxTokens(uint256 _amount) external virtual onlyOwner { require(_amount < maxTokens, "only_decrease"); maxTokens = _amount; emit ContractUpdated("maxTokens"); } // owner set the contract to public mode function setIsPublic(bool _public) external virtual onlyOwner { isPublic = _public; emit ContractUpdated("isPublic"); } // owner set the contract to closed function setIsClosed(bool _closed) external virtual onlyOwner { isClosed = _closed; emit ContractUpdated("isClosed"); } // owner set the price of minting function setPrice(uint256 _price) external virtual onlyOwner { priceNumber = _price; emit ContractUpdated("price"); } // set the maximum amount an address may mint function setMaxMintPerAddress(uint256 _amount) external virtual onlyOwner { maxMintPerAddressNumber = _amount; emit ContractUpdated("maxMintPerAddress"); } // set the maximum amount an address may mint function setMaxMintPerTransaction(uint256 _amount) external virtual onlyOwner { maxMintPerTransactionNumber = _amount; emit ContractUpdated("maxMintPerTransaction"); } // owner set the contract key for signature verification function setKey(string calldata _key) external virtual onlyOwner { key = _key; emit ContractUpdated("key"); } // set the current contract group for signature verification function setGroup(string memory _group) external virtual onlyOwner { group = _group; emit ContractUpdated("group"); } // owner set a new base token URI function setBaseUri(string calldata _baseTokenURI) external virtual onlyOwner { baseTokenURI = _baseTokenURI; emit ContractUpdated("baseURI"); } // owner set a new address for signature verification function setVerifySigner(address _verifySigner) external virtual onlyOwner { verifySigner = _verifySigner; emit ContractUpdated("verifySigner"); } // verify signature based on contract key, contract group, token amount, and the msg sender function verifySignature( bytes memory _signature ) internal view virtual returns (bool) { bytes32 _messageHash = keccak256(abi.encodePacked(key, group, _msgSender())); return _messageHash.toEthSignedMessageHash().recover(_signature) == verifySigner; } // set the royalty percent function setRoyaltyPercent(uint256 _amount) external virtual onlyOwner { royaltyPercent = _amount; emit ContractUpdated("royaltyPercent"); } // EIP-2981 royaltyInfo function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view virtual override returns (address receiver, uint256 royaltyAmount) { require(_exists(_tokenId), "no_token"); return (address(this), SafeMath.div(SafeMath.mul(_salePrice, royaltyPercent), 100)); } // withdrawal address convenience method for pulling balance of contract function seeBalance() external view virtual onlyWithdrawer returns (uint256) { return address(this).balance; } // withdrawal address send an amount to an address function withdraw(address payable _to, uint256 _amount) external virtual onlyWithdrawer returns (bool) { require(_amount <= address(this).balance, "insufficient_funds"); _to.transfer(_amount); return true; } // withdrawal address set a new withdrawal address function setWithdrawalAddress(address _address) external virtual onlyWithdrawer { withdrawalAddress = _address; emit ContractUpdated("withdrawalAddress"); } // owner can set the proxy registry access after deploy function setProxyRegistryAddress(address _proxy) external virtual onlyOwner { // OpenSea Rinkeby Address = "0xf57b2c51ded3a29e6891aba85459d600256cf317"; // OpenSea Mainnet Address = "0xa5409ec958c83c3f309868babaca7c86dcb077c1"; proxyRegistryAddress = _proxy; emit ContractUpdated("proxyRegistryAddress"); } // override isApprovedForAll to allow proxy address for OpenSea gasless listing function isApprovedForAll(address _owner, address _operator) public view virtual override returns (bool) { if (proxyRegistryAddress != address(0)) { ProxyRegistry _proxyRegistry = ProxyRegistry(proxyRegistryAddress); if (address(_proxyRegistry.proxies(_owner)) == _operator) { return true; } } return super.isApprovedForAll(_owner, _operator); } } contract OwnableDelegateProxy {} contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * @dev Called with the sale price to determine how much royalty is owed and to whom. * @param tokenId - the NFT asset queried for royalty information * @param salePrice - the sale price of the NFT asset specified by `tokenId` * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
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":false,"internalType":"string","name":"_type","type":"string"}],"name":"ContractUpdated","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"canMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"decreaseMaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"eligible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eligible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"group","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"isClosed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"key","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextToken","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":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercent","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":"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":[],"name":"seeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"send","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":"_baseTokenURI","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_group","type":"string"}],"name":"setGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_closed","type":"bool"}],"name":"setIsClosed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_public","type":"bool"}],"name":"setIsPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_key","type":"string"}],"name":"setKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxMintPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxMintPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxy","type":"address"}],"name":"setProxyRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setRoyaltyPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_affinityIds","type":"uint256[]"}],"name":"setTokenAffinities","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_verifySigner","type":"address"}],"name":"setVerifySigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setWithdrawalAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"shop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"shop","outputs":[],"stateMutability":"payable","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":"","type":"uint256"}],"name":"tokenAffinities","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":[{"internalType":"address","name":"","type":"address"}],"name":"tokensMinted","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":[],"name":"verifySigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040526004608081905263053484f560e41b60a090815262000027916009919062000236565b50604080518082019091526004808252631a5b9a5d60e21b60209092019182526200005591600a9162000236565b5066b1a2bc2ec500006015553480156200006e57600080fd5b506040518060400160405280600e81526020016d4d79737469632057697a6172647360901b815250604051806040016040528060068152602001654d595354494360d01b81525060405180606001604052806033815260200162004b70603391396040805180820190915260068152654d595354494360d01b6020820152611e61600a601466d529ae9e86000060057382d2d60103a9455efe466831e38d1418927b135889896200011f33620001e6565b81516200013490600190602085019062000236565b5080516200014a90600290602084019062000236565b5050885162000162915060089060208b019062000236565b508651620001789060099060208a019062000236565b50600d869055600b859055600c849055600e8390556013829055601180546001600160a01b0319166001600160a01b038316179055620001b53390565b601280546001600160a01b0319166001600160a01b0392909216919091179055506200031998505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200024490620002dc565b90600052602060002090601f016020900481019282620002685760008555620002b3565b82601f106200028357805160ff1916838001178555620002b3565b82800160010185558215620002b3579182015b82811115620002b357825182559160200191906001019062000296565b50620002c1929150620002c5565b5090565b5b80821115620002c15760008155600101620002c6565b600181811c90821680620002f157607f821691505b602082108114156200031357634e487b7160e01b600052602260045260246000fd5b50919050565b61484780620003296000396000f3fe6080604052600436106103755760003560e01c80639499ac54116101d1578063cd7c032611610102578063e0d11a47116100a0578063f2bcd0221161006f578063f2bcd02214610a19578063f2fde38b14610a46578063f3fef3a314610a66578063fdab3b3f14610a8657600080fd5b8063e0d11a4714610996578063e8315742146109b6578063e8c61831146109cc578063e985e9c5146109f957600080fd5b8063d832d92f116100dc578063d832d92f14610941578063d870155414610956578063da69c08314610969578063dc9a15351461097c57600080fd5b8063cd7c0326146108df578063d26ea6c01461090c578063d547cfb71461092c57600080fd5b8063a645ff5f1161016f578063c2b6b58c11610149578063c2b6b58c14610860578063c612879f1461087f578063c87b56dd1461089f578063c97b9730146108bf57600080fd5b8063a645ff5f14610800578063af42d10614610820578063b88d4fde1461084057600080fd5b80639f67756d116101ab5780639f67756d14610795578063a035b1fe146107ab578063a0bcfc7f146107c0578063a22cb465146107e057600080fd5b80639499ac541461074b57806395d89b41146107605780639a4fc6401461077557600080fd5b80633549345e116102ab5780635dd871a311610249578063715018a611610223578063715018a6146106cb5780638da5cb5b146106e05780638edb25a01461070b57806391b7f5ed1461072b57600080fd5b80635dd871a31461066b5780636352211e1461068b57806370a08231146106ab57600080fd5b8063429a1bb011610285578063429a1bb0146105f457806349668b4a146106095780635461048114610629578063572849c41461065657600080fd5b80633549345e1461059f5780633943380c146105bf57806342842e0e146105d457600080fd5b80631e14d44b1161031857806327a9574e116102f257806327a9574e146104fe57806329e7ef2d1461051e5780632a55205a146105335780632e6cebe51461057f57600080fd5b80631e14d44b1461049e57806321b8092e146104be57806323b872dd146104de57600080fd5b806304f928c21161035457806304f928c2146103e857806306fdde0314610415578063081812fc14610437578063095ea7b31461047c57600080fd5b80620e7fa81461037a57806301f56997146103a357806301ffc9a7146103b8575b600080fd5b34801561038657600080fd5b5061039060155481565b6040519081526020015b60405180910390f35b3480156103af57600080fd5b50610390610aa6565b3480156103c457600080fd5b506103d86103d3366004613f0f565b610ac1565b604051901515815260200161039a565b3480156103f457600080fd5b50610390610403366004613f2c565b60166020526000908152604090205481565b34801561042157600080fd5b5061042a610b1d565b60405161039a9190613fbb565b34801561044357600080fd5b50610457610452366004613f2c565b610baf565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161039a565b34801561048857600080fd5b5061049c610497366004613ff0565b610c74565b005b3480156104aa57600080fd5b5061049c6104b9366004613f2c565b610dcd565b3480156104ca57600080fd5b5061049c6104d936600461401c565b610ea4565b3480156104ea57600080fd5b5061049c6104f9366004614039565b61100e565b34801561050a57600080fd5b5061049c6105193660046140bf565b611095565b34801561052a57600080fd5b5061042a6111b8565b34801561053f57600080fd5b5061055361054e36600461412b565b611246565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520161039a565b34801561058b57600080fd5b5061049c61059a366004613f2c565b6112dc565b3480156105ab57600080fd5b5061049c6105ba366004613f2c565b6113a8565b3480156105cb57600080fd5b5061042a611414565b3480156105e057600080fd5b5061049c6105ef366004614039565b611421565b34801561060057600080fd5b5061039061143c565b34801561061557600080fd5b5061049c610624366004614162565b611510565b34801561063557600080fd5b5061039061064436600461401c565b60106020526000908152604090205481565b34801561066257600080fd5b50610390611609565b34801561067757600080fd5b506103d8610686366004613f2c565b611624565b34801561069757600080fd5b506104576106a6366004613f2c565b6116a9565b3480156106b757600080fd5b506103906106c636600461401c565b611741565b3480156106d757600080fd5b5061049c6117f5565b3480156106ec57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610457565b34801561071757600080fd5b5061049c610726366004613f2c565b611868565b34801561073757600080fd5b5061049c610746366004613f2c565b611985565b34801561075757600080fd5b50610390611a51565b34801561076c57600080fd5b5061042a611a61565b34801561078157600080fd5b5061049c610790366004613f2c565b611a70565b3480156107a157600080fd5b5061039060135481565b3480156107b757600080fd5b50610390611b3c565b3480156107cc57600080fd5b5061049c6107db36600461417d565b611b58565b3480156107ec57600080fd5b5061049c6107fb3660046141ef565b611c37565b34801561080c57600080fd5b5061049c61081b3660046140bf565b611c46565b34801561082c57600080fd5b5061049c61083b36600461417d565b611e31565b34801561084c57600080fd5b5061049c61085b366004614307565b611f04565b34801561086c57600080fd5b50600f546103d890610100900460ff1681565b34801561088b57600080fd5b506103d861089a366004614373565b611f92565b3480156108ab57600080fd5b5061042a6108ba366004613f2c565b611fc9565b3480156108cb57600080fd5b5061049c6108da3660046143a8565b612099565b3480156108eb57600080fd5b506014546104579073ffffffffffffffffffffffffffffffffffffffff1681565b34801561091857600080fd5b5061049c61092736600461401c565b612173565b34801561093857600080fd5b5061042a612278565b34801561094d57600080fd5b506103d8612285565b61049c6109643660046143f1565b6122a8565b61049c610977366004613f2c565b61251f565b34801561098857600080fd5b50600f546103d89060ff1681565b3480156109a257600080fd5b5061049c6109b136600461401c565b612701565b3480156109c257600080fd5b50610390600d5481565b3480156109d857600080fd5b506012546104579073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a0557600080fd5b506103d8610a14366004614438565b61280a565b348015610a2557600080fd5b506011546104579073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a5257600080fd5b5061049c610a6136600461401c565b61292a565b348015610a7257600080fd5b506103d8610a81366004613ff0565b612a26565b348015610a9257600080fd5b5061049c610aa1366004614162565b612b92565b600f5460009060ff1615610abb5750600c5490565b50600090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a000000000000000000000000000000000000000000000000000000001480610b175750610b1782612c87565b92915050565b606060018054610b2c90614471565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5890614471565b8015610ba55780601f10610b7a57610100808354040283529160200191610ba5565b820191906000526020600020905b815481529060010190602001808311610b8857829003601f168201915b5050505050905090565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16610c4b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610c7f826116a9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d235760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610c42565b3373ffffffffffffffffffffffffffffffffffffffff82161480610d4c5750610d4c813361280a565b610dbe5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c42565b610dc88383612d6a565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600b8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526011908201527f6d61784d696e7450657241646472657373000000000000000000000000000000604082015260600190565b60405180910390a150565b60115473ffffffffffffffffffffffffffffffffffffffff16610f095760405162461bcd60e51b815260206004820152600e60248201527f6e6f5f7769746864726177616c730000000000000000000000000000000000006044820152606401610c42565b60115473ffffffffffffffffffffffffffffffffffffffff163314610f705760405162461bcd60e51b815260206004820152600b60248201527f6e6f745f616c6c6f7765640000000000000000000000000000000000000000006044820152606401610c42565b601180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161781556040805160208082528101929092527f7769746864726177616c41646472657373000000000000000000000000000000908201527f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290606001610e99565b6110183382612e0a565b61108a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c42565b610dc8838383612f33565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110fc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b82811461114b5760405162461bcd60e51b815260206004820152600f60248201527f616d6f756e745f6d69736d6174636800000000000000000000000000000000006044820152606401610c42565b60005b838110156111b157828282818110611168576111686144c5565b9050602002013560166000878785818110611185576111856144c5565b9050602002013581526020019081526020016000208190555080806111a990614523565b91505061114e565b5050505050565b600a80546111c590614471565b80601f01602080910402602001604051908101604052809291908181526020018280546111f190614471565b801561123e5780601f106112135761010080835404028352916020019161123e565b820191906000526020600020905b81548152906001019060200180831161122157829003601f168201915b505050505081565b600082815260036020526040812054819073ffffffffffffffffffffffffffffffffffffffff166112b95760405162461bcd60e51b815260206004820152600860248201527f6e6f5f746f6b656e0000000000000000000000000000000000000000000000006044820152606401610c42565b306112d06112c985601354613166565b6064613172565b915091505b9250929050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600c8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526015908201527f6d61784d696e745065725472616e73616374696f6e0000000000000000000000604082015260600190565b60005473ffffffffffffffffffffffffffffffffffffffff16331461140f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b601555565b600980546111c590614471565b610dc883838360405180602001604052806000815250611f04565b60115460009073ffffffffffffffffffffffffffffffffffffffff166114a45760405162461bcd60e51b815260206004820152600e60248201527f6e6f5f7769746864726177616c730000000000000000000000000000000000006044820152606401610c42565b60115473ffffffffffffffffffffffffffffffffffffffff16331461150b5760405162461bcd60e51b815260206004820152600b60248201527f6e6f745f616c6c6f7765640000000000000000000000000000000000000000006044820152606401610c42565b504790565b60005473ffffffffffffffffffffffffffffffffffffffff1633146115775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600f8054821515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526008908201527f6973436c6f736564000000000000000000000000000000000000000000000000604082015260600190565b600f5460009060ff161561161d5750600090565b50600b5490565b600d546000901561165357600d548261163b611a51565b611645919061455c565b111561165357506000919050565b600c541561166d57600c5482111561166d57506000919050565b600b54156116a157600b543360009081526010602052604090205461169390849061455c565b11156116a157506000919050565b506001919050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610b175760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610c42565b600073ffffffffffffffffffffffffffffffffffffffff82166117cc5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610c42565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff16331461185c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b611866600061317e565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600d5481106119205760405162461bcd60e51b815260206004820152600d60248201527f6f6e6c795f6465637265617365000000000000000000000000000000000000006044820152606401610c42565b600d8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526009908201527f6d6178546f6b656e730000000000000000000000000000000000000000000000604082015260600190565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600e8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526005908201527f7072696365000000000000000000000000000000000000000000000000000000604082015260600190565b6000611a5c60075490565b905090565b606060028054610b2c90614471565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ad75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b60138190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e99906020808252600e908201527f726f79616c747950657263656e74000000000000000000000000000000000000604082015260600190565b600f5460009060ff1615611b515750600e5490565b5060155490565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bbf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b611bcb60088383613db6565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b442604051611c2b9060208082526007908201527f6261736555524900000000000000000000000000000000000000000000000000604082015260600190565b60405180910390a15050565b611c423383836131f3565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b828114611cfc5760405162461bcd60e51b815260206004820152600f60248201527f616d6f756e745f6d69736d6174636800000000000000000000000000000000006044820152606401610c42565b6000805b82811015611d4057838382818110611d1a57611d1a6144c5565b9050602002013582611d2c919061455c565b915080611d3881614523565b915050611d00565b50600d5481611d4d611a51565b611d57919061455c565b1115611da55760405162461bcd60e51b815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610c42565b506000805b84811015611e295760005b848483818110611dc757611dc76144c5565b90506020020135811015611e1657611e04878784818110611dea57611dea6144c5565b9050602002016020810190611dff919061401c565b613307565b80611e0e81614523565b915050611db5565b5080611e2181614523565b915050611daa565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b611ea460098383613db6565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b442604051611c2b9060208082526003908201527f6b65790000000000000000000000000000000000000000000000000000000000604082015260600190565b611f0e3383612e0a565b611f805760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c42565b611f8c84848484613327565b50505050565b600f54600090610100900460ff1615611fad57506000919050565b600f5460ff1615611fc057506001919050565b610b17826133b0565b60008181526003602052604090205460609073ffffffffffffffffffffffffffffffffffffffff1661203d5760405162461bcd60e51b815260206004820152600860248201527f6e6f5f746f6b656e0000000000000000000000000000000000000000000000006044820152606401610c42565b60006008805461204c90614471565b9050116120685760405180602001604052806000815250610b17565b60086120738361349b565b604051602001612084929190614645565b60405160208183030381529060405292915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b805161211390600a906020840190613e58565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b442604051610e999060208082526005908201527f67726f7570000000000000000000000000000000000000000000000000000000604082015260600190565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121da5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b601480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161781556040805160208082528101929092527f70726f7879526567697374727941646472657373000000000000000000000000908201527f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290606001610e99565b600880546111c590614471565b600f54600090610100900460ff161561229e5750600090565b50600f5460ff1690565b600b54336000908152601060205260409020546122c690849061455c565b11156123145760405162461bcd60e51b815260206004820152600a60248201527f6d61785f6d696e746564000000000000000000000000000000000000000000006044820152606401610c42565b600d5482612320611a51565b61232a919061455c565b11156123785760405162461bcd60e51b815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610c42565b600f5460ff16156123cb5760405162461bcd60e51b815260206004820152600960248201527f69735f7075626c696300000000000000000000000000000000000000000000006044820152606401610c42565b600f54610100900460ff16156124235760405162461bcd60e51b815260206004820152600960248201527f69735f636c6f73656400000000000000000000000000000000000000000000006044820152606401610c42565b61242c816133b0565b6124785760405162461bcd60e51b815260206004820152601160248201527f696e76616c69645f7369676e61747572650000000000000000000000000000006044820152606401610c42565b3482601554612487919061466a565b146124d45760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563745f66756e647300000000000000000000000000000000006044820152606401610c42565b33600090815260106020526040812080548492906124f390849061455c565b90915550600090505b82811015610dc85761250d33613307565b8061251781614523565b9150506124fc565b600c548111156125715760405162461bcd60e51b815260206004820152600c60248201527f6d61785f6d696e7461626c6500000000000000000000000000000000000000006044820152606401610c42565b600d548161257d611a51565b612587919061455c565b11156125d55760405162461bcd60e51b815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610c42565b600f54610100900460ff161561262d5760405162461bcd60e51b815260206004820152600960248201527f69735f636c6f73656400000000000000000000000000000000000000000000006044820152606401610c42565b600f5460ff1661267f5760405162461bcd60e51b815260206004820152600a60248201527f6e6f745f7075626c6963000000000000000000000000000000000000000000006044820152606401610c42565b3481600e5461268e919061466a565b146126db5760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563745f66756e647300000000000000000000000000000000006044820152606401610c42565b60005b81811015611c42576126ef33613307565b806126f981614523565b9150506126de565b60005473ffffffffffffffffffffffffffffffffffffffff1633146127685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b6012805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e99906020808252600c908201527f7665726966795369676e65720000000000000000000000000000000000000000604082015260600190565b60145460009073ffffffffffffffffffffffffffffffffffffffff16156128ec576014546040517fc455279100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015291821691841690829063c455279190602401602060405180830381865afa1580156128a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c491906146a7565b73ffffffffffffffffffffffffffffffffffffffff1614156128ea576001915050610b17565b505b73ffffffffffffffffffffffffffffffffffffffff80841660009081526006602090815260408083209386168352929052205460ff165b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146129915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b73ffffffffffffffffffffffffffffffffffffffff8116612a1a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c42565b612a238161317e565b50565b60115460009073ffffffffffffffffffffffffffffffffffffffff16612a8e5760405162461bcd60e51b815260206004820152600e60248201527f6e6f5f7769746864726177616c730000000000000000000000000000000000006044820152606401610c42565b60115473ffffffffffffffffffffffffffffffffffffffff163314612af55760405162461bcd60e51b815260206004820152600b60248201527f6e6f745f616c6c6f7765640000000000000000000000000000000000000000006044820152606401610c42565b47821115612b455760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e745f66756e647300000000000000000000000000006044820152606401610c42565b60405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084906000818181858888f19350505050158015612b88573d6000803e3d6000fd5b5060019392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bf95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600f80548215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526008908201527f69735075626c6963000000000000000000000000000000000000000000000000604082015260600190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480612d1a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b1757507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610b17565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190612dc4826116a9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16612ea15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c42565b6000612eac836116a9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f1b57508373ffffffffffffffffffffffffffffffffffffffff16612f0384610baf565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f2b5750612f2b818561280a565b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16612f53826116a9565b73ffffffffffffffffffffffffffffffffffffffff1614612fdc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610c42565b73ffffffffffffffffffffffffffffffffffffffff82166130645760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c42565b61306f600082612d6a565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602052604081208054600192906130a59084906146c4565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526004602052604081208054600192906130e090849061455c565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000612923828461466a565b6000612923828461470a565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561326f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c42565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6133198161331460075490565b6135cd565b612a23600780546001019055565b613332848484612f33565b61333e848484846135e7565b611f8c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c42565b6000806009600a336040516020016133ca9392919061471e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012060125490915073ffffffffffffffffffffffffffffffffffffffff1661347d84613477846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b906137bd565b73ffffffffffffffffffffffffffffffffffffffff16149392505050565b6060816134db57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561350557806134ef81614523565b91506134fe9050600a8361470a565b91506134df565b60008167ffffffffffffffff81111561352057613520614224565b6040519080825280601f01601f19166020018201604052801561354a576020820181803683370190505b5090505b8415612f2b5761355f6001836146c4565b915061356c600a86614768565b61357790603061455c565b60f81b81838151811061358c5761358c6144c5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135c6600a8661470a565b945061354e565b611c428282604051806020016040528060008152506137e1565b600073ffffffffffffffffffffffffffffffffffffffff84163b156137b2576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061365e90339089908890889060040161477c565b6020604051808303816000875af19250505080156136b7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526136b4918101906147c5565b60015b613767573d8080156136e5576040519150601f19603f3d011682016040523d82523d6000602084013e6136ea565b606091505b50805161375f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c42565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612f2b565b506001949350505050565b60008060006137cc858561386a565b915091506137d9816138d7565b509392505050565b6137eb8383613ac8565b6137f860008484846135e7565b610dc85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c42565b6000808251604114156138a15760208301516040840151606085015160001a61389587828585613c56565b945094505050506112d5565b8251604014156138cb57602083015160408401516138c0868383613d6e565b9350935050506112d5565b506000905060026112d5565b60008160048111156138eb576138eb6147e2565b14156138f45750565b6001816004811115613908576139086147e2565b14156139565760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610c42565b600281600481111561396a5761396a6147e2565b14156139b85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610c42565b60038160048111156139cc576139cc6147e2565b1415613a405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610c42565b6004816004811115613a5457613a546147e2565b1415612a235760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610c42565b73ffffffffffffffffffffffffffffffffffffffff8216613b2b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c42565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615613b9d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c42565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460205260408120805460019290613bd390849061455c565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613c8d5750600090506003613d65565b8460ff16601b14158015613ca557508460ff16601c14155b15613cb65750600090506004613d65565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613d0a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116613d5e57600060019250925050613d65565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b01613da887828885613c56565b935093505050935093915050565b828054613dc290614471565b90600052602060002090601f016020900481019282613de45760008555613e48565b82601f10613e1b578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555613e48565b82800160010185558215613e48579182015b82811115613e48578235825591602001919060010190613e2d565b50613e54929150613ecc565b5090565b828054613e6490614471565b90600052602060002090601f016020900481019282613e865760008555613e48565b82601f10613e9f57805160ff1916838001178555613e48565b82800160010185558215613e48579182015b82811115613e48578251825591602001919060010190613eb1565b5b80821115613e545760008155600101613ecd565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612a2357600080fd5b600060208284031215613f2157600080fd5b813561292381613ee1565b600060208284031215613f3e57600080fd5b5035919050565b60005b83811015613f60578181015183820152602001613f48565b83811115611f8c5750506000910152565b60008151808452613f89816020860160208601613f45565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129236020830184613f71565b73ffffffffffffffffffffffffffffffffffffffff81168114612a2357600080fd5b6000806040838503121561400357600080fd5b823561400e81613fce565b946020939093013593505050565b60006020828403121561402e57600080fd5b813561292381613fce565b60008060006060848603121561404e57600080fd5b833561405981613fce565b9250602084013561406981613fce565b929592945050506040919091013590565b60008083601f84011261408c57600080fd5b50813567ffffffffffffffff8111156140a457600080fd5b6020830191508360208260051b85010111156112d557600080fd5b600080600080604085870312156140d557600080fd5b843567ffffffffffffffff808211156140ed57600080fd5b6140f98883890161407a565b9096509450602087013591508082111561411257600080fd5b5061411f8782880161407a565b95989497509550505050565b6000806040838503121561413e57600080fd5b50508035926020909101359150565b8035801515811461415d57600080fd5b919050565b60006020828403121561417457600080fd5b6129238261414d565b6000806020838503121561419057600080fd5b823567ffffffffffffffff808211156141a857600080fd5b818501915085601f8301126141bc57600080fd5b8135818111156141cb57600080fd5b8660208285010111156141dd57600080fd5b60209290920196919550909350505050565b6000806040838503121561420257600080fd5b823561420d81613fce565b915061421b6020840161414d565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561426e5761426e614224565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156142b4576142b4614224565b816040528093508581528686860111156142cd57600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126142f857600080fd5b61292383833560208501614253565b6000806000806080858703121561431d57600080fd5b843561432881613fce565b9350602085013561433881613fce565b925060408501359150606085013567ffffffffffffffff81111561435b57600080fd5b614367878288016142e7565b91505092959194509250565b60006020828403121561438557600080fd5b813567ffffffffffffffff81111561439c57600080fd5b612f2b848285016142e7565b6000602082840312156143ba57600080fd5b813567ffffffffffffffff8111156143d157600080fd5b8201601f810184136143e257600080fd5b612f2b84823560208401614253565b6000806040838503121561440457600080fd5b82359150602083013567ffffffffffffffff81111561442257600080fd5b61442e858286016142e7565b9150509250929050565b6000806040838503121561444b57600080fd5b823561445681613fce565b9150602083013561446681613fce565b809150509250929050565b600181811c9082168061448557607f821691505b602082108114156144bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614555576145556144f4565b5060010190565b6000821982111561456f5761456f6144f4565b500190565b8054600090600181811c908083168061458e57607f831692505b60208084108214156145c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b8180156145dd576001811461460c57614639565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650614639565b60008881526020902060005b868110156146315781548b820152908501908301614618565b505084890196505b50505050505092915050565b60006146518285614574565b8351614661818360208801613f45565b01949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146a2576146a26144f4565b500290565b6000602082840312156146b957600080fd5b815161292381613fce565b6000828210156146d6576146d66144f4565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614719576147196146db565b500490565b600061473361472d8387614574565b85614574565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168352505060140192915050565b600082614777576147776146db565b500690565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526147bb6080830184613f71565b9695505050505050565b6000602082840312156147d757600080fd5b815161292381613ee1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220d7dee0c97a09282bb46671c4128444c97c2900424233e210b350daf5439cb9b164736f6c634300080a003368747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f6d79737469632d77697a617264732f6d61696e2f
Deployed Bytecode
0x6080604052600436106103755760003560e01c80639499ac54116101d1578063cd7c032611610102578063e0d11a47116100a0578063f2bcd0221161006f578063f2bcd02214610a19578063f2fde38b14610a46578063f3fef3a314610a66578063fdab3b3f14610a8657600080fd5b8063e0d11a4714610996578063e8315742146109b6578063e8c61831146109cc578063e985e9c5146109f957600080fd5b8063d832d92f116100dc578063d832d92f14610941578063d870155414610956578063da69c08314610969578063dc9a15351461097c57600080fd5b8063cd7c0326146108df578063d26ea6c01461090c578063d547cfb71461092c57600080fd5b8063a645ff5f1161016f578063c2b6b58c11610149578063c2b6b58c14610860578063c612879f1461087f578063c87b56dd1461089f578063c97b9730146108bf57600080fd5b8063a645ff5f14610800578063af42d10614610820578063b88d4fde1461084057600080fd5b80639f67756d116101ab5780639f67756d14610795578063a035b1fe146107ab578063a0bcfc7f146107c0578063a22cb465146107e057600080fd5b80639499ac541461074b57806395d89b41146107605780639a4fc6401461077557600080fd5b80633549345e116102ab5780635dd871a311610249578063715018a611610223578063715018a6146106cb5780638da5cb5b146106e05780638edb25a01461070b57806391b7f5ed1461072b57600080fd5b80635dd871a31461066b5780636352211e1461068b57806370a08231146106ab57600080fd5b8063429a1bb011610285578063429a1bb0146105f457806349668b4a146106095780635461048114610629578063572849c41461065657600080fd5b80633549345e1461059f5780633943380c146105bf57806342842e0e146105d457600080fd5b80631e14d44b1161031857806327a9574e116102f257806327a9574e146104fe57806329e7ef2d1461051e5780632a55205a146105335780632e6cebe51461057f57600080fd5b80631e14d44b1461049e57806321b8092e146104be57806323b872dd146104de57600080fd5b806304f928c21161035457806304f928c2146103e857806306fdde0314610415578063081812fc14610437578063095ea7b31461047c57600080fd5b80620e7fa81461037a57806301f56997146103a357806301ffc9a7146103b8575b600080fd5b34801561038657600080fd5b5061039060155481565b6040519081526020015b60405180910390f35b3480156103af57600080fd5b50610390610aa6565b3480156103c457600080fd5b506103d86103d3366004613f0f565b610ac1565b604051901515815260200161039a565b3480156103f457600080fd5b50610390610403366004613f2c565b60166020526000908152604090205481565b34801561042157600080fd5b5061042a610b1d565b60405161039a9190613fbb565b34801561044357600080fd5b50610457610452366004613f2c565b610baf565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161039a565b34801561048857600080fd5b5061049c610497366004613ff0565b610c74565b005b3480156104aa57600080fd5b5061049c6104b9366004613f2c565b610dcd565b3480156104ca57600080fd5b5061049c6104d936600461401c565b610ea4565b3480156104ea57600080fd5b5061049c6104f9366004614039565b61100e565b34801561050a57600080fd5b5061049c6105193660046140bf565b611095565b34801561052a57600080fd5b5061042a6111b8565b34801561053f57600080fd5b5061055361054e36600461412b565b611246565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520161039a565b34801561058b57600080fd5b5061049c61059a366004613f2c565b6112dc565b3480156105ab57600080fd5b5061049c6105ba366004613f2c565b6113a8565b3480156105cb57600080fd5b5061042a611414565b3480156105e057600080fd5b5061049c6105ef366004614039565b611421565b34801561060057600080fd5b5061039061143c565b34801561061557600080fd5b5061049c610624366004614162565b611510565b34801561063557600080fd5b5061039061064436600461401c565b60106020526000908152604090205481565b34801561066257600080fd5b50610390611609565b34801561067757600080fd5b506103d8610686366004613f2c565b611624565b34801561069757600080fd5b506104576106a6366004613f2c565b6116a9565b3480156106b757600080fd5b506103906106c636600461401c565b611741565b3480156106d757600080fd5b5061049c6117f5565b3480156106ec57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610457565b34801561071757600080fd5b5061049c610726366004613f2c565b611868565b34801561073757600080fd5b5061049c610746366004613f2c565b611985565b34801561075757600080fd5b50610390611a51565b34801561076c57600080fd5b5061042a611a61565b34801561078157600080fd5b5061049c610790366004613f2c565b611a70565b3480156107a157600080fd5b5061039060135481565b3480156107b757600080fd5b50610390611b3c565b3480156107cc57600080fd5b5061049c6107db36600461417d565b611b58565b3480156107ec57600080fd5b5061049c6107fb3660046141ef565b611c37565b34801561080c57600080fd5b5061049c61081b3660046140bf565b611c46565b34801561082c57600080fd5b5061049c61083b36600461417d565b611e31565b34801561084c57600080fd5b5061049c61085b366004614307565b611f04565b34801561086c57600080fd5b50600f546103d890610100900460ff1681565b34801561088b57600080fd5b506103d861089a366004614373565b611f92565b3480156108ab57600080fd5b5061042a6108ba366004613f2c565b611fc9565b3480156108cb57600080fd5b5061049c6108da3660046143a8565b612099565b3480156108eb57600080fd5b506014546104579073ffffffffffffffffffffffffffffffffffffffff1681565b34801561091857600080fd5b5061049c61092736600461401c565b612173565b34801561093857600080fd5b5061042a612278565b34801561094d57600080fd5b506103d8612285565b61049c6109643660046143f1565b6122a8565b61049c610977366004613f2c565b61251f565b34801561098857600080fd5b50600f546103d89060ff1681565b3480156109a257600080fd5b5061049c6109b136600461401c565b612701565b3480156109c257600080fd5b50610390600d5481565b3480156109d857600080fd5b506012546104579073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a0557600080fd5b506103d8610a14366004614438565b61280a565b348015610a2557600080fd5b506011546104579073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a5257600080fd5b5061049c610a6136600461401c565b61292a565b348015610a7257600080fd5b506103d8610a81366004613ff0565b612a26565b348015610a9257600080fd5b5061049c610aa1366004614162565b612b92565b600f5460009060ff1615610abb5750600c5490565b50600090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a000000000000000000000000000000000000000000000000000000001480610b175750610b1782612c87565b92915050565b606060018054610b2c90614471565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5890614471565b8015610ba55780601f10610b7a57610100808354040283529160200191610ba5565b820191906000526020600020905b815481529060010190602001808311610b8857829003601f168201915b5050505050905090565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16610c4b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610c7f826116a9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d235760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610c42565b3373ffffffffffffffffffffffffffffffffffffffff82161480610d4c5750610d4c813361280a565b610dbe5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c42565b610dc88383612d6a565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600b8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526011908201527f6d61784d696e7450657241646472657373000000000000000000000000000000604082015260600190565b60405180910390a150565b60115473ffffffffffffffffffffffffffffffffffffffff16610f095760405162461bcd60e51b815260206004820152600e60248201527f6e6f5f7769746864726177616c730000000000000000000000000000000000006044820152606401610c42565b60115473ffffffffffffffffffffffffffffffffffffffff163314610f705760405162461bcd60e51b815260206004820152600b60248201527f6e6f745f616c6c6f7765640000000000000000000000000000000000000000006044820152606401610c42565b601180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161781556040805160208082528101929092527f7769746864726177616c41646472657373000000000000000000000000000000908201527f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290606001610e99565b6110183382612e0a565b61108a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c42565b610dc8838383612f33565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110fc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b82811461114b5760405162461bcd60e51b815260206004820152600f60248201527f616d6f756e745f6d69736d6174636800000000000000000000000000000000006044820152606401610c42565b60005b838110156111b157828282818110611168576111686144c5565b9050602002013560166000878785818110611185576111856144c5565b9050602002013581526020019081526020016000208190555080806111a990614523565b91505061114e565b5050505050565b600a80546111c590614471565b80601f01602080910402602001604051908101604052809291908181526020018280546111f190614471565b801561123e5780601f106112135761010080835404028352916020019161123e565b820191906000526020600020905b81548152906001019060200180831161122157829003601f168201915b505050505081565b600082815260036020526040812054819073ffffffffffffffffffffffffffffffffffffffff166112b95760405162461bcd60e51b815260206004820152600860248201527f6e6f5f746f6b656e0000000000000000000000000000000000000000000000006044820152606401610c42565b306112d06112c985601354613166565b6064613172565b915091505b9250929050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600c8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526015908201527f6d61784d696e745065725472616e73616374696f6e0000000000000000000000604082015260600190565b60005473ffffffffffffffffffffffffffffffffffffffff16331461140f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b601555565b600980546111c590614471565b610dc883838360405180602001604052806000815250611f04565b60115460009073ffffffffffffffffffffffffffffffffffffffff166114a45760405162461bcd60e51b815260206004820152600e60248201527f6e6f5f7769746864726177616c730000000000000000000000000000000000006044820152606401610c42565b60115473ffffffffffffffffffffffffffffffffffffffff16331461150b5760405162461bcd60e51b815260206004820152600b60248201527f6e6f745f616c6c6f7765640000000000000000000000000000000000000000006044820152606401610c42565b504790565b60005473ffffffffffffffffffffffffffffffffffffffff1633146115775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600f8054821515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526008908201527f6973436c6f736564000000000000000000000000000000000000000000000000604082015260600190565b600f5460009060ff161561161d5750600090565b50600b5490565b600d546000901561165357600d548261163b611a51565b611645919061455c565b111561165357506000919050565b600c541561166d57600c5482111561166d57506000919050565b600b54156116a157600b543360009081526010602052604090205461169390849061455c565b11156116a157506000919050565b506001919050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610b175760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610c42565b600073ffffffffffffffffffffffffffffffffffffffff82166117cc5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610c42565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff16331461185c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b611866600061317e565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600d5481106119205760405162461bcd60e51b815260206004820152600d60248201527f6f6e6c795f6465637265617365000000000000000000000000000000000000006044820152606401610c42565b600d8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526009908201527f6d6178546f6b656e730000000000000000000000000000000000000000000000604082015260600190565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600e8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526005908201527f7072696365000000000000000000000000000000000000000000000000000000604082015260600190565b6000611a5c60075490565b905090565b606060028054610b2c90614471565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ad75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b60138190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e99906020808252600e908201527f726f79616c747950657263656e74000000000000000000000000000000000000604082015260600190565b600f5460009060ff1615611b515750600e5490565b5060155490565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bbf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b611bcb60088383613db6565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b442604051611c2b9060208082526007908201527f6261736555524900000000000000000000000000000000000000000000000000604082015260600190565b60405180910390a15050565b611c423383836131f3565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b828114611cfc5760405162461bcd60e51b815260206004820152600f60248201527f616d6f756e745f6d69736d6174636800000000000000000000000000000000006044820152606401610c42565b6000805b82811015611d4057838382818110611d1a57611d1a6144c5565b9050602002013582611d2c919061455c565b915080611d3881614523565b915050611d00565b50600d5481611d4d611a51565b611d57919061455c565b1115611da55760405162461bcd60e51b815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610c42565b506000805b84811015611e295760005b848483818110611dc757611dc76144c5565b90506020020135811015611e1657611e04878784818110611dea57611dea6144c5565b9050602002016020810190611dff919061401c565b613307565b80611e0e81614523565b915050611db5565b5080611e2181614523565b915050611daa565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b611ea460098383613db6565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b442604051611c2b9060208082526003908201527f6b65790000000000000000000000000000000000000000000000000000000000604082015260600190565b611f0e3383612e0a565b611f805760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c42565b611f8c84848484613327565b50505050565b600f54600090610100900460ff1615611fad57506000919050565b600f5460ff1615611fc057506001919050565b610b17826133b0565b60008181526003602052604090205460609073ffffffffffffffffffffffffffffffffffffffff1661203d5760405162461bcd60e51b815260206004820152600860248201527f6e6f5f746f6b656e0000000000000000000000000000000000000000000000006044820152606401610c42565b60006008805461204c90614471565b9050116120685760405180602001604052806000815250610b17565b60086120738361349b565b604051602001612084929190614645565b60405160208183030381529060405292915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b805161211390600a906020840190613e58565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b442604051610e999060208082526005908201527f67726f7570000000000000000000000000000000000000000000000000000000604082015260600190565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121da5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b601480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161781556040805160208082528101929092527f70726f7879526567697374727941646472657373000000000000000000000000908201527f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290606001610e99565b600880546111c590614471565b600f54600090610100900460ff161561229e5750600090565b50600f5460ff1690565b600b54336000908152601060205260409020546122c690849061455c565b11156123145760405162461bcd60e51b815260206004820152600a60248201527f6d61785f6d696e746564000000000000000000000000000000000000000000006044820152606401610c42565b600d5482612320611a51565b61232a919061455c565b11156123785760405162461bcd60e51b815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610c42565b600f5460ff16156123cb5760405162461bcd60e51b815260206004820152600960248201527f69735f7075626c696300000000000000000000000000000000000000000000006044820152606401610c42565b600f54610100900460ff16156124235760405162461bcd60e51b815260206004820152600960248201527f69735f636c6f73656400000000000000000000000000000000000000000000006044820152606401610c42565b61242c816133b0565b6124785760405162461bcd60e51b815260206004820152601160248201527f696e76616c69645f7369676e61747572650000000000000000000000000000006044820152606401610c42565b3482601554612487919061466a565b146124d45760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563745f66756e647300000000000000000000000000000000006044820152606401610c42565b33600090815260106020526040812080548492906124f390849061455c565b90915550600090505b82811015610dc85761250d33613307565b8061251781614523565b9150506124fc565b600c548111156125715760405162461bcd60e51b815260206004820152600c60248201527f6d61785f6d696e7461626c6500000000000000000000000000000000000000006044820152606401610c42565b600d548161257d611a51565b612587919061455c565b11156125d55760405162461bcd60e51b815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610c42565b600f54610100900460ff161561262d5760405162461bcd60e51b815260206004820152600960248201527f69735f636c6f73656400000000000000000000000000000000000000000000006044820152606401610c42565b600f5460ff1661267f5760405162461bcd60e51b815260206004820152600a60248201527f6e6f745f7075626c6963000000000000000000000000000000000000000000006044820152606401610c42565b3481600e5461268e919061466a565b146126db5760405162461bcd60e51b815260206004820152600f60248201527f696e636f72726563745f66756e647300000000000000000000000000000000006044820152606401610c42565b60005b81811015611c42576126ef33613307565b806126f981614523565b9150506126de565b60005473ffffffffffffffffffffffffffffffffffffffff1633146127685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b6012805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e99906020808252600c908201527f7665726966795369676e65720000000000000000000000000000000000000000604082015260600190565b60145460009073ffffffffffffffffffffffffffffffffffffffff16156128ec576014546040517fc455279100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015291821691841690829063c455279190602401602060405180830381865afa1580156128a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c491906146a7565b73ffffffffffffffffffffffffffffffffffffffff1614156128ea576001915050610b17565b505b73ffffffffffffffffffffffffffffffffffffffff80841660009081526006602090815260408083209386168352929052205460ff165b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146129915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b73ffffffffffffffffffffffffffffffffffffffff8116612a1a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c42565b612a238161317e565b50565b60115460009073ffffffffffffffffffffffffffffffffffffffff16612a8e5760405162461bcd60e51b815260206004820152600e60248201527f6e6f5f7769746864726177616c730000000000000000000000000000000000006044820152606401610c42565b60115473ffffffffffffffffffffffffffffffffffffffff163314612af55760405162461bcd60e51b815260206004820152600b60248201527f6e6f745f616c6c6f7765640000000000000000000000000000000000000000006044820152606401610c42565b47821115612b455760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e745f66756e647300000000000000000000000000006044820152606401610c42565b60405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084906000818181858888f19350505050158015612b88573d6000803e3d6000fd5b5060019392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bf95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c42565b600f80548215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e999060208082526008908201527f69735075626c6963000000000000000000000000000000000000000000000000604082015260600190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480612d1a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b1757507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610b17565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190612dc4826116a9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16612ea15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c42565b6000612eac836116a9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f1b57508373ffffffffffffffffffffffffffffffffffffffff16612f0384610baf565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f2b5750612f2b818561280a565b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16612f53826116a9565b73ffffffffffffffffffffffffffffffffffffffff1614612fdc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610c42565b73ffffffffffffffffffffffffffffffffffffffff82166130645760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c42565b61306f600082612d6a565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602052604081208054600192906130a59084906146c4565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526004602052604081208054600192906130e090849061455c565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000612923828461466a565b6000612923828461470a565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561326f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c42565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6133198161331460075490565b6135cd565b612a23600780546001019055565b613332848484612f33565b61333e848484846135e7565b611f8c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c42565b6000806009600a336040516020016133ca9392919061471e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012060125490915073ffffffffffffffffffffffffffffffffffffffff1661347d84613477846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b906137bd565b73ffffffffffffffffffffffffffffffffffffffff16149392505050565b6060816134db57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561350557806134ef81614523565b91506134fe9050600a8361470a565b91506134df565b60008167ffffffffffffffff81111561352057613520614224565b6040519080825280601f01601f19166020018201604052801561354a576020820181803683370190505b5090505b8415612f2b5761355f6001836146c4565b915061356c600a86614768565b61357790603061455c565b60f81b81838151811061358c5761358c6144c5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135c6600a8661470a565b945061354e565b611c428282604051806020016040528060008152506137e1565b600073ffffffffffffffffffffffffffffffffffffffff84163b156137b2576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061365e90339089908890889060040161477c565b6020604051808303816000875af19250505080156136b7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526136b4918101906147c5565b60015b613767573d8080156136e5576040519150601f19603f3d011682016040523d82523d6000602084013e6136ea565b606091505b50805161375f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c42565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612f2b565b506001949350505050565b60008060006137cc858561386a565b915091506137d9816138d7565b509392505050565b6137eb8383613ac8565b6137f860008484846135e7565b610dc85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c42565b6000808251604114156138a15760208301516040840151606085015160001a61389587828585613c56565b945094505050506112d5565b8251604014156138cb57602083015160408401516138c0868383613d6e565b9350935050506112d5565b506000905060026112d5565b60008160048111156138eb576138eb6147e2565b14156138f45750565b6001816004811115613908576139086147e2565b14156139565760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610c42565b600281600481111561396a5761396a6147e2565b14156139b85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610c42565b60038160048111156139cc576139cc6147e2565b1415613a405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610c42565b6004816004811115613a5457613a546147e2565b1415612a235760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610c42565b73ffffffffffffffffffffffffffffffffffffffff8216613b2b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c42565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615613b9d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c42565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600460205260408120805460019290613bd390849061455c565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613c8d5750600090506003613d65565b8460ff16601b14158015613ca557508460ff16601c14155b15613cb65750600090506004613d65565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613d0a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116613d5e57600060019250925050613d65565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b01613da887828885613c56565b935093505050935093915050565b828054613dc290614471565b90600052602060002090601f016020900481019282613de45760008555613e48565b82601f10613e1b578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555613e48565b82800160010185558215613e48579182015b82811115613e48578235825591602001919060010190613e2d565b50613e54929150613ecc565b5090565b828054613e6490614471565b90600052602060002090601f016020900481019282613e865760008555613e48565b82601f10613e9f57805160ff1916838001178555613e48565b82800160010185558215613e48579182015b82811115613e48578251825591602001919060010190613eb1565b5b80821115613e545760008155600101613ecd565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612a2357600080fd5b600060208284031215613f2157600080fd5b813561292381613ee1565b600060208284031215613f3e57600080fd5b5035919050565b60005b83811015613f60578181015183820152602001613f48565b83811115611f8c5750506000910152565b60008151808452613f89816020860160208601613f45565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129236020830184613f71565b73ffffffffffffffffffffffffffffffffffffffff81168114612a2357600080fd5b6000806040838503121561400357600080fd5b823561400e81613fce565b946020939093013593505050565b60006020828403121561402e57600080fd5b813561292381613fce565b60008060006060848603121561404e57600080fd5b833561405981613fce565b9250602084013561406981613fce565b929592945050506040919091013590565b60008083601f84011261408c57600080fd5b50813567ffffffffffffffff8111156140a457600080fd5b6020830191508360208260051b85010111156112d557600080fd5b600080600080604085870312156140d557600080fd5b843567ffffffffffffffff808211156140ed57600080fd5b6140f98883890161407a565b9096509450602087013591508082111561411257600080fd5b5061411f8782880161407a565b95989497509550505050565b6000806040838503121561413e57600080fd5b50508035926020909101359150565b8035801515811461415d57600080fd5b919050565b60006020828403121561417457600080fd5b6129238261414d565b6000806020838503121561419057600080fd5b823567ffffffffffffffff808211156141a857600080fd5b818501915085601f8301126141bc57600080fd5b8135818111156141cb57600080fd5b8660208285010111156141dd57600080fd5b60209290920196919550909350505050565b6000806040838503121561420257600080fd5b823561420d81613fce565b915061421b6020840161414d565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561426e5761426e614224565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156142b4576142b4614224565b816040528093508581528686860111156142cd57600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126142f857600080fd5b61292383833560208501614253565b6000806000806080858703121561431d57600080fd5b843561432881613fce565b9350602085013561433881613fce565b925060408501359150606085013567ffffffffffffffff81111561435b57600080fd5b614367878288016142e7565b91505092959194509250565b60006020828403121561438557600080fd5b813567ffffffffffffffff81111561439c57600080fd5b612f2b848285016142e7565b6000602082840312156143ba57600080fd5b813567ffffffffffffffff8111156143d157600080fd5b8201601f810184136143e257600080fd5b612f2b84823560208401614253565b6000806040838503121561440457600080fd5b82359150602083013567ffffffffffffffff81111561442257600080fd5b61442e858286016142e7565b9150509250929050565b6000806040838503121561444b57600080fd5b823561445681613fce565b9150602083013561446681613fce565b809150509250929050565b600181811c9082168061448557607f821691505b602082108114156144bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614555576145556144f4565b5060010190565b6000821982111561456f5761456f6144f4565b500190565b8054600090600181811c908083168061458e57607f831692505b60208084108214156145c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b8180156145dd576001811461460c57614639565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650614639565b60008881526020902060005b868110156146315781548b820152908501908301614618565b505084890196505b50505050505092915050565b60006146518285614574565b8351614661818360208801613f45565b01949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146a2576146a26144f4565b500290565b6000602082840312156146b957600080fd5b815161292381613fce565b6000828210156146d6576146d66144f4565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614719576147196146db565b500490565b600061473361472d8387614574565b85614574565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168352505060140192915050565b600082614777576147776146db565b500690565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526147bb6080830184613f71565b9695505050505050565b6000602082840312156147d757600080fd5b815161292381613ee1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220d7dee0c97a09282bb46671c4128444c97c2900424233e210b350daf5439cb9b164736f6c634300080a0033
Deployed Bytecode Sourcemap
281:2822:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;321:44;;;;;;;;;;;;;;;;;;;160:25:16;;;148:2;133:18;321:44:12;;;;;;;;794:180;;;;;;;;;;;;;:::i;2170:217:6:-;;;;;;;;;;-1:-1:-1;2170:217:6;;;;;:::i;:::-;;:::i;:::-;;;793:14:16;;786:22;768:41;;756:2;741:18;2170:217:6;628:187:16;371:50:12;;;;;;;;;;-1:-1:-1;371:50:12;;;;;:::i;:::-;;;;;;;;;;;;;;2408:98:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3919:217::-;;;;;;;;;;-1:-1:-1;3919:217:5;;;;;:::i;:::-;;:::i;:::-;;;1991:42:16;1979:55;;;1961:74;;1949:2;1934:18;3919:217:5;1815:226:16;3457:401:5;;;;;;;;;;-1:-1:-1;3457:401:5;;;;;:::i;:::-;;:::i;:::-;;7805:175:6;;;;;;;;;;-1:-1:-1;7805:175:6;;;;;:::i;:::-;;:::i;10534:176::-;;;;;;;;;;-1:-1:-1;10534:176:6;;;;;:::i;:::-;;:::i;4646:330:5:-;;;;;;;;;;-1:-1:-1;4646:330:5;;;;;:::i;:::-;;:::i;2779:322:12:-;;;;;;;;;;-1:-1:-1;2779:322:12;;;;;:::i;:::-;;:::i;730:28:6:-;;;;;;;;;;;;;:::i;9683:289::-;;;;;;;;;;-1:-1:-1;9683:289:6;;;;;:::i;:::-;;:::i;:::-;;;;4845:42:16;4833:55;;;4815:74;;4920:2;4905:18;;4898:34;;;;4788:18;9683:289:6;4641:297:16;8036:187:6;;;;;;;;;;-1:-1:-1;8036:187:6;;;;;:::i;:::-;;:::i;2675:98:12:-;;;;;;;;;;-1:-1:-1;2675:98:12;;;;;:::i;:::-;;:::i;698:26:6:-;;;;;;;;;;;;;:::i;5042:179:5:-;;;;;;;;;;-1:-1:-1;5042:179:5;;;;;:::i;:::-;;:::i;10055:122:6:-;;;;;;;;;;;;;:::i;7429:139::-;;;;;;;;;;-1:-1:-1;7429:139:6;;;;;:::i;:::-;;:::i;976:47::-;;;;;;;;;;-1:-1:-1;976:47:6;;;;;:::i;:::-;;;;;;;;;;;;;;1059:172:12;;;;;;;;;;;;;:::i;5241:573:6:-;;;;;;;;;;-1:-1:-1;5241:573:6;;;;;:::i;:::-;;:::i;2111:235:5:-;;;;;;;;;;-1:-1:-1;2111:235:5;;;;;:::i;:::-;;:::i;1849:205::-;;;;;;;;;;-1:-1:-1;1849:205:5;;;;;:::i;:::-;;:::i;1661:101:13:-;;;;;;;;;;;;;:::i;1029:85::-;;;;;;;;;;-1:-1:-1;1075:7:13;1101:6;;;1029:85;;6988:205:6;;;;;;;;;;-1:-1:-1;6988:205:6;;;;;:::i;:::-;;:::i;7612:137::-;;;;;;;;;;-1:-1:-1;7612:137:6;;;;;:::i;:::-;;:::i;5050:99::-;;;;;;;;;;;;;:::i;2570:102:5:-;;;;;;;;;;;;;:::i;9489:160:6:-;;;;;;;;;;-1:-1:-1;9489:160:6;;;;;:::i;:::-;;:::i;1100:29::-;;;;;;;;;;;;;;;;1300:159:12;;;;;;;;;;;;;:::i;8671:164:6:-;;;;;;;;;;-1:-1:-1;8671:164:6;;;;;:::i;:::-;;:::i;4203:153:5:-;;;;;;;;;;-1:-1:-1;4203:153:5;;;;;:::i;:::-;;:::i;2929:570:6:-;;;;;;;;;;-1:-1:-1;2929:570:6;;;;;:::i;:::-;;:::i;8290:129::-;;;;;;;;;;-1:-1:-1;8290:129:6;;;;;:::i;:::-;;:::i;5287:320:5:-;;;;;;;;;;-1:-1:-1;5287:320:5;;;;;:::i;:::-;;:::i;950:20:6:-;;;;;;;;;;-1:-1:-1;950:20:6;;;;;;;;;;;6664:250;;;;;;;;;;-1:-1:-1;6664:250:6;;;;;:::i;:::-;;:::i;2442:259::-;;;;;;;;;;-1:-1:-1;2442:259:6;;;;;:::i;:::-;;:::i;8490:137::-;;;;;;;;;;-1:-1:-1;8490:137:6;;;;;:::i;:::-;;:::i;1135:35::-;;;;;;;;;;-1:-1:-1;1135:35:6;;;;;;;;10776:342;;;;;;;;;;-1:-1:-1;10776:342:6;;;;;:::i;:::-;;:::i;666:26::-;;;;;;;;;;;;;:::i;6461:148::-;;;;;;;;;;;;;:::i;2050:619:12:-;;;;;;:::i;:::-;;:::i;1520:456::-;;;;;;:::i;:::-;;:::i;924:20:6:-;;;;;;;;;;-1:-1:-1;924:20:6;;;;;;;;8899:166;;;;;;;;;;-1:-1:-1;8899:166:6;;;;;:::i;:::-;;:::i;860:24::-;;;;;;;;;;;;;;;;1067:27;;;;;;;;;;-1:-1:-1;1067:27:6;;;;;;;;11208:426;;;;;;;;;;-1:-1:-1;11208:426:6;;;;;:::i;:::-;;:::i;1029:32::-;;;;;;;;;;-1:-1:-1;1029:32:6;;;;;;;;1911:198:13;;;;;;;;;;-1:-1:-1;1911:198:13;;;;;:::i;:::-;;:::i;10238:235:6:-;;;;;;;;;;-1:-1:-1;10238:235:6;;;;;:::i;:::-;;:::i;7244:139::-;;;;;;;;;;-1:-1:-1;7244:139:6;;;;;:::i;:::-;;:::i;794:180:12:-;880:8;;857:7;;880:8;;876:73;;;-1:-1:-1;911:27:12;;;794:180::o;876:73::-;-1:-1:-1;966:1:12;;794:180::o;2170:217:6:-;2274:4;2297:42;;;2313:26;2297:42;;:83;;;2343:37;2367:12;2343:23;:37::i;:::-;2290:90;2170:217;-1:-1:-1;;2170:217:6:o;2408:98:5:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;7167:16;;;:7;:16;;;;;;:30;:16;4014:73;;;;-1:-1:-1;;;4014:73:5;;11305:2:16;4014:73:5;;;11287:21:16;11344:2;11324:18;;;11317:30;11383:34;11363:18;;;11356:62;11454:14;11434:18;;;11427:42;11486:19;;4014:73:5;;;;;;;;;-1:-1:-1;4105:24:5;;;;:15;:24;;;;;;;;;3919:217::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;3594:11;;:2;:11;;;;3586:57;;;;-1:-1:-1;;;3586:57:5;;11718:2:16;3586:57:5;;;11700:21:16;11757:2;11737:18;;;11730:30;11796:34;11776:18;;;11769:62;11867:3;11847:18;;;11840:31;11888:19;;3586:57:5;11516:397:16;3586:57:5;719:10:1;3675:21:5;;;;;:62;;-1:-1:-1;3700:37:5;3717:5;719:10:1;11208:426:6;:::i;3700:37:5:-;3654:165;;;;-1:-1:-1;;;3654:165:5;;12120:2:16;3654:165:5;;;12102:21:16;12159:2;12139:18;;;12132:30;12198:34;12178:18;;;12171:62;12269:26;12249:18;;;12242:54;12313:19;;3654:165:5;11918:420:16;3654:165:5;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3527:331;3457:401;;:::o;7805:175:6:-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;7889:23:6::1;:33:::0;;;7937:36:::1;::::0;::::1;::::0;::::1;::::0;12906:2:16;12888:21;;;12945:2;12925:18;;;12918:30;12984:19;12979:2;12964:18;;12957:47;13036:2;13021:18;;12704:341;7937:36:6::1;;;;;;;;7805:175:::0;:::o;10534:176::-;1263:17;;:31;:17;1255:58;;;;-1:-1:-1;;;1255:58:6;;13252:2:16;1255:58:6;;;13234:21:16;13291:2;13271:18;;;13264:30;13330:16;13310:18;;;13303:44;13364:18;;1255:58:6;13050:338:16;1255:58:6;1331:17;;:33;:17;719:10:1;1331:33:6;1323:57;;;;-1:-1:-1;;;1323:57:6;;13595:2:16;1323:57:6;;;13577:21:16;13634:2;13614:18;;;13607:30;13673:13;13653:18;;;13646:41;13704:18;;1323:57:6;13393:335:16;1323:57:6;10624:17:::1;:28:::0;;;::::1;;::::0;::::1;;::::0;;10667:36:::1;::::0;;13935:2:16;13917:21;;;13954:18;;13947:30;;;;14013:19;13993:18;;;13986:47;10667:36:6::1;::::0;14065:2:16;14050:18;10667:36:6::1;13733:341:16::0;4646:330:5;4835:41;719:10:1;4868:7:5;4835:18;:41::i;:::-;4827:103;;;;-1:-1:-1;;;4827:103:5;;14281:2:16;4827:103:5;;;14263:21:16;14320:2;14300:18;;;14293:30;14359:34;14339:18;;;14332:62;14430:19;14410:18;;;14403:47;14467:19;;4827:103:5;14079:413:16;4827:103:5;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;2779:322:12:-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;2907:39:12;;::::1;2899:67;;;::::0;-1:-1:-1;;;2899:67:12;;14699:2:16;2899:67:12::1;::::0;::::1;14681:21:16::0;14738:2;14718:18;;;14711:30;14777:17;14757:18;;;14750:45;14812:18;;2899:67:12::1;14497:339:16::0;2899:67:12::1;2981:9;2976:119;2996:20:::0;;::::1;2976:119;;;3069:12;;3082:1;3069:15;;;;;;;:::i;:::-;;;;;;;3037;:29;3053:9;;3063:1;3053:12;;;;;;;:::i;:::-;;;;;;;3037:29;;;;;;;;;;;:47;;;;3018:3;;;;;:::i;:::-;;;;2976:119;;;;2779:322:::0;;;;:::o;730:28:6:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9683:289::-;9782:16;7167::5;;;:7;:16;;;;;;9782::6;;7167:30:5;:16;9833:38:6;;;;-1:-1:-1;;;9833:38:6;;15621:2:16;9833:38:6;;;15603:21:16;15660:1;15640:18;;;15633:29;15698:10;15678:18;;;15671:38;15726:18;;9833:38:6;15419:331:16;9833:38:6;9898:4;9905:59;9918:40;9931:10;9943:14;;9918:12;:40::i;:::-;9960:3;9905:12;:59::i;:::-;9882:83;;;;9683:289;;;;;;:::o;8036:187::-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;8124:27:6::1;:37:::0;;;8176:40:::1;::::0;::::1;::::0;::::1;::::0;15957:2:16;15939:21;;;15996:2;15976:18;;;15969:30;16035:23;16030:2;16015:18;;16008:51;16091:2;16076:18;;15755:345;2675:98:12;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;2745:12:12::1;:21:::0;2675:98::o;698:26:6:-;;;;;;;:::i;5042:179:5:-;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;10055:122:6:-;1263:17;;10123:7;;1263:31;:17;1255:58;;;;-1:-1:-1;;;1255:58:6;;13252:2:16;1255:58:6;;;13234:21:16;13291:2;13271:18;;;13264:30;13330:16;13310:18;;;13303:44;13364:18;;1255:58:6;13050:338:16;1255:58:6;1331:17;;:33;:17;719:10:1;1331:33:6;1323:57;;;;-1:-1:-1;;;1323:57:6;;13595:2:16;1323:57:6;;;13577:21:16;13634:2;13614:18;;;13607:30;13673:13;13653:18;;;13646:41;13704:18;;1323:57:6;13393:335:16;1323:57:6;-1:-1:-1;10149:21:6::1;10055:122:::0;:::o;7429:139::-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;7501:8:6::1;:18:::0;;;::::1;;;;::::0;;;::::1;;::::0;;7534:27:::1;::::0;::::1;::::0;::::1;::::0;16307:2:16;16289:21;;;16346:1;16326:18;;;16319:29;16384:10;16379:2;16364:18;;16357:38;16427:2;16412:18;;16105:331;1059:172:12;1141:8;;1118:7;;1141:8;;1137:47;;;-1:-1:-1;1172:1:12;;1059:172::o;1137:47::-;-1:-1:-1;1201:23:12;;;1059:172::o;5241:573:6:-;5324:9;;5304:4;;5324:13;5320:127;;5381:9;;5371:7;5357:11;:9;:11::i;:::-;:21;;;;:::i;:::-;:33;5353:84;;;-1:-1:-1;5417:5:6;;5241:573;-1:-1:-1;5241:573:6:o;5353:84::-;5461:27;;:31;5457:149;;5522:27;;5512:7;:37;5508:88;;;-1:-1:-1;5576:5:6;;5241:573;-1:-1:-1;5241:573:6:o;5508:88::-;5620:23;;:27;5616:170;;5706:23;;719:10:1;5667:26:6;;;;:12;:26;;;;;;:36;;5696:7;;5667:36;:::i;:::-;:62;5663:113;;;-1:-1:-1;5756:5:6;;5241:573;-1:-1:-1;5241:573:6:o;5663:113::-;-1:-1:-1;5803:4:6;;5241:573;-1:-1:-1;5241:573:6:o;2111:235:5:-;2183:7;2218:16;;;:7;:16;;;;;;;;2252:19;2244:73;;;;-1:-1:-1;;;2244:73:5;;16776:2:16;2244:73:5;;;16758:21:16;16815:2;16795:18;;;16788:30;16854:34;16834:18;;;16827:62;16925:11;16905:18;;;16898:39;16954:19;;2244:73:5;16574:405:16;1849:205:5;1921:7;1948:19;;;1940:74;;;;-1:-1:-1;;;1940:74:5;;17186:2:16;1940:74:5;;;17168:21:16;17225:2;17205:18;;;17198:30;17264:34;17244:18;;;17237:62;17335:12;17315:18;;;17308:40;17365:19;;1940:74:5;16984:406:16;1940:74:5;-1:-1:-1;2031:16:5;;;;;;:9;:16;;;;;;;1849:205::o;1661:101:13:-;1075:7;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;6988:205:6:-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;7087:9:6::1;;7077:7;:19;7069:45;;;::::0;-1:-1:-1;;;7069:45:6;;17597:2:16;7069:45:6::1;::::0;::::1;17579:21:16::0;17636:2;17616:18;;;17609:30;17675:15;17655:18;;;17648:43;17708:18;;7069:45:6::1;17395:337:16::0;7069:45:6::1;7124:9;:19:::0;;;7158:28:::1;::::0;::::1;::::0;::::1;::::0;17939:2:16;17921:21;;;17978:1;17958:18;;;17951:29;18016:11;18011:2;17996:18;;17989:39;18060:2;18045:18;;17737:332;7612:137:6;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;7683:11:6::1;:20:::0;;;7718:24:::1;::::0;::::1;::::0;::::1;::::0;18276:2:16;18258:21;;;18315:1;18295:18;;;18288:29;18353:7;18348:2;18333:18;;18326:35;18393:2;18378:18;;18074:328;5050:99:6;5092:7;5118:24;:14;918::2;;827:112;5118:24:6;5111:31;;5050:99;:::o;2570:102:5:-;2626:13;2658:7;2651:14;;;;;:::i;9489:160:6:-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;9570:14:6::1;:24:::0;;;9609:33:::1;::::0;::::1;::::0;::::1;::::0;18609:2:16;18591:21;;;18648:2;18628:18;;;18621:30;18687:16;18682:2;18667:18;;18660:44;18736:2;18721:18;;18407:338;1300:159:12;1370:8;;1347:7;;1370:8;;1366:57;;;-1:-1:-1;1401:11:12;;;1300:159::o;1366:57::-;-1:-1:-1;1440:12:12;;;1300:159::o;8671:164:6:-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;8759:28:6::1;:12;8774:13:::0;;8759:28:::1;:::i;:::-;;8802:26;;;;;18952:2:16::0;18934:21;;;18991:1;18971:18;;;18964:29;19029:9;19024:2;19009:18;;19002:37;19071:2;19056:18;;18750:330;8802:26:6::1;;;;;;;;8671:164:::0;;:::o;4203:153:5:-;4297:52;719:10:1;4330:8:5;4340;4297:18;:52::i;:::-;4203:153;;:::o;2929:570:6:-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;3040:36:6;;::::1;3032:64;;;::::0;-1:-1:-1;;;3032:64:6;;14699:2:16;3032:64:6::1;::::0;::::1;14681:21:16::0;14738:2;14718:18;;;14711:30;14777:17;14757:18;;;14750:45;14812:18;;3032:64:6::1;14497:339:16::0;3032:64:6::1;3107:13;::::0;3130:91:::1;3150:19:::0;;::::1;3130:91;;;3199:8;;3208:1;3199:11;;;;;;;:::i;:::-;;;;;;;3190:20;;;;;:::i;:::-;::::0;-1:-1:-1;3171:3:6;::::1;::::0;::::1;:::i;:::-;;;;3130:91;;;;3262:9;;3253:5;3239:11;:9;:11::i;:::-;:19;;;;:::i;:::-;:32;;3231:62;;;::::0;-1:-1:-1;;;3231:62:6;;19287:2:16;3231:62:6::1;::::0;::::1;19269:21:16::0;19326:2;19306:18;;;19299:30;19365:19;19345:18;;;19338:47;19402:18;;3231:62:6::1;19085:341:16::0;3231:62:6::1;-1:-1:-1::0;3304:12:6::1;::::0;3327:166:::1;3347:21:::0;;::::1;3327:166;;;3394:9;3389:94;3413:8;;3422:1;3413:11;;;;;;;:::i;:::-;;;;;;;3409:1;:15;3389:94;;;3449:19;3454:10;;3465:1;3454:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;3449:4;:19::i;:::-;3426:3:::0;::::1;::::0;::::1;:::i;:::-;;;;3389:94;;;-1:-1:-1::0;3370:3:6;::::1;::::0;::::1;:::i;:::-;;;;3327:166;;;;3022:477;2929:570:::0;;;;:::o;8290:129::-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;8365:10:6::1;:3;8371:4:::0;;8365:10:::1;:::i;:::-;;8390:22;;;;;19633:2:16::0;19615:21;;;19672:1;19652:18;;;19645:29;19710:5;19705:2;19690:18;;19683:33;19748:2;19733:18;;19431:326;5287:320:5;5456:41;719:10:1;5489:7:5;5456:18;:41::i;:::-;5448:103;;;;-1:-1:-1;;;5448:103:5;;14281:2:16;5448:103:5;;;14263:21:16;14320:2;14300:18;;;14293:30;14359:34;14339:18;;;14332:62;14430:19;14410:18;;;14403:47;14467:19;;5448:103:5;14079:413:16;5448:103:5;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;:::-;5287:320;;;;:::o;6664:250:6:-;6756:8;;6736:4;;6756:8;;;;;6752:51;;;-1:-1:-1;6787:5:6;;6664:250;-1:-1:-1;6664:250:6:o;6752:51::-;6817:8;;;;6813:50;;;-1:-1:-1;6848:4:6;;6664:250;-1:-1:-1;6664:250:6:o;6813:50::-;6880:27;6896:10;6880:15;:27::i;2442:259::-;7144:4:5;7167:16;;;:7;:16;;;;;;2516:13:6;;7167:30:5;:16;2541:38:6;;;;-1:-1:-1;;;2541:38:6;;15621:2:16;2541:38:6;;;15603:21:16;15660:1;15640:18;;;15633:29;15698:10;15678:18;;;15671:38;15726:18;;2541:38:6;15419:331:16;2541:38:6;2626:1;2603:12;2597:26;;;;;:::i;:::-;;;:30;:97;;;;;;;;;;;;;;;;;2654:12;2668:19;:8;:17;:19::i;:::-;2637:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2590:104;2442:259;-1:-1:-1;;2442:259:6:o;8490:137::-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;8567:14:6;;::::1;::::0;:5:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;;8596:24;;;;;21564:2:16::0;21546:21;;;21603:1;21583:18;;;21576:29;21641:7;21636:2;21621:18;;21614:35;21681:2;21666:18;;21362:328;10776:342:6;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;11028:20:6::1;:29:::0;;;::::1;;::::0;::::1;;::::0;;11072:39:::1;::::0;;21897:2:16;21879:21;;;21916:18;;21909:30;;;;21975:22;21955:18;;;21948:50;11072:39:6::1;::::0;22030:2:16;22015:18;11072:39:6::1;21695:344:16::0;666:26:6;;;;;;;:::i;6461:148::-;6530:8;;6510:4;;6530:8;;;;;6526:51;;;-1:-1:-1;6561:5:6;;6461:148::o;6526:51::-;-1:-1:-1;6594:8:6;;;;;6461:148::o;2050:619:12:-;2190:23;;719:10:1;2150:26:12;;;;:12;:26;;;;;;:36;;2179:7;;2150:36;:::i;:::-;:63;;2142:86;;;;-1:-1:-1;;;2142:86:12;;22246:2:16;2142:86:12;;;22228:21:16;22285:2;22265:18;;;22258:30;22324:12;22304:18;;;22297:40;22354:18;;2142:86:12;22044:334:16;2142:86:12;2271:9;;2260:7;2246:11;:9;:11::i;:::-;:21;;;;:::i;:::-;:34;;2238:64;;;;-1:-1:-1;;;2238:64:12;;19287:2:16;2238:64:12;;;19269:21:16;19326:2;19306:18;;;19299:30;19365:19;19345:18;;;19338:47;19402:18;;2238:64:12;19085:341:16;2238:64:12;2321:8;;;;2320:9;2312:31;;;;-1:-1:-1;;;2312:31:12;;22585:2:16;2312:31:12;;;22567:21:16;22624:1;22604:18;;;22597:29;22662:11;22642:18;;;22635:39;22691:18;;2312:31:12;22383:332:16;2312:31:12;2362:8;;;;;;;2361:9;2353:31;;;;-1:-1:-1;;;2353:31:12;;22922:2:16;2353:31:12;;;22904:21:16;22961:1;22941:18;;;22934:29;22999:11;22979:18;;;22972:39;23028:18;;2353:31:12;22720:332:16;2353:31:12;2402:27;2418:10;2402:15;:27::i;:::-;2394:57;;;;-1:-1:-1;;;2394:57:12;;23259:2:16;2394:57:12;;;23241:21:16;23298:2;23278:18;;;23271:30;23337:19;23317:18;;;23310:47;23374:18;;2394:57:12;23057:341:16;2394:57:12;2495:9;2484:7;2469:12;;:22;;;;:::i;:::-;:35;2461:63;;;;-1:-1:-1;;;2461:63:12;;23838:2:16;2461:63:12;;;23820:21:16;23877:2;23857:18;;;23850:30;23916:17;23896:18;;;23889:45;23951:18;;2461:63:12;23636:339:16;2461:63:12;719:10:1;2535:26:12;;;;:12;:26;;;;;:37;;2565:7;;2535:26;:37;;2565:7;;2535:37;:::i;:::-;;;;-1:-1:-1;2587:9:12;;-1:-1:-1;2582:81:12;2606:7;2602:1;:11;2582:81;;;2634:18;719:10:1;3449:4:6::1;:19::i;2634:18:12:-:0;2615:3;;;;:::i;:::-;;;;2582:81;;1520:456;1606:27;;1595:7;:38;;1587:63;;;;-1:-1:-1;;;1587:63:12;;24182:2:16;1587:63:12;;;24164:21:16;24221:2;24201:18;;;24194:30;24260:14;24240:18;;;24233:42;24292:18;;1587:63:12;23980:336:16;1587:63:12;1693:9;;1682:7;1668:11;:9;:11::i;:::-;:21;;;;:::i;:::-;:34;;1660:64;;;;-1:-1:-1;;;1660:64:12;;19287:2:16;1660:64:12;;;19269:21:16;19326:2;19306:18;;;19299:30;19365:19;19345:18;;;19338:47;19402:18;;1660:64:12;19085:341:16;1660:64:12;1743:8;;;;;;;1742:9;1734:31;;;;-1:-1:-1;;;1734:31:12;;22922:2:16;1734:31:12;;;22904:21:16;22961:1;22941:18;;;22934:29;22999:11;22979:18;;;22972:39;23028:18;;1734:31:12;22720:332:16;1734:31:12;1783:8;;;;1775:31;;;;-1:-1:-1;;;1775:31:12;;24523:2:16;1775:31:12;;;24505:21:16;24562:2;24542:18;;;24535:30;24601:12;24581:18;;;24574:40;24631:18;;1775:31:12;24321:334:16;1775:31:12;1849:9;1838:7;1824:11;;:21;;;;:::i;:::-;:34;1816:62;;;;-1:-1:-1;;;1816:62:12;;23838:2:16;1816:62:12;;;23820:21:16;23877:2;23857:18;;;23850:30;23916:17;23896:18;;;23889:45;23951:18;;1816:62:12;23636:339:16;1816:62:12;1894:9;1889:81;1913:7;1909:1;:11;1889:81;;;1941:18;719:10:1;3449:4:6::1;:19::i;1941:18:12:-:0;1922:3;;;;:::i;:::-;;;;1889:81;;8899:166:6;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;8984:12:6::1;:28:::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;9027:31:::1;::::0;::::1;::::0;::::1;::::0;24862:2:16;24844:21;;;24901:2;24881:18;;;24874:30;24940:14;24935:2;24920:18;;24913:42;24987:2;24972:18;;24660:336;11208:426:6;11327:20;;11307:4;;11327:34;:20;:34;11323:246;;11422:20;;11469:30;;;;;11422:20;1979:55:16;;;11469:30:6;;;1961:74:16;11422:20:6;;;;11461:52;;;11422:20;;11469:22;;1934:18:16;;11469:30:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11461:52;;;11457:102;;;11540:4;11533:11;;;;;11457:102;11363:206;11323:246;4542:25:5;;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;11586:41:6;11579:48;11208:426;-1:-1:-1;;;11208:426:6:o;1911:198:13:-;1075:7;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;1999:22:::1;::::0;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:13;;25488:2:16;1991:73:13::1;::::0;::::1;25470:21:16::0;25527:2;25507:18;;;25500:30;25566:34;25546:18;;;25539:62;25637:8;25617:18;;;25610:36;25663:19;;1991:73:13::1;25286:402:16::0;1991:73:13::1;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;10238:235:6:-;1263:17;;10335:4;;1263:31;:17;1255:58;;;;-1:-1:-1;;;1255:58:6;;13252:2:16;1255:58:6;;;13234:21:16;13291:2;13271:18;;;13264:30;13330:16;13310:18;;;13303:44;13364:18;;1255:58:6;13050:338:16;1255:58:6;1331:17;;:33;:17;719:10:1;1331:33:6;1323:57;;;;-1:-1:-1;;;1323:57:6;;13595:2:16;1323:57:6;;;13577:21:16;13634:2;13614:18;;;13607:30;13673:13;13653:18;;;13646:41;13704:18;;1323:57:6;13393:335:16;1323:57:6;10370:21:::1;10359:7;:32;;10351:63;;;::::0;-1:-1:-1;;;10351:63:6;;25895:2:16;10351:63:6::1;::::0;::::1;25877:21:16::0;25934:2;25914:18;;;25907:30;25973:20;25953:18;;;25946:48;26011:18;;10351:63:6::1;25693:342:16::0;10351:63:6::1;10424:21;::::0;:12:::1;::::0;::::1;::::0;:21;::::1;;;::::0;10437:7;;10424:21:::1;::::0;;;10437:7;10424:12;:21;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;10462:4:6::1;::::0;10238:235;-1:-1:-1;;;10238:235:6:o;7244:139::-;1075:7:13;1101:6;1241:23;1101:6;719:10:1;1241:23:13;1233:68;;;;-1:-1:-1;;;1233:68:13;;12545:2:16;1233:68:13;;;12527:21:16;;;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;12675:18;;1233:68:13;12343:356:16;1233:68:13;7316:8:6::1;:18:::0;;;::::1;;::::0;;;::::1;;::::0;;7349:27:::1;::::0;::::1;::::0;::::1;::::0;26242:2:16;26224:21;;;26281:1;26261:18;;;26254:29;26319:10;26314:2;26299:18;;26292:38;26362:2;26347:18;;26040:331;1490:300:5;1592:4;1627:40;;;1642:25;1627:40;;:104;;-1:-1:-1;1683:48:5;;;1698:33;1683:48;1627:104;:156;;;-1:-1:-1;952:25:4;937:40;;;;1747:36:5;829:155:4;10930:171:5;11004:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;11057:23;11004:24;11057:14;:23::i;:::-;11048:46;;;;;;;;;;;;10930:171;;:::o;7362:344::-;7455:4;7167:16;;;:7;:16;;;;;;:30;:16;7471:73;;;;-1:-1:-1;;;7471:73:5;;26578:2:16;7471:73:5;;;26560:21:16;26617:2;26597:18;;;26590:30;26656:34;26636:18;;;26629:62;26727:14;26707:18;;;26700:42;26759:19;;7471:73:5;26376:408:16;7471:73:5;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;7611:16;;:7;:16;;;:51;;;;7655:7;7631:31;;:20;7643:7;7631:11;:20::i;:::-;:31;;;7611:51;:87;;;;7666:32;7683:5;7690:7;7666:16;:32::i;:::-;7603:96;7362:344;-1:-1:-1;;;;7362:344:5:o;10259:560::-;10413:4;10386:31;;:23;10401:7;10386:14;:23::i;:::-;:31;;;10378:85;;;;-1:-1:-1;;;10378:85:5;;26991:2:16;10378:85:5;;;26973:21:16;27030:2;27010:18;;;27003:30;27069:34;27049:18;;;27042:62;27140:11;27120:18;;;27113:39;27169:19;;10378:85:5;26789:405:16;10378:85:5;10481:16;;;10473:65;;;;-1:-1:-1;;;10473:65:5;;27401:2:16;10473:65:5;;;27383:21:16;27440:2;27420:18;;;27413:30;27479:34;27459:18;;;27452:62;27550:6;27530:18;;;27523:34;27574:19;;10473:65:5;27199:400:16;10473:65:5;10650:29;10667:1;10671:7;10650:8;:29::i;:::-;10690:15;;;;;;;:9;:15;;;;;:20;;10709:1;;10690:15;:20;;10709:1;;10690:20;:::i;:::-;;;;-1:-1:-1;;10720:13:5;;;;;;;:9;:13;;;;;:18;;10737:1;;10720:13;:18;;10737:1;;10720:18;:::i;:::-;;;;-1:-1:-1;;10748:16:5;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;10785:27;;10748:16;;10785:27;;;;;;;10259:560;;;:::o;3451:96:14:-;3509:7;3535:5;3539:1;3535;:5;:::i;3836:96::-;3894:7;3920:5;3924:1;3920;:5;:::i;2263:187:13:-;2336:16;2355:6;;;2371:17;;;;;;;;;;2403:40;;2355:6;;;;;;;2403:40;;2336:16;2403:40;2326:124;2263:187;:::o;11236:307:5:-;11386:8;11377:17;;:5;:17;;;;11369:55;;;;-1:-1:-1;;;11369:55:5;;28250:2:16;11369:55:5;;;28232:21:16;28289:2;28269:18;;;28262:30;28328:27;28308:18;;;28301:55;28373:18;;11369:55:5;28048:349:16;11369:55:5;11434:25;;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;11495:41;;768::16;;;11495::5;;741:18:16;11495:41:5;;;;;;;11236:307;;;:::o;2757:129:6:-;2803:40;2813:3;2818:24;:14;918::2;;827:112;2818:24:6;2803:9;:40::i;:::-;2853:26;:14;1032:19:2;;1050:1;1032:19;;;945:123;6469:307:5;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;-1:-1:-1;;;6658:111:5;;28604:2:16;6658:111:5;;;28586:21:16;28643:2;28623:18;;;28616:30;28682:34;28662:18;;;28655:62;28753:20;28733:18;;;28726:48;28791:19;;6658:111:5;28402:414:16;9167:285:6;9262:4;;9328:3;9333:5;719:10:1;9311:42:6;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;9301:53;;9311:42;9301:53;;;;9433:12;;9301:53;;-1:-1:-1;9433:12:6;;9372:57;9418:10;9372:37;9301:53;8238:58:3;;30409:66:16;8238:58:3;;;30397:79:16;30492:12;;;30485:28;;;8108:7:3;;30529:12:16;;8238:58:3;;;;;;;;;;;;8228:69;;;;;;8221:76;;8039:265;;;;9372:37:6;:45;;:57::i;:::-;:73;;;;9167:285;-1:-1:-1;;;9167:285:6:o;328:703:15:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:15;;;;;;;;;;;;;;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:15;;-1:-1:-1;773:2:15;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:15;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:15;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;972:11:15;981:2;972:11;;:::i;:::-;;;844:150;;8036:108:5;8111:26;8121:2;8125:7;8111:26;;;;;;;;;;;;:9;:26::i;12096:778::-;12246:4;12266:13;;;1087:20:0;1133:8;12262:606:5;;12301:72;;;;;:36;;;;;;:72;;719:10:1;;12352:4:5;;12358:7;;12367:5;;12301:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12301:72:5;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12297:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12540:13:5;;12536:266;;12582:60;;-1:-1:-1;;;12582:60:5;;28604:2:16;12582:60:5;;;28586:21:16;28643:2;28623:18;;;28616:30;28682:34;28662:18;;;28655:62;28753:20;28733:18;;;28726:48;28791:19;;12582:60:5;28402:414:16;12536:266:5;12754:6;12748:13;12739:6;12735:2;12731:15;12724:38;12297:519;12423:51;;12433:41;12423:51;;-1:-1:-1;12416:58:5;;12262:606;-1:-1:-1;12853:4:5;12096:778;;;;;;:::o;4292:227:3:-;4370:7;4390:17;4409:18;4431:27;4442:4;4448:9;4431:10;:27::i;:::-;4389:69;;;;4468:18;4480:5;4468:11;:18::i;:::-;-1:-1:-1;4503:9:3;4292:227;-1:-1:-1;;;4292:227:3:o;8365:311:5:-;8490:18;8496:2;8500:7;8490:5;:18::i;:::-;8539:54;8570:1;8574:2;8578:7;8587:5;8539:22;:54::i;:::-;8518:151;;;;-1:-1:-1;;;8518:151:5;;28604:2:16;8518:151:5;;;28586:21:16;28643:2;28623:18;;;28616:30;28682:34;28662:18;;;28655:62;28753:20;28733:18;;;28726:48;28791:19;;8518:151:5;28402:414:16;2227:1279:3;2308:7;2317:12;2538:9;:16;2558:2;2538:22;2534:966;;;2827:4;2812:20;;2806:27;2876:4;2861:20;;2855:27;2933:4;2918:20;;2912:27;2576:9;2904:36;2974:25;2985:4;2904:36;2806:27;2855;2974:10;:25::i;:::-;2967:32;;;;;;;;;2534:966;3020:9;:16;3040:2;3020:22;3016:484;;;3289:4;3274:20;;3268:27;3339:4;3324:20;;3318:27;3379:23;3390:4;3268:27;3318;3379:10;:23::i;:::-;3372:30;;;;;;;;3016:484;-1:-1:-1;3449:1:3;;-1:-1:-1;3453:35:3;3433:56;;532:631;609:20;600:5;:29;;;;;;;;:::i;:::-;;596:561;;;532:631;:::o;596:561::-;705:29;696:5;:38;;;;;;;;:::i;:::-;;692:465;;;750:34;;-1:-1:-1;;;750:34:3;;30943:2:16;750:34:3;;;30925:21:16;30982:2;30962:18;;;30955:30;31021:26;31001:18;;;30994:54;31065:18;;750:34:3;30741:348:16;692:465:3;814:35;805:5;:44;;;;;;;;:::i;:::-;;801:356;;;865:41;;-1:-1:-1;;;865:41:3;;31296:2:16;865:41:3;;;31278:21:16;31335:2;31315:18;;;31308:30;31374:33;31354:18;;;31347:61;31425:18;;865:41:3;31094:355:16;801:356:3;936:30;927:5;:39;;;;;;;;:::i;:::-;;923:234;;;982:44;;-1:-1:-1;;;982:44:3;;31656:2:16;982:44:3;;;31638:21:16;31695:2;31675:18;;;31668:30;31734:34;31714:18;;;31707:62;31805:4;31785:18;;;31778:32;31827:19;;982:44:3;31454:398:16;923:234:3;1056:30;1047:5;:39;;;;;;;;:::i;:::-;;1043:114;;;1102:44;;-1:-1:-1;;;1102:44:3;;32059:2:16;1102:44:3;;;32041:21:16;32098:2;32078:18;;;32071:30;32137:34;32117:18;;;32110:62;32208:4;32188:18;;;32181:32;32230:19;;1102:44:3;31857:398:16;8998:372:5;9077:16;;;9069:61;;;;-1:-1:-1;;;9069:61:5;;32462:2:16;9069:61:5;;;32444:21:16;;;32481:18;;;32474:30;32540:34;32520:18;;;32513:62;32592:18;;9069:61:5;32260:356:16;9069:61:5;7144:4;7167:16;;;:7;:16;;;;;;:30;:16;:30;9140:58;;;;-1:-1:-1;;;9140:58:5;;32823:2:16;9140:58:5;;;32805:21:16;32862:2;32842:18;;;32835:30;32901;32881:18;;;32874:58;32949:18;;9140:58:5;32621:352:16;9140:58:5;9265:13;;;;;;;:9;:13;;;;;:18;;9282:1;;9265:13;:18;;9282:1;;9265:18;:::i;:::-;;;;-1:-1:-1;;9293:16:5;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;9330:33;;9293:16;;;9330:33;;9293:16;;9330:33;8998:372;;:::o;5743:1603:3:-;5869:7;;6793:66;6780:79;;6776:161;;;-1:-1:-1;6891:1:3;;-1:-1:-1;6895:30:3;6875:51;;6776:161;6950:1;:7;;6955:2;6950:7;;:18;;;;;6961:1;:7;;6966:2;6961:7;;6950:18;6946:100;;;-1:-1:-1;7000:1:3;;-1:-1:-1;7004:30:3;6984:51;;6946:100;7157:24;;;7140:14;7157:24;;;;;;;;;33205:25:16;;;33278:4;33266:17;;33246:18;;;33239:45;;;;33300:18;;;33293:34;;;33343:18;;;33336:34;;;7157:24:3;;33177:19:16;;7157:24:3;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7157:24:3;;;;;;-1:-1:-1;;7195:20:3;;;7191:101;;7247:1;7251:29;7231:50;;;;;;;7191:101;7310:6;-1:-1:-1;7318:20:3;;-1:-1:-1;5743:1603:3;;;;;;;;:::o;4773:379::-;4883:7;;4988:66;4980:75;;5081:3;5077:12;;;5091:2;5073:21;5120:25;5131:4;5073:21;5140:1;4980:75;5120:10;:25::i;:::-;5113:32;;;;;;4773:379;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;196:177:16;281:66;274:5;270:78;263:5;260:89;250:117;;363:1;360;353:12;378:245;436:6;489:2;477:9;468:7;464:23;460:32;457:52;;;505:1;502;495:12;457:52;544:9;531:23;563:30;587:5;563:30;:::i;820:180::-;879:6;932:2;920:9;911:7;907:23;903:32;900:52;;;948:1;945;938:12;900:52;-1:-1:-1;971:23:16;;820:180;-1:-1:-1;820:180:16:o;1005:258::-;1077:1;1087:113;1101:6;1098:1;1095:13;1087:113;;;1177:11;;;1171:18;1158:11;;;1151:39;1123:2;1116:10;1087:113;;;1218:6;1215:1;1212:13;1209:48;;;-1:-1:-1;;1253:1:16;1235:16;;1228:27;1005:258::o;1268:317::-;1310:3;1348:5;1342:12;1375:6;1370:3;1363:19;1391:63;1447:6;1440:4;1435:3;1431:14;1424:4;1417:5;1413:16;1391:63;:::i;:::-;1499:2;1487:15;1504:66;1483:88;1474:98;;;;1574:4;1470:109;;1268:317;-1:-1:-1;;1268:317:16:o;1590:220::-;1739:2;1728:9;1721:21;1702:4;1759:45;1800:2;1789:9;1785:18;1777:6;1759:45;:::i;2046:154::-;2132:42;2125:5;2121:54;2114:5;2111:65;2101:93;;2190:1;2187;2180:12;2205:315;2273:6;2281;2334:2;2322:9;2313:7;2309:23;2305:32;2302:52;;;2350:1;2347;2340:12;2302:52;2389:9;2376:23;2408:31;2433:5;2408:31;:::i;:::-;2458:5;2510:2;2495:18;;;;2482:32;;-1:-1:-1;;;2205:315:16:o;2525:247::-;2584:6;2637:2;2625:9;2616:7;2612:23;2608:32;2605:52;;;2653:1;2650;2643:12;2605:52;2692:9;2679:23;2711:31;2736:5;2711:31;:::i;2777:456::-;2854:6;2862;2870;2923:2;2911:9;2902:7;2898:23;2894:32;2891:52;;;2939:1;2936;2929:12;2891:52;2978:9;2965:23;2997:31;3022:5;2997:31;:::i;:::-;3047:5;-1:-1:-1;3104:2:16;3089:18;;3076:32;3117:33;3076:32;3117:33;:::i;:::-;2777:456;;3169:7;;-1:-1:-1;;;3223:2:16;3208:18;;;;3195:32;;2777:456::o;3238:367::-;3301:8;3311:6;3365:3;3358:4;3350:6;3346:17;3342:27;3332:55;;3383:1;3380;3373:12;3332:55;-1:-1:-1;3406:20:16;;3449:18;3438:30;;3435:50;;;3481:1;3478;3471:12;3435:50;3518:4;3510:6;3506:17;3494:29;;3578:3;3571:4;3561:6;3558:1;3554:14;3546:6;3542:27;3538:38;3535:47;3532:67;;;3595:1;3592;3585:12;3610:773;3732:6;3740;3748;3756;3809:2;3797:9;3788:7;3784:23;3780:32;3777:52;;;3825:1;3822;3815:12;3777:52;3865:9;3852:23;3894:18;3935:2;3927:6;3924:14;3921:34;;;3951:1;3948;3941:12;3921:34;3990:70;4052:7;4043:6;4032:9;4028:22;3990:70;:::i;:::-;4079:8;;-1:-1:-1;3964:96:16;-1:-1:-1;4167:2:16;4152:18;;4139:32;;-1:-1:-1;4183:16:16;;;4180:36;;;4212:1;4209;4202:12;4180:36;;4251:72;4315:7;4304:8;4293:9;4289:24;4251:72;:::i;:::-;3610:773;;;;-1:-1:-1;4342:8:16;-1:-1:-1;;;;3610:773:16:o;4388:248::-;4456:6;4464;4517:2;4505:9;4496:7;4492:23;4488:32;4485:52;;;4533:1;4530;4523:12;4485:52;-1:-1:-1;;4556:23:16;;;4626:2;4611:18;;;4598:32;;-1:-1:-1;4388:248:16:o;4943:160::-;5008:20;;5064:13;;5057:21;5047:32;;5037:60;;5093:1;5090;5083:12;5037:60;4943:160;;;:::o;5108:180::-;5164:6;5217:2;5205:9;5196:7;5192:23;5188:32;5185:52;;;5233:1;5230;5223:12;5185:52;5256:26;5272:9;5256:26;:::i;5293:592::-;5364:6;5372;5425:2;5413:9;5404:7;5400:23;5396:32;5393:52;;;5441:1;5438;5431:12;5393:52;5481:9;5468:23;5510:18;5551:2;5543:6;5540:14;5537:34;;;5567:1;5564;5557:12;5537:34;5605:6;5594:9;5590:22;5580:32;;5650:7;5643:4;5639:2;5635:13;5631:27;5621:55;;5672:1;5669;5662:12;5621:55;5712:2;5699:16;5738:2;5730:6;5727:14;5724:34;;;5754:1;5751;5744:12;5724:34;5799:7;5794:2;5785:6;5781:2;5777:15;5773:24;5770:37;5767:57;;;5820:1;5817;5810:12;5767:57;5851:2;5843:11;;;;;5873:6;;-1:-1:-1;5293:592:16;;-1:-1:-1;;;;5293:592:16:o;5890:315::-;5955:6;5963;6016:2;6004:9;5995:7;5991:23;5987:32;5984:52;;;6032:1;6029;6022:12;5984:52;6071:9;6058:23;6090:31;6115:5;6090:31;:::i;:::-;6140:5;-1:-1:-1;6164:35:16;6195:2;6180:18;;6164:35;:::i;:::-;6154:45;;5890:315;;;;;:::o;6988:184::-;7040:77;7037:1;7030:88;7137:4;7134:1;7127:15;7161:4;7158:1;7151:15;7177:690;7241:5;7271:18;7312:2;7304:6;7301:14;7298:40;;;7318:18;;:::i;:::-;7452:2;7446:9;7518:2;7506:15;;7357:66;7502:24;;;7528:2;7498:33;7494:42;7482:55;;;7552:18;;;7572:22;;;7549:46;7546:72;;;7598:18;;:::i;:::-;7638:10;7634:2;7627:22;7667:6;7658:15;;7697:6;7689;7682:22;7737:3;7728:6;7723:3;7719:16;7716:25;7713:45;;;7754:1;7751;7744:12;7713:45;7804:6;7799:3;7792:4;7784:6;7780:17;7767:44;7859:1;7852:4;7843:6;7835;7831:19;7827:30;7820:41;;;;7177:690;;;;;:::o;7872:220::-;7914:5;7967:3;7960:4;7952:6;7948:17;7944:27;7934:55;;7985:1;7982;7975:12;7934:55;8007:79;8082:3;8073:6;8060:20;8053:4;8045:6;8041:17;8007:79;:::i;8097:665::-;8192:6;8200;8208;8216;8269:3;8257:9;8248:7;8244:23;8240:33;8237:53;;;8286:1;8283;8276:12;8237:53;8325:9;8312:23;8344:31;8369:5;8344:31;:::i;:::-;8394:5;-1:-1:-1;8451:2:16;8436:18;;8423:32;8464:33;8423:32;8464:33;:::i;:::-;8516:7;-1:-1:-1;8570:2:16;8555:18;;8542:32;;-1:-1:-1;8625:2:16;8610:18;;8597:32;8652:18;8641:30;;8638:50;;;8684:1;8681;8674:12;8638:50;8707:49;8748:7;8739:6;8728:9;8724:22;8707:49;:::i;:::-;8697:59;;;8097:665;;;;;;;:::o;8767:320::-;8835:6;8888:2;8876:9;8867:7;8863:23;8859:32;8856:52;;;8904:1;8901;8894:12;8856:52;8944:9;8931:23;8977:18;8969:6;8966:30;8963:50;;;9009:1;9006;8999:12;8963:50;9032:49;9073:7;9064:6;9053:9;9049:22;9032:49;:::i;9092:450::-;9161:6;9214:2;9202:9;9193:7;9189:23;9185:32;9182:52;;;9230:1;9227;9220:12;9182:52;9270:9;9257:23;9303:18;9295:6;9292:30;9289:50;;;9335:1;9332;9325:12;9289:50;9358:22;;9411:4;9403:13;;9399:27;-1:-1:-1;9389:55:16;;9440:1;9437;9430:12;9389:55;9463:73;9528:7;9523:2;9510:16;9505:2;9501;9497:11;9463:73;:::i;9547:388::-;9624:6;9632;9685:2;9673:9;9664:7;9660:23;9656:32;9653:52;;;9701:1;9698;9691:12;9653:52;9737:9;9724:23;9714:33;;9798:2;9787:9;9783:18;9770:32;9825:18;9817:6;9814:30;9811:50;;;9857:1;9854;9847:12;9811:50;9880:49;9921:7;9912:6;9901:9;9897:22;9880:49;:::i;:::-;9870:59;;;9547:388;;;;;:::o;9940:::-;10008:6;10016;10069:2;10057:9;10048:7;10044:23;10040:32;10037:52;;;10085:1;10082;10075:12;10037:52;10124:9;10111:23;10143:31;10168:5;10143:31;:::i;:::-;10193:5;-1:-1:-1;10250:2:16;10235:18;;10222:32;10263:33;10222:32;10263:33;:::i;:::-;10315:7;10305:17;;;9940:388;;;;;:::o;10661:437::-;10740:1;10736:12;;;;10783;;;10804:61;;10858:4;10850:6;10846:17;10836:27;;10804:61;10911:2;10903:6;10900:14;10880:18;10877:38;10874:218;;;10948:77;10945:1;10938:88;11049:4;11046:1;11039:15;11077:4;11074:1;11067:15;10874:218;;10661:437;;;:::o;14841:184::-;14893:77;14890:1;14883:88;14990:4;14987:1;14980:15;15014:4;15011:1;15004:15;15030:184;15082:77;15079:1;15072:88;15179:4;15176:1;15169:15;15203:4;15200:1;15193:15;15219:195;15258:3;15289:66;15282:5;15279:77;15276:103;;;15359:18;;:::i;:::-;-1:-1:-1;15406:1:16;15395:13;;15219:195::o;16441:128::-;16481:3;16512:1;16508:6;16505:1;16502:13;16499:39;;;16518:18;;:::i;:::-;-1:-1:-1;16554:9:16;;16441:128::o;19888:1088::-;19973:12;;19938:3;;20028:1;20048:18;;;;20101;;;;20128:61;;20182:4;20174:6;20170:17;20160:27;;20128:61;20208:2;20256;20248:6;20245:14;20225:18;20222:38;20219:218;;;20293:77;20290:1;20283:88;20394:4;20391:1;20384:15;20422:4;20419:1;20412:15;20219:218;20453:18;20480:162;;;;20656:1;20651:319;;;;20446:524;;20480:162;20528:66;20517:9;20513:82;20508:3;20501:95;20625:6;20620:3;20616:16;20609:23;;20480:162;;20651:319;19835:1;19828:14;;;19872:4;19859:18;;20745:1;20759:165;20773:6;20770:1;20767:13;20759:165;;;20851:14;;20838:11;;;20831:35;20894:16;;;;20788:10;;20759:165;;;20763:3;;20953:6;20948:3;20944:16;20937:23;;20446:524;;;;;;;19888:1088;;;;:::o;20981:376::-;21157:3;21185:38;21219:3;21211:6;21185:38;:::i;:::-;21252:6;21246:13;21268:52;21313:6;21309:2;21302:4;21294:6;21290:17;21268:52;:::i;:::-;21336:15;;20981:376;-1:-1:-1;;;;20981:376:16:o;23403:228::-;23443:7;23569:1;23501:66;23497:74;23494:1;23491:81;23486:1;23479:9;23472:17;23468:105;23465:131;;;23576:18;;:::i;:::-;-1:-1:-1;23616:9:16;;23403:228::o;25001:280::-;25100:6;25153:2;25141:9;25132:7;25128:23;25124:32;25121:52;;;25169:1;25166;25159:12;25121:52;25201:9;25195:16;25220:31;25245:5;25220:31;:::i;27604:125::-;27644:4;27672:1;27669;27666:8;27663:34;;;27677:18;;:::i;:::-;-1:-1:-1;27714:9:16;;27604:125::o;27734:184::-;27786:77;27783:1;27776:88;27883:4;27880:1;27873:15;27907:4;27904:1;27897:15;27923:120;27963:1;27989;27979:35;;27994:18;;:::i;:::-;-1:-1:-1;28028:9:16;;27923:120::o;28821:453::-;29022:3;29053:73;29087:38;29121:3;29113:6;29087:38;:::i;:::-;29079:6;29053:73;:::i;:::-;29157:2;29153:15;;;;29170:66;29149:88;29135:103;;-1:-1:-1;;29265:2:16;29254:14;;28821:453;-1:-1:-1;;28821:453:16:o;29279:112::-;29311:1;29337;29327:35;;29342:18;;:::i;:::-;-1:-1:-1;29376:9:16;;29279:112::o;29396:512::-;29590:4;29619:42;29700:2;29692:6;29688:15;29677:9;29670:34;29752:2;29744:6;29740:15;29735:2;29724:9;29720:18;29713:43;;29792:6;29787:2;29776:9;29772:18;29765:34;29835:3;29830:2;29819:9;29815:18;29808:31;29856:46;29897:3;29886:9;29882:19;29874:6;29856:46;:::i;:::-;29848:54;29396:512;-1:-1:-1;;;;;;29396:512:16:o;29913:249::-;29982:6;30035:2;30023:9;30014:7;30010:23;30006:32;30003:52;;;30051:1;30048;30041:12;30003:52;30083:9;30077:16;30102:30;30126:5;30102:30;:::i;30552:184::-;30604:77;30601:1;30594:88;30701:4;30698:1;30691:15;30725:4;30722:1;30715:15
Swarm Source
ipfs://d7dee0c97a09282bb46671c4128444c97c2900424233e210b350daf5439cb9b1
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.