Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
3,333 CHAMPS
Holders
677
Market
Volume (24H)
0.274 ETH
Min Price (24H)
$931.63 @ 0.274000 ETH
Max Price (24H)
$931.63 @ 0.274000 ETH
Other Info
Token Contract
Balance
0 CHAMPSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Microgas721
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-26 */ // SPDX-License-Identifier: UNLICENSED // Copyright (c) 2022 Joyride // File: microgasFactory.sol // Some parts modified 2022 from github.com/divergencetech/ethier pragma solidity ^0.8.11; /** * @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, "BAD_HEX_LENGTH"); return string(buffer); } } /** * @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; } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "REENTRANT"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @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(), "NOT_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), "BAD_OWNER"); _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); } } interface IAllowsProxy { function isProxyActive() external view returns (bool); function proxyAddress() external view returns (address); function isApprovedForProxy(address _owner, address _operator) external view returns (bool); } interface IFactoryMintable { function factoryMint(uint256 _optionId, address _to) external; function factoryCanMint(uint256 _optionId) external view returns (bool); } contract OwnableDelegateProxy {} /** * Used to delegate ownership of a contract to another address, to save on unneeded transactions to approve contract use for users */ contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; } contract AllowsConfigurableProxy is IAllowsProxy, Ownable { bool internal isProxyActive_; address internal proxyAddress_; constructor(address _proxyAddress, bool _isProxyActive) { proxyAddress_ = _proxyAddress; isProxyActive_ = _isProxyActive; } function setIsProxyActive(bool _isProxyActive) external onlyOwner { isProxyActive_ = _isProxyActive; } function setProxyAddress(address _proxyAddress) public onlyOwner { proxyAddress_ = _proxyAddress; } function proxyAddress() public view returns (address) { return proxyAddress_; } function isProxyActive() public view returns (bool) { return isProxyActive_; } function isApprovedForProxy(address owner, address _operator) public view returns (bool) { if ( isProxyActive_ && proxyAddress_ == _operator ) { return true; } ProxyRegistry proxyRegistry = ProxyRegistry(proxyAddress_); if ( isProxyActive_ && address(proxyRegistry.proxies(owner)) == _operator ) { return true; } return false; } } /** * This is a generic factory contract that can be used to mint tokens. The configuration * for minting is specified by an _optionId, which can be used to delineate various * ways of minting. */ interface IFactoryERC721 { /** * Returns the name of this factory. */ function name() external view returns (string memory); /** * Returns the symbol for this factory. */ function symbol() external view returns (string memory); /** * Number of options the factory supports. */ function numOptions() external view returns (uint256); /** * @dev Returns whether the option ID can be minted. Can return false if the developer wishes to * restrict a total supply per option ID (or overall). */ function canMint(uint256 _optionId) external view returns (bool); /** * @dev Returns a URL specifying some metadata about the option. This metadata can be of the * same structure as the ERC721 metadata. */ function tokenURI(uint256 _optionId) external view returns (string memory); /** * Indicates that this is a factory contract. Ideally would use EIP 165 supportsInterface() */ function supportsFactoryInterface() external view returns (bool); /** * @dev Mints asset(s) in accordance to a specific address with a particular "option". This should be * callable only by the contract owner or the owner's Wyvern Proxy (later universal login will solve this). * Options should also be delineated 0 - (numOptions() - 1) for convenient indexing. * @param _optionId the option id * @param _toAddress address of the future owner of the asset(s) */ function mint(uint256 _optionId, address _toAddress) external; } /** * @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); } /** * @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; } /** * @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); } contract TokenFactory is AllowsConfigurableProxy, ReentrancyGuard, IERC721 { using Strings for uint256; uint256 public immutable NUM_OPTIONS; /// @notice Contract that deployed this factory. IFactoryMintable public token; /// @notice Factory name and symbol. string public name; string public symbol; string public optionURI; bool public paused = false; error NotOwnerOrProxy(); error InvalidOptionId(); constructor( string memory _name, string memory _symbol, address _owner, uint256 _numOptions, address _proxyAddress, IFactoryMintable _token ) AllowsConfigurableProxy(_proxyAddress, true) { name = _name; symbol = _symbol; token = _token; NUM_OPTIONS = _numOptions; optionURI = "https://onjoyride.mypinata.cloud/ipfs/QmWY6ZTnvd7Zaw2hSLzDudvv5GxJ47hMNXhZQVQQqnoWxu/"; // first owner will be the token that deploys the contract transferOwnership(_owner); createOptionsAndEmitTransfers(); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC165).interfaceId; } modifier onlyOwnerOrProxy() { if ( _msgSender() != owner() && !isApprovedForProxy(owner(), _msgSender()) ) { revert NotOwnerOrProxy(); } _; } modifier checkValidOptionId(uint256 _optionId) { // options are 0-indexed so check should be inclusive if (_optionId >= NUM_OPTIONS) { revert InvalidOptionId(); } _; } modifier interactBurnInvalidOptionId(uint256 _optionId) { _; _burnInvalidOptions(); } modifier whenNotPaused() { require(!paused, "PAUSED"); _; } function setPaused(bool state) external onlyOwner { paused = state; } function supportsFactoryInterface() public pure returns (bool) { return true; } /** @notice Emits standard ERC721.Transfer events for each option so NFT indexers pick them up. Does not need to fire on contract ownership transfer because once the tokens exist, the `ownerOf` check will always pass for contract owner. */ function createOptionsAndEmitTransfers() internal { for (uint256 i = 0; i < NUM_OPTIONS; i++) { emit Transfer(address(0), owner(), i); } } /// @notice Sets the base URI for constructing tokenURI values for options. function setBaseOptionURI(string memory _baseOptionURI) public onlyOwner { optionURI = _baseOptionURI; } /** @notice hack: transferFrom is called on sale � this method mints the real token */ function transferFrom( address, address _to, uint256 _optionId ) public nonReentrant onlyOwnerOrProxy whenNotPaused interactBurnInvalidOptionId(_optionId) { token.factoryMint(_optionId, _to); } function safeTransferFrom( address, address _to, uint256 _optionId ) public override nonReentrant onlyOwnerOrProxy whenNotPaused interactBurnInvalidOptionId(_optionId) { token.factoryMint(_optionId, _to); } function safeTransferFrom( address, address _to, uint256 _optionId, bytes calldata ) external { safeTransferFrom(_to, _to,_optionId); } /** @dev Return true if operator is an approved proxy of Owner */ function isApprovedForAll(address _owner, address _operator) public view returns (bool) { return isApprovedForProxy(_owner, _operator); } /** @notice Returns owner if _optionId is valid so posted orders pass validation */ function ownerOf(uint256 _optionId) public view returns (address) { return token.factoryCanMint(_optionId) ? owner() : address(0); } /** @notice Returns a URL specifying option metadata, conforming to standard ERC1155 metadata format. */ function tokenURI(uint256 _optionId) external view returns (string memory) { return string(abi.encodePacked(optionURI, _optionId.toString())); } ///@notice public facing method for _burnInvalidOptions in case state of tokenContract changes function burnInvalidOptions() public onlyOwner { _burnInvalidOptions(); } ///@notice "burn" option by sending it to 0 address. This will hide all active listings. Called as part of interactBurnInvalidOptionIds function _burnInvalidOptions() internal { for (uint256 i; i < NUM_OPTIONS; ++i) { if (!token.factoryCanMint(i)) { emit Transfer(owner(), address(0), i); } } } /** @notice emit a transfer event for a "burnt" option back to the owner if factoryCanMint the optionId @dev will re-validate listings on OpenSea frontend if an option becomes eligible to mint again eg, if max supply is increased */ function restoreOption(uint256 _optionId) external onlyOwner { if (token.factoryCanMint(_optionId)) { emit Transfer(address(0), owner(), _optionId); } } function totalSupply() external pure returns (uint256) { return 3333; } function approve(address operator, uint256) external onlyOwner { setProxyAddress(operator); } function getApproved(uint256) external view returns (address operator) {return proxyAddress();} function setApprovalForAll(address operator, bool) external onlyOwner { setProxyAddress(operator); } function balanceOf(address _owner) external view returns (uint256) {return _owner==owner()?NUM_OPTIONS:0;} } // File: microgas721.sol /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/Address.sol // 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, "TOO_POOR"); (bool success, ) = recipient.call{value: amount}(""); require(success, "CANT_SEND"); } /** * @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, "LL_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, "LL_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, "TOO_POOR"); require(isContract(target), "NOT_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, "LL_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), "NOT_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, "LL_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), "NOT_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); } } } } /** * @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; } } /** * @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; uint256 public constant MAX_UINT = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) internal _owners; // Mapping owner address to token count //mapping(address => uint256) internal _balances; // Mapping from token ID to approved address mapping(uint256 => address) internal _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) internal _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), "BAD_ADDRESS"); //return _balances[owner]; //balanceOf in ERC-721 is pointless and nearly useless without the ERC721Enumerable extension. //returns max value just in case anything is actually relying on it for anything. //This should indicate that the method is not implemented without throwing or returning 0 which could cause confusion. return MAX_UINT; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner > address(1), "BAD_ID"); 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), "BAD_ID"); 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, "INVALID"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "NOT_OWNER" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "BAD_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), "NOT_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), "NOT_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), "NOT_RECEIVER"); } /** * @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(1); } /** * @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), "BAD_ID"); 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), "NOT_RECEIVER" ); } /** * @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(1), "ZERO_ADDRESS"); require(!_exists(tokenId), "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, "NOT_OWNER"); require(to > address(1), "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, "INVALID_APPROVE"); _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("NOT_RECEIVER"); } 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 {} } contract Initializable { bool inited = false; modifier initializer() { require(!inited, "INITIALIZED"); _; inited = true; } } contract EIP712Base is Initializable { struct EIP712Domain { string name; string version; address verifyingContract; bytes32 salt; } string constant public ERC712_VERSION = "1"; bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256( bytes( "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)" ) ); bytes32 internal domainSeperator; // supposed to be called once while initializing. // one of the contracts that inherits this contract follows proxy pattern // so it is not possible to do this in a constructor function _initializeEIP712( string memory name ) internal initializer { _setDomainSeperator(name); } function _setDomainSeperator(string memory name) internal { domainSeperator = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(ERC712_VERSION)), address(this), bytes32(getChainId()) ) ); } function getDomainSeperator() public view returns (bytes32) { return domainSeperator; } function getChainId() public view returns (uint256) { uint256 id; assembly { id := chainid() } return id; } /** * Accept message hash and returns hash message in EIP712 compatible form * So that it can be used to recover signer from signature signed using EIP712 formatted data * https://eips.ethereum.org/EIPS/eip-712 * "\\x19" makes the encoding deterministic * "\\x01" is the version byte to make it compatible to EIP-191 */ function toTypedMessageHash(bytes32 messageHash) internal view returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash) ); } } /** * @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; } } } contract NativeMetaTransaction is EIP712Base { using SafeMath for uint256; bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256( bytes( "MetaTransaction(uint256 nonce,address from,bytes functionSignature)" ) ); event MetaTransactionExecuted( address userAddress, address payable relayerAddress, bytes functionSignature ); mapping(address => uint256) nonces; /* * Meta transaction structure. * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas * He should call the desired function directly in that case. */ struct MetaTransaction { uint256 nonce; address from; bytes functionSignature; } function executeMetaTransaction( address userAddress, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV ) public payable returns (bytes memory) { MetaTransaction memory metaTx = MetaTransaction({ nonce: nonces[userAddress], from: userAddress, functionSignature: functionSignature }); require( verify(userAddress, metaTx, sigR, sigS, sigV), "BAD_SIGNER" ); // increase nonce for user (to avoid re-use) nonces[userAddress] = nonces[userAddress].add(1); emit MetaTransactionExecuted( userAddress, payable(msg.sender), functionSignature ); // Append userAddress and relayer address at the end to extract it from calling context (bool success, bytes memory returnData) = address(this).call( abi.encodePacked(functionSignature, userAddress) ); require(success, "FAILED"); return returnData; } function hashMetaTransaction(MetaTransaction memory metaTx) internal pure returns (bytes32) { return keccak256( abi.encode( META_TRANSACTION_TYPEHASH, metaTx.nonce, metaTx.from, keccak256(metaTx.functionSignature) ) ); } function getNonce(address user) public view returns (uint256 nonce) { nonce = nonces[user]; } function verify( address signer, MetaTransaction memory metaTx, bytes32 sigR, bytes32 sigS, uint8 sigV ) internal view returns (bool) { require(signer != address(0), "INVALID_SIGNER"); return signer == ecrecover( toTypedMessageHash(hashMetaTransaction(metaTx)), sigV, sigR, sigS ); } } interface IToken { function approve(address spender, uint256 amount) external returns (bool); } abstract contract FactoryMintable is Context { address public tokenFactory; error NotTokenFactory(); error FactoryCannotMint(); modifier onlyFactory() { if (_msgSender() != tokenFactory) { revert NotTokenFactory(); } _; } modifier canMint(uint256 _optionId) { if (!factoryCanMint(_optionId)) { revert FactoryCannotMint(); } _; } function factoryMint(uint256 _optionId, address _to) external virtual; function factoryCanMint(uint256 _optionId) public view virtual returns (bool); } abstract contract ContextMixin { function msgSender() internal view returns (address payable sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and( mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff ) } } else { sender = payable(msg.sender); } return sender; } } struct mintTier { uint8 tierIndex; uint32 finneyPrice; uint32 startIndex; uint32 endIndex; uint32 nextIDPlusOne; //must initialize as 1 } enum purchaseType { PUBLIC_SALE, FREE_MINT, WHITE_LIST } struct purchaseData { uint256 tierID; uint256 quantity; purchaseType purchaseType; uint256[] whitelistBits; uint256[] freeMintIDs; bytes32 sigR; bytes32 sigS; uint8 sigV; } struct remainingNFTData { uint256 tierID; uint256 remaining; uint256 weiPrice; uint256 wlWeiPrice; } struct webData { remainingNFTData[] remaining; uint256 whiteListStartTimestamp; uint256 publicStartTimestamp; bool revealed; } contract Microgas721 is ContextMixin, NativeMetaTransaction, Ownable, ERC721, FactoryMintable, ReentrancyGuard { using Strings for uint256; using Address for address; uint256 public constant FINNEY = 1e15; uint256 public constant MAX_PER_TX = 5; uint256 public _tierCount; uint256 public _maxSupply; string private _contractMetadataURI; string[] private _tierBaseURI; mintTier[] public _packTiers; address _allowListSigningAddress; uint256 _revealBlock; uint256 _revealed; uint256 public _publicStartTimestamp = ERC721.MAX_UINT; uint256 public _whiteListStartTimestamp = ERC721.MAX_UINT; uint256[] _whitelistBits; address _openSeaProxy; mapping(address => bool) _revokedDefaultPermissions; mapping(address => mapping(uint256 => uint256)) _purchasedByOriginPerBlock; bool _paused = false; constructor(string memory name_, string memory symbol_, address proxy) ERC721(name_, symbol_) { _openSeaProxy = proxy; setupInitialData(); } function setupInitialData() private { _packTiers.push(mintTier(0,79,0,3332,1)); _tierBaseURI.push("https://onjoyride.mypinata.cloud/ipfs/QmbxXvL1rSTHYye3CN6h1TBKnr3aFcTA4pMuLBYS6bVjBn/tokens/"); _contractMetadataURI = "https://onjoyride.mypinata.cloud/ipfs/QmbxXvL1rSTHYye3CN6h1TBKnr3aFcTA4pMuLBYS6bVjBn/contract"; _tierCount = 1; _maxSupply = 3333; _whiteListStartTimestamp = 1648501200; _publicStartTimestamp = 1648587600; _allowListSigningAddress = 0x8e69cAc0DBFe68BEfCa549f817F8Ee86c053dEeB; for(uint i = 0; i < 14; i++) { _whitelistBits.push(ERC721.MAX_UINT); } } modifier validSignature (purchaseData memory purchaseData_) { if(purchaseData_.purchaseType != purchaseType.PUBLIC_SALE) { bytes memory encodedPurchaseData; if(purchaseData_.purchaseType == purchaseType.WHITE_LIST) { encodedPurchaseData = abi.encodePacked( "\x19Ethereum Signed Message:\n32", purchaseData_.whitelistBits, bytes32(uint256(uint160(msg.sender)))); } else { encodedPurchaseData = abi.encodePacked( "\x19Ethereum Signed Message:\n32", purchaseData_.tierID, purchaseData_.freeMintIDs, bytes32(uint256(uint160(msg.sender)))); } bytes32 hash = keccak256(encodedPurchaseData); require( _allowListSigningAddress == ecrecover(hash, purchaseData_.sigV, purchaseData_.sigR, purchaseData_.sigS) ,"NO_AUTH" ); } _; } modifier beforeSale() { require(totalSupply() == 0 || _publicStartTimestamp > block.timestamp && _whiteListStartTimestamp > block.timestamp, "STARTED"); _; } modifier publicStarted() { require(_publicStartTimestamp < block.timestamp, "BEFORE_PUBLIC"); _; } modifier notRevealed() { require(_revealed == 0, "REVEALED"); _; } modifier notPaused() { require(!_paused, "PAUSED"); _; } function setOSFactory(ITokenFactory factory) public onlyOwner { tokenFactory = address(factory); } function setContractMetadataURI(string calldata uri) external onlyOwner { _contractMetadataURI = uri; } function setAllowListSigningAddress(address signer) external onlyOwner { _allowListSigningAddress = signer; } function setDropTimestamps(uint256 whiteListStart_, uint256 publicStart_) external onlyOwner beforeSale { _publicStartTimestamp = publicStart_; _whiteListStartTimestamp = whiteListStart_; } function setPackTiers(mintTier[] calldata tiers) external onlyOwner beforeSale { uint maxSupply = 0; for(uint i = 0; i < tiers.length; i++) { require(tiers[i].tierIndex == i, "BAD_INDEX"); if(i < _tierCount) { _packTiers[i] = tiers[i]; } else { _packTiers.push(tiers[i]); _tierBaseURI.push(""); } maxSupply += tiers[i].endIndex - tiers[i].startIndex; } while(_packTiers.length > tiers.length) { _packTiers.pop(); _tierBaseURI.pop(); } _tierCount = tiers.length; _maxSupply = maxSupply; } function setReducedPackTier(uint mintTierIndex, uint32 newEndIndex) external onlyOwner notRevealed { mintTier memory tier = _packTiers[mintTierIndex]; require(tier.startIndex < newEndIndex && tier.endIndex > newEndIndex, "BAD_TIER"); _packTiers[mintTierIndex].endIndex = newEndIndex; uint oldSupply = tier.endIndex - tier.startIndex; uint newSupply = newEndIndex - tier.startIndex; _maxSupply -= oldSupply - newSupply; } function setPaused(bool state) external onlyOwner { _paused = state; } function initializeTierURIs(string[] calldata tierBaseURI_) external onlyOwner { require(tierBaseURI_.length == _tierCount, "BAD_URIS"); for(uint i = 0; i < _tierCount; i++) { _tierBaseURI[i] = tierBaseURI_[i]; } if(tokenFactory == address(0)) ITokenFactory(tokenFactory).setBaseOptionURI(tierBaseURI_); } function addWhitelistBits(uint blockCount) public onlyOwner { for(uint i = 0; i < blockCount; i++) { _whitelistBits.push(ERC721.MAX_UINT); } } function prepReveal() external onlyOwner notRevealed { _revealBlock = block.number; } function reveal() external onlyOwner notRevealed { require(blockhash(_revealBlock + 10) != 0, "CANT_REVEAL"); require(blockhash(_revealBlock + 20) != 0, "CANT_REVEAL"); _revealed = uint256(keccak256(abi.encodePacked( blockhash(_revealBlock + 20), blockhash(_revealBlock + 15), blockhash(_revealBlock + 10)))); } function primeThePump(uint256 start_, uint256 count_, uint256 tierID_, address[] calldata freebieAddresses_) external onlyOwner { mintTier memory tier = _packTiers[tierID_]; require(tier.startIndex < start_+1, "NOT_IN_TIER"); require(tier.endIndex > start_+count_-2, "NOT_IN_TIER"); for(uint i = start_; i < start_+count_; i++) { if(i >= start_ + freebieAddresses_.length) { require(_owners[i] == address(0), "ID_INITIALIZED"); _owners[i] = address(1); } else { require(start_ == tier.startIndex, "BAD_FREEBIE_ID"); _safeMint(freebieAddresses_[i-start_], i, ""); } } tier.nextIDPlusOne += uint32(freebieAddresses_.length); _packTiers[tierID_] = tier; } /** * @dev Returns the total unsold tokens from a tier by its index. */ function tierUnsold(uint256 tierIDX) private view returns (uint256) { mintTier memory tier = _packTiers[tierIDX]; return tier.endIndex - tier.startIndex - tier.nextIDPlusOne + 2; } /** * @dev Returns the price of token from a tier by its index. */ function tierPrice(uint256 tierIDX) private view returns (uint256) { mintTier memory tier = _packTiers[tierIDX]; return tier.finneyPrice*FINNEY; } /** * @dev Returns the presale price of token from a tier by its index. */ function tierWLPrice(uint256 tierIDX) private view returns (uint256) { mintTier memory tier = _packTiers[tierIDX]; return tier.finneyPrice*FINNEY; } function remainingItems() external view returns (webData memory) { remainingNFTData[] memory remainingNFT = new remainingNFTData[](_tierCount); for(uint i = 0; i < _tierCount; i++) { uint256 remaining = tierUnsold(i); uint256 weiPrice = tierPrice(i); uint256 wlWeiPrice = tierWLPrice(i); remainingNFT[i] = remainingNFTData(i,remaining,weiPrice,wlWeiPrice); } return webData(remainingNFT, _whiteListStartTimestamp, _publicStartTimestamp, _revealed != 0); } function idToTier(uint256 tokenId_) private view returns (mintTier memory) { mintTier memory tier; for(uint i = 0; i < _tierCount; i++) { tier = _packTiers[i]; if(tier.startIndex <= tokenId_ && tier.endIndex >= tokenId_) { return tier; } } require(false, "INVALID_ID"); return tier; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId_) public view virtual override returns (string memory) { require(_exists(tokenId_), "INVALID_ID"); mintTier memory tier = idToTier(tokenId_); string memory baseURI = _tierBaseURI[tier.tierIndex]; if(_revealed == 0) { return string( abi.encodePacked(baseURI, "default") ); } else { uint id = tokenId_ - tier.startIndex; id = (_revealed + id) % (tier.endIndex - tier.startIndex); id += tier.startIndex; return string( abi.encodePacked(baseURI, "revealed/", id.toString()) ); } } /** * @dev See {IERC721-balanceOf}. * Using a simple naive search of all entries and counting. This costs way too much gas for use on chain. * On-chain ownership-of-any checks should require an ID as parameter and use ownerOf(). */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner <= address(1), "BAD_QUERY"); uint count; for( uint i; i < _maxSupply; ++i ){ if( owner == _owners[i]) ++count; } return count; } /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() public view returns (uint256) { uint256 sumTotal = 0; for(uint i = 0; i < _tierCount; i++) { sumTotal += _packTiers[i].nextIDPlusOne; } return sumTotal - _tierCount; } function mintTokenComplex(purchaseData[] calldata data_) external payable { uint256 valueRemaining = msg.value; uint256 totalPurchased = 0; for(uint i = 0; i < data_.length; i++) { if(data_[i].purchaseType == purchaseType.PUBLIC_SALE) { require(_publicStartTimestamp > block.timestamp, "NOT_START"); uint256 price = tierPrice(data_[i].tierID); valueRemaining -= mintTokenBase(data_[i].tierID,data_[i].quantity, valueRemaining, price, msgSender()); totalPurchased += data_[i].quantity; } else { require(block.timestamp > _whiteListStartTimestamp && block.timestamp < _publicStartTimestamp, "NOT_WL"); valueRemaining -= mintTokenPresale(data_[i], valueRemaining); totalPurchased += data_[i].quantity; } } if(msg.sender != tx.origin) { //unfortunately for botters (and some people using CA wallets) this costs some extra gas to enforce totalPurchased += _purchasedByOriginPerBlock[tx.origin][block.number]; _purchasedByOriginPerBlock[tx.origin][block.number] = totalPurchased; } require(totalPurchased < 1+MAX_PER_TX, "TOO_MANY"); } function factoryCanMint(uint256 _optionId) public view virtual override publicStarted notPaused returns (bool) { uint256 packTier = _optionId % _tierCount; uint256 quantity = 1 + (_optionId / _tierCount)*2; mintTier memory tier = _packTiers[packTier]; uint256 _firstID = tier.startIndex + tier.nextIDPlusOne - 1; if (tokenFactory == address(0) || _firstID + quantity > tier.endIndex + 1) { return false; } return true; } function factoryMint(uint256 _optionId, address _to) public override nonReentrant onlyFactory canMint(_optionId) { uint256 packTier = _optionId % _tierCount; uint256 quantity = 1 + (_optionId / _tierCount)*2; mintTokenBase(packTier, quantity, 0, 0, _to); } function mintTokenSimple(uint256 tierID_, uint256 quantity_) external payable publicStarted { require(quantity_ < MAX_PER_TX+1, "TOO_MANY"); uint256 price = tierPrice(tierID_); mintTokenBase(tierID_, quantity_, msg.value, price, msgSender()); } function mintTokenBase(uint256 tierID_, uint256 quantity_, uint256 valueRemaining, uint256 price, address recipient) internal notPaused returns (uint256 cost) { require(tierID_ < _tierCount, "BAD_TIER"); mintTier memory tier = _packTiers[tierID_]; uint256 finalPrice = price * quantity_; require(valueRemaining+1 > finalPrice, "LOW_PAY"); uint256 _firstID = tier.startIndex + tier.nextIDPlusOne - 1; require(_firstID + quantity_ - 1 < tier.endIndex + 1, "TOO_MANY"); for(uint256 i = 0; i < quantity_; i++) { _safeMint(recipient, _firstID, ""); _firstID++; } tier.nextIDPlusOne += uint32(quantity_); _packTiers[tierID_] = tier; return finalPrice; } function mintTokenPresale(purchaseData memory data_, uint256 valueRemaining_) internal validSignature(data_) returns (uint256 valueRemaining) { require(data_.tierID < _tierCount, "BAD_TIER"); uint quantityMintable = 0; for(uint i = 0; i < _whitelistBits.length && quantityMintable < data_.quantity; i++) { uint256 wlBitBlock = _whitelistBits[i]; if(data_.whitelistBits[i] & wlBitBlock > 0) { wlBitBlock = wlBitBlock &~ data_.whitelistBits[i]; quantityMintable++; _whitelistBits[i] = wlBitBlock; } } require(quantityMintable >= data_.quantity, "TOO_MANY_WL"); uint256 price = tierWLPrice(data_.tierID); return mintTokenBase(data_.tierID, data_.quantity, valueRemaining_, price, msgSender()); } function getPreMintRemaingSlotsCount(uint256[] calldata whitelistBits) external view returns (uint) { uint quantityMintable = 0; for(uint i = 0; i < _whitelistBits.length; i++) { uint256 wlBitBlock = _whitelistBits[i]; if(whitelistBits[i] & wlBitBlock > 0) { quantityMintable++; } } return quantityMintable; } /** * @dev Allows users to deny default approval addresses such as OpenSea */ function toggleOpenSeaApproval(bool revoked) external { _revokedDefaultPermissions[msg.sender] = revoked; } /** * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings. */ function isApprovedForAll(address owner, address operator) override public view returns (bool) { // Whitelist OpenSea proxy contract for easy trading. ProxyRegistry proxyRegistry = ProxyRegistry(_openSeaProxy); if (!_revokedDefaultPermissions[owner] && address(proxyRegistry.proxies(owner)) == operator) { return true; } return super.isApprovedForAll(owner, operator); } /** * Override to handle locked presales */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view override returns (bool) { require(_exists(tokenId), "BAD_ID"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } function withdrawEther(address recipient) external onlyOwner { address payable _this = payable(address(this)); require(_this.balance > 0, "NO_ETHER"); (bool success, ) = recipient.call{value: _this.balance}(""); require(success, "SEND_FAILED"); //Address: unable to send value, recipient may have reverted } function setTokenApprovalsForOwner(IToken token_) external onlyOwner { token_.approve(owner(), ERC721.MAX_UINT); } function contractURI() public view returns (string memory) { return _contractMetadataURI; } } interface ITokenFactory { function setBaseOptionURI(string[] memory _baseOptionURIs) external; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"proxy","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FactoryCannotMint","type":"error"},{"inputs":[],"name":"NotTokenFactory","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FINNEY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_UINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_packTiers","outputs":[{"internalType":"uint8","name":"tierIndex","type":"uint8"},{"internalType":"uint32","name":"finneyPrice","type":"uint32"},{"internalType":"uint32","name":"startIndex","type":"uint32"},{"internalType":"uint32","name":"endIndex","type":"uint32"},{"internalType":"uint32","name":"nextIDPlusOne","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_publicStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tierCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_whiteListStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockCount","type":"uint256"}],"name":"addWhitelistBits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_optionId","type":"uint256"}],"name":"factoryCanMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_optionId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"factoryMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"whitelistBits","type":"uint256[]"}],"name":"getPreMintRemaingSlotsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"tierBaseURI_","type":"string[]"}],"name":"initializeTierURIs","outputs":[],"stateMutability":"nonpayable","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":[{"components":[{"internalType":"uint256","name":"tierID","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"enum purchaseType","name":"purchaseType","type":"uint8"},{"internalType":"uint256[]","name":"whitelistBits","type":"uint256[]"},{"internalType":"uint256[]","name":"freeMintIDs","type":"uint256[]"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"internalType":"struct purchaseData[]","name":"data_","type":"tuple[]"}],"name":"mintTokenComplex","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tierID_","type":"uint256"},{"internalType":"uint256","name":"quantity_","type":"uint256"}],"name":"mintTokenSimple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prepReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start_","type":"uint256"},{"internalType":"uint256","name":"count_","type":"uint256"},{"internalType":"uint256","name":"tierID_","type":"uint256"},{"internalType":"address[]","name":"freebieAddresses_","type":"address[]"}],"name":"primeThePump","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"remainingItems","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"tierID","type":"uint256"},{"internalType":"uint256","name":"remaining","type":"uint256"},{"internalType":"uint256","name":"weiPrice","type":"uint256"},{"internalType":"uint256","name":"wlWeiPrice","type":"uint256"}],"internalType":"struct remainingNFTData[]","name":"remaining","type":"tuple[]"},{"internalType":"uint256","name":"whiteListStartTimestamp","type":"uint256"},{"internalType":"uint256","name":"publicStartTimestamp","type":"uint256"},{"internalType":"bool","name":"revealed","type":"bool"}],"internalType":"struct webData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"setAllowListSigningAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setContractMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"whiteListStart_","type":"uint256"},{"internalType":"uint256","name":"publicStart_","type":"uint256"}],"name":"setDropTimestamps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITokenFactory","name":"factory","type":"address"}],"name":"setOSFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"tierIndex","type":"uint8"},{"internalType":"uint32","name":"finneyPrice","type":"uint32"},{"internalType":"uint32","name":"startIndex","type":"uint32"},{"internalType":"uint32","name":"endIndex","type":"uint32"},{"internalType":"uint32","name":"nextIDPlusOne","type":"uint32"}],"internalType":"struct mintTier[]","name":"tiers","type":"tuple[]"}],"name":"setPackTiers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintTierIndex","type":"uint256"},{"internalType":"uint32","name":"newEndIndex","type":"uint32"}],"name":"setReducedPackTier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IToken","name":"token_","type":"address"}],"name":"setTokenApprovalsForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"revoked","type":"bool"}],"name":"toggleOpenSeaApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000805460ff1990811690915560001960138190556014556019805490911690553480156200003257600080fd5b50604051620050c9380380620050c98339810160408190526200005591620004ab565b82826200006233620000c3565b81516200007790600490602085019062000338565b5080516200008d90600590602084019062000338565b50506001600a5550601680546001600160a01b0319166001600160a01b038316179055620000ba62000115565b5050506200059f565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160a0810182526000808252604f6020808401918252838501838152610d046060860190815260016080808801828152600f8054808501825590895298517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8029099018054975195519451915160ff909a1664ffffffffff199098169790971761010063ffffffff9687160217600160281b600160681b031916650100000000009486169490940263ffffffff60481b1916939093176901000000000000000000938516939093029290921763ffffffff60681b19166d0100000000000000000000000000939097169290920295909517909255600e8054928301815583528451938401909452605c8084527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd90910193919291620050109083013980516200026893925060209091019062000338565b506040518060800160405280605d81526020016200506c605d913980516200029991600d9160209091019062000338565b506001600b55610d05600c5563624221d06014556362437350601355601080546001600160a01b031916738e69cac0dbfe68befca549f817f8ee86c053deeb17905560005b600e8110156200033557601580546001810182556000919091526000197f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47590910155806200032c8162000538565b915050620002de565b50565b828054620003469062000562565b90600052602060002090601f0160209004810192826200036a5760008555620003b5565b82601f106200038557805160ff1916838001178555620003b5565b82800160010185558215620003b5579182015b82811115620003b557825182559160200191906001019062000398565b50620003c3929150620003c7565b5090565b5b80821115620003c35760008155600101620003c8565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200040657600080fd5b81516001600160401b0380821115620004235762000423620003de565b604051601f8301601f19908116603f011681019082821181831017156200044e576200044e620003de565b816040528381526020925086838588010111156200046b57600080fd5b600091505b838210156200048f578582018301518183018401529082019062000470565b83821115620004a15760008385830101525b9695505050505050565b600080600060608486031215620004c157600080fd5b83516001600160401b0380821115620004d957600080fd5b620004e787838801620003f4565b94506020860151915080821115620004fe57600080fd5b506200050d86828701620003f4565b604086015190935090506001600160a01b03811681146200052d57600080fd5b809150509250925092565b60006000198214156200055b57634e487b7160e01b600052601160045260246000fd5b5060010190565b600181811c908216806200057757607f821691505b602082108114156200059957634e487b7160e01b600052602260045260246000fd5b50919050565b614a6180620005af6000396000f3fe60806040526004361061031a5760003560e01c8063715018a6116101ab578063c0a14a44116100f7578063e77772fe11610095578063e96f5aa61161006f578063e96f5aa61461093b578063e985e9c51461095b578063f2fde38b1461097b578063f43a22dc1461099b57600080fd5b8063e77772fe146108f1578063e8a3d48514610911578063e910d1c71461092657600080fd5b8063d997cb6a116100d1578063d997cb6a1461086f578063df878a7414610885578063e3cd2863146108c0578063e5b5019a146108db57600080fd5b8063c0a14a441461080f578063c87b56dd1461082f578063d69eef141461084f57600080fd5b8063a22cb46511610164578063a77c34a11161013e578063a77c34a114610799578063af933b57146107af578063b88d4fde146107cf578063be07dace146107ef57600080fd5b8063a22cb46514610744578063a475b5dd14610764578063a48a77841461077957600080fd5b8063715018a61461066557806376ae5dcf1461067a5780638d9ff4c51461069a5780638da5cb5b146106f157806395d89b411461070f578063a201fc501461072457600080fd5b80632c54c2bb1161026a5780633fee935f11610223578063512af50e116101fd578063512af50e146105f25780635c4b8d86146106125780636352211e1461062557806370a082311461064557600080fd5b80633fee935f1461059257806342842e0e146105b25780634929c778146105d257600080fd5b80632c54c2bb146104d65780632d0335ab146104f6578063306769721461052c5780633408e4701461053f5780633b82b3e4146105525780633ddb66491461057257600080fd5b806313590df6116102d75780631fd37db3116102b15780631fd37db31461046957806320379ee51461048b57806322f4596f146104a057806323b872dd146104b657600080fd5b806313590df61461041057806316c38b3c1461043457806318160ddd1461045457600080fd5b806301ffc9a71461031f57806306fdde0314610354578063081812fc14610376578063095ea7b3146103ae5780630c53c51c146103d05780630f7e5970146103e3575b600080fd5b34801561032b57600080fd5b5061033f61033a366004613b5a565b6109b0565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b50610369610a02565b60405161034b9190613bcf565b34801561038257600080fd5b50610396610391366004613be2565b610a94565b6040516001600160a01b03909116815260200161034b565b3480156103ba57600080fd5b506103ce6103c9366004613c10565b610b0a565b005b6103696103de366004613d34565b610baa565b3480156103ef57600080fd5b50610369604051806040016040528060018152602001603160f81b81525081565b34801561041c57600080fd5b5061042660135481565b60405190815260200161034b565b34801561044057600080fd5b506103ce61044f366004613db9565b610d60565b34801561046057600080fd5b50610426610d9d565b34801561047557600080fd5b5061047e610e0a565b60405161034b9190613dd6565b34801561049757600080fd5b50600154610426565b3480156104ac57600080fd5b50610426600c5481565b3480156104c257600080fd5b506103ce6104d1366004613e6e565b610f66565b3480156104e257600080fd5b506103ce6104f1366004613eaf565b610fb6565b34801561050257600080fd5b50610426610511366004613eaf565b6001600160a01b031660009081526002602052604090205490565b6103ce61053a366004613f17565b611002565b34801561054b57600080fd5b5046610426565b34801561055e57600080fd5b506103ce61056d366004613f58565b6112bd565b34801561057e57600080fd5b506103ce61058d366004613eaf565b611346565b34801561059e57600080fd5b506103ce6105ad366004613f17565b611407565b3480156105be57600080fd5b506103ce6105cd366004613e6e565b611554565b3480156105de57600080fd5b506104266105ed366004613f17565b61156f565b3480156105fe57600080fd5b506103ce61060d366004613f8c565b6115ec565b6103ce610620366004613f58565b611785565b34801561063157600080fd5b50610396610640366004613be2565b61180c565b34801561065157600080fd5b50610426610660366004613eaf565b61185d565b34801561067157600080fd5b506103ce6118f8565b34801561068657600080fd5b506103ce610695366004613be2565b61192e565b3480156106a657600080fd5b506106ba6106b5366004613be2565b6119ad565b6040805160ff909616865263ffffffff9485166020870152928416928501929092528216606084015216608082015260a00161034b565b3480156106fd57600080fd5b506003546001600160a01b0316610396565b34801561071b57600080fd5b506103696119fb565b34801561073057600080fd5b506103ce61073f366004613fbc565b611a0a565b34801561075057600080fd5b506103ce61075f36600461402d565b611a40565b34801561077057600080fd5b506103ce611a4b565b34801561078557600080fd5b506103ce61079436600461405b565b611b8d565b3480156107a557600080fd5b50610426600b5481565b3480156107bb57600080fd5b506103ce6107ca366004613eaf565b611ef4565b3480156107db57600080fd5b506103ce6107ea3660046140bb565b611ff3565b3480156107fb57600080fd5b506103ce61080a366004614126565b612044565b34801561081b57600080fd5b506103ce61082a366004613eaf565b612138565b34801561083b57600080fd5b5061036961084a366004613be2565b612184565b34801561085b57600080fd5b5061033f61086a366004613be2565b612369565b34801561087b57600080fd5b5061042660145481565b34801561089157600080fd5b506103ce6108a0366004613db9565b336000908152601760205260409020805460ff1916911515919091179055565b3480156108cc57600080fd5b5061042666038d7ea4c6800081565b3480156108e757600080fd5b5061042660001981565b3480156108fd57600080fd5b50600954610396906001600160a01b031681565b34801561091d57600080fd5b50610369612510565b34801561093257600080fd5b506103ce61251f565b34801561094757600080fd5b506103ce61095636600461414b565b61256f565b34801561096757600080fd5b5061033f6109763660046141ad565b61284f565b34801561098757600080fd5b506103ce610996366004613eaf565b612939565b3480156109a757600080fd5b50610426600581565b60006001600160e01b031982166380ac58cd60e01b14806109e157506001600160e01b03198216635b5e139f60e01b145b806109fc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610a11906141db565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3d906141db565b8015610a8a5780601f10610a5f57610100808354040283529160200191610a8a565b820191906000526020600020905b815481529060010190602001808311610a6d57829003601f168201915b5050505050905090565b60008181526006602052604081205460016001600160a01b0390911611610aee5760405162461bcd60e51b81526020600482015260096024820152682120a22faa27a5a2a760b91b60448201526064015b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610b158261180c565b9050806001600160a01b0316836001600160a01b03161415610b635760405162461bcd60e51b81526020600482015260076024820152661253959053125160ca1b6044820152606401610ae5565b336001600160a01b0382161480610b7f5750610b7f813361284f565b610b9b5760405162461bcd60e51b8152600401610ae590614216565b610ba583836129b1565b505050565b60408051606081810183526001600160a01b03881660008181526002602090815290859020548452830152918101869052610be88782878787612a1f565b610c215760405162461bcd60e51b815260206004820152600a6024820152692120a22fa9a4a3a722a960b11b6044820152606401610ae5565b6001600160a01b038716600090815260026020526040902054610c45906001612af2565b6001600160a01b0388166000908152600260205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610c9590899033908a90614239565b60405180910390a1600080306001600160a01b0316888a604051602001610cbd92919061426e565b60408051601f1981840301815290829052610cd7916142a5565b6000604051808303816000865af19150503d8060008114610d14576040519150601f19603f3d011682016040523d82523d6000602084013e610d19565b606091505b509150915081610d545760405162461bcd60e51b815260206004820152600660248201526511905253115160d21b6044820152606401610ae5565b98975050505050505050565b6003546001600160a01b03163314610d8a5760405162461bcd60e51b8152600401610ae590614216565b6019805460ff1916911515919091179055565b600080805b600b54811015610df657600f8181548110610dbf57610dbf6142c1565b600091825260209091200154610de290600160681b900463ffffffff16836142ed565b915080610dee81614305565b915050610da2565b50600b54610e049082614320565b91505090565b610e3760405180608001604052806060815260200160008152602001600081526020016000151581525090565b6000600b546001600160401b03811115610e5357610e53613c3c565b604051908082528060200260200182016040528015610eaf57816020015b610e9c6040518060800160405280600081526020016000815260200160008152602001600081525090565b815260200190600190039081610e715790505b50905060005b600b54811015610f3a576000610eca82612b05565b90506000610ed783612baf565b90506000610ee484612baf565b9050604051806080016040528085815260200184815260200183815260200182815250858581518110610f1957610f196142c1565b60200260200101819052505050508080610f3290614305565b915050610eb5565b506040805160808101825291825260145460208301526013549082015260125415156060820152919050565b610f703382612c36565b610fab5760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b6044820152606401610ae5565b610ba5838383612cde565b6003546001600160a01b03163314610fe05760405162461bcd60e51b8152600401610ae590614216565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b346000805b83811015611240576000858583818110611023576110236142c1565b9050602002810190611035919061434d565b611046906060810190604001614372565b600281111561105757611057614337565b141561117057426013541161109a5760405162461bcd60e51b81526020600482015260096024820152681393d517d4d510549560ba1b6044820152606401610ae5565b60006110c98686848181106110b1576110b16142c1565b90506020028101906110c3919061434d565b35612baf565b905061112a8686848181106110e0576110e06142c1565b90506020028101906110f2919061434d565b35878785818110611105576111056142c1565b9050602002810190611117919061434d565b602001358684611125612dc6565b612e23565b6111349085614320565b9350858583818110611148576111486142c1565b905060200281019061115a919061434d565b6111689060200135846142ed565b92505061122e565b60145442118015611182575060135442105b6111b75760405162461bcd60e51b81526020600482015260066024820152651393d517d5d360d21b6044820152606401610ae5565b6111ed8585838181106111cc576111cc6142c1565b90506020028101906111de919061434d565b6111e790614401565b846130d8565b6111f79084614320565b925084848281811061120b5761120b6142c1565b905060200281019061121d919061434d565b61122b9060200135836142ed565b91505b8061123881614305565b915050611007565b5033321461128d5732600090815260186020908152604080832043845290915290205461126d90826142ed565b326000908152601860209081526040808320438452909152902081905590505b611299600560016142ed565b81106112b75760405162461bcd60e51b8152600401610ae5906144b8565b50505050565b6003546001600160a01b031633146112e75760405162461bcd60e51b8152600401610ae590614216565b6112ef610d9d565b1580611308575042601354118015611308575042601454115b61133e5760405162461bcd60e51b815260206004820152600760248201526614d5105495115160ca1b6044820152606401610ae5565b601355601455565b6003546001600160a01b031633146113705760405162461bcd60e51b8152600401610ae590614216565b806001600160a01b031663095ea7b36113916003546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260001960248201526044016020604051808303816000875af11580156113df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140391906144da565b5050565b6003546001600160a01b031633146114315760405162461bcd60e51b8152600401610ae590614216565b600b54811461146d5760405162461bcd60e51b81526020600482015260086024820152674241445f5552495360c01b6044820152606401610ae5565b60005b600b548110156114db5782828281811061148c5761148c6142c1565b905060200281019061149e91906144f7565b600e83815481106114b1576114b16142c1565b9060005260206000200191906114c8929190613a01565b50806114d381614305565b915050611470565b506009546001600160a01b0316611403576009546040516340e1397f60e01b81526001600160a01b03909116906340e1397f9061151e9085908590600401614566565b600060405180830381600087803b15801561153857600080fd5b505af115801561154c573d6000803e3d6000fd5b505050505050565b610ba583838360405180602001604052806000815250611ff3565b600080805b6015548110156115e457600060158281548110611593576115936142c1565b906000526020600020015490506000818787858181106115b5576115b56142c1565b905060200201351611156115d157826115cd81614305565b9350505b50806115dc81614305565b915050611574565b509392505050565b6003546001600160a01b031633146116165760405162461bcd60e51b8152600401610ae590614216565b601254156116365760405162461bcd60e51b8152600401610ae590614600565b6000600f838154811061164b5761164b6142c1565b60009182526020918290206040805160a081018252919092015460ff8116825263ffffffff6101008204811694830194909452600160281b81048416928201839052600160481b810484166060830152600160681b90048316608082015292509083161180156116ca57508163ffffffff16816060015163ffffffff16115b6116e65760405162461bcd60e51b8152600401610ae590614622565b81600f84815481106116fa576116fa6142c1565b60009182526020822001805463ffffffff93909316600160481b0263ffffffff60481b19909316929092179091556040820151606083015161173c9190614644565b63ffffffff16905060008260400151846117569190614644565b63ffffffff1690506117688183614320565b600c60008282546117799190614320565b90915550505050505050565b42601354106117c65760405162461bcd60e51b815260206004820152600d60248201526c4245464f52455f5055424c494360981b6044820152606401610ae5565b6117d2600560016142ed565b81106117f05760405162461bcd60e51b8152600401610ae5906144b8565b60006117fb83612baf565b90506112b783833484611125612dc6565b6000818152600660205260408120546001600160a01b0316600181116109fc5760405162461bcd60e51b815260206004820152600660248201526510905117d25160d21b6044820152606401610ae5565b600060016001600160a01b03831611156118a55760405162461bcd60e51b81526020600482015260096024820152684241445f515545525960b81b6044820152606401610ae5565b6000805b600c548110156118f1576000818152600660205260409020546001600160a01b03858116911614156118e1576118de82614305565b91505b6118ea81614305565b90506118a9565b5092915050565b6003546001600160a01b031633146119225760405162461bcd60e51b8152600401610ae590614216565b61192c600061339f565b565b6003546001600160a01b031633146119585760405162461bcd60e51b8152600401610ae590614216565b60005b8181101561140357601580546001810182556000919091526000197f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47590910155806119a581614305565b91505061195b565b600f81815481106119bd57600080fd5b60009182526020909120015460ff8116915063ffffffff6101008204811691600160281b8104821691600160481b8204811691600160681b90041685565b606060058054610a11906141db565b6003546001600160a01b03163314611a345760405162461bcd60e51b8152600401610ae590614216565b610ba5600d8383613a01565b6114033383836133f1565b6003546001600160a01b03163314611a755760405162461bcd60e51b8152600401610ae590614216565b60125415611a955760405162461bcd60e51b8152600401610ae590614600565b601154611aa390600a6142ed565b40611ade5760405162461bcd60e51b815260206004820152600b60248201526a10d0539517d4915591505360aa1b6044820152606401610ae5565b601154611aec9060146142ed565b40611b275760405162461bcd60e51b815260206004820152600b60248201526a10d0539517d4915591505360aa1b6044820152606401610ae5565b601154611b359060146142ed565b40601154600f611b4591906142ed565b40601154600a611b5591906142ed565b60408051602081019490945283019190915240606082015260800160408051601f198184030181529190528051602090910120601255565b6003546001600160a01b03163314611bb75760405162461bcd60e51b8152600401610ae590614216565b6000600f8481548110611bcc57611bcc6142c1565b60009182526020918290206040805160a081018252919092015460ff8116825263ffffffff6101008204811694830194909452600160281b8104841692820192909252600160481b820483166060820152600160681b90910490911660808201529050611c3a8660016142ed565b816040015163ffffffff1610611c805760405162461bcd60e51b815260206004820152600b60248201526a2727aa2fa4a72faa24a2a960a91b6044820152606401610ae5565b6002611c8c86886142ed565b611c969190614320565b816060015163ffffffff1611611cdc5760405162461bcd60e51b815260206004820152600b60248201526a2727aa2fa4a72faa24a2a960a91b6044820152606401610ae5565b855b611ce886886142ed565b811015611e1e57611cf983886142ed565b8110611d79576000818152600660205260409020546001600160a01b031615611d555760405162461bcd60e51b815260206004820152600e60248201526d125117d25392551250531256915160921b6044820152606401610ae5565b600081815260066020526040902080546001600160a01b0319166001179055611e0c565b816040015163ffffffff168714611dc35760405162461bcd60e51b815260206004820152600e60248201526d10905117d194915150925157d25160921b6044820152606401610ae5565b611e0c8484611dd28a85614320565b818110611de157611de16142c1565b9050602002016020810190611df69190613eaf565b82604051806020016040528060008152506134b2565b80611e1681614305565b915050611cde565b50608081018051839190611e33908390614669565b63ffffffff16905250600f805482919086908110611e5357611e536142c1565b6000918252602091829020835191018054928401516040850151606086015160809096015160ff90941664ffffffffff199095169490941761010063ffffffff92831602176cffffffffffffffff00000000001916600160281b9482169490940263ffffffff60481b191693909317600160481b948416949094029390931763ffffffff60681b1916600160681b9290911691909102179055505050505050565b6003546001600160a01b03163314611f1e5760405162461bcd60e51b8152600401610ae590614216565b308031611f585760405162461bcd60e51b81526020600482015260086024820152672727afa2aa2422a960c11b6044820152606401610ae5565b6000826001600160a01b0316826001600160a01b03163160405160006040518083038185875af1925050503d8060008114611faf576040519150601f19603f3d011682016040523d82523d6000602084013e611fb4565b606091505b5050905080610ba55760405162461bcd60e51b815260206004820152600b60248201526a14d1539117d1905253115160aa1b6044820152606401610ae5565b611ffd3383612c36565b6120385760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b6044820152606401610ae5565b6112b7848484846134e5565b6002600a5414156120835760405162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b6044820152606401610ae5565b6002600a556009546001600160a01b0316336001600160a01b0316146120bc576040516308e5c1fd60e21b815260040160405180910390fd5b816120c681612369565b6120e357604051633e24282f60e21b815260040160405180910390fd5b6000600b54846120f391906146a7565b90506000600b548561210591906146bb565b6121109060026146cf565b61211b9060016142ed565b905061212b828260008088612e23565b50506001600a5550505050565b6003546001600160a01b031633146121625760405162461bcd60e51b8152600401610ae590614216565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60008181526006602052604090205460609060016001600160a01b03909116116121dd5760405162461bcd60e51b815260206004820152600a6024820152691253959053125117d25160b21b6044820152606401610ae5565b60006121e883613518565b90506000600e826000015160ff1681548110612206576122066142c1565b90600052602060002001805461221b906141db565b80601f0160208091040260200160405190810160405280929190818152602001828054612247906141db565b80156122945780601f1061226957610100808354040283529160200191612294565b820191906000526020600020905b81548152906001019060200180831161227757829003601f168201915b50505050509050601254600014156122cf57806040516020016122b791906146ee565b60405160208183030381529060405292505050919050565b6000826040015163ffffffff16856122e79190614320565b9050826040015183606001516122fd9190614644565b63ffffffff168160125461231191906142ed565b61231b91906146a7565b9050826040015163ffffffff168161233391906142ed565b90508161233f8261365d565b604051602001612350929190614719565b6040516020818303038152906040529350505050919050565b600042601354106123ac5760405162461bcd60e51b815260206004820152600d60248201526c4245464f52455f5055424c494360981b6044820152606401610ae5565b60195460ff16156123e85760405162461bcd60e51b815260206004820152600660248201526514105554d15160d21b6044820152606401610ae5565b6000600b54836123f891906146a7565b90506000600b548461240a91906146bb565b6124159060026146cf565b6124209060016142ed565b90506000600f8381548110612437576124376142c1565b600091825260208083206040805160a081018252919093015460ff8116825263ffffffff6101008204811693830193909352600160281b81048316938201849052600160481b810483166060830152600160681b9004909116608082018190529093506001916124a79190614669565b6124b19190614644565b60095463ffffffff9190911691506001600160a01b031615806124f1575060608201516124df906001614669565b63ffffffff166124ef84836142ed565b115b156125025750600095945050505050565b60019450505050505b919050565b6060600d8054610a11906141db565b6003546001600160a01b031633146125495760405162461bcd60e51b8152600401610ae590614216565b601254156125695760405162461bcd60e51b8152600401610ae590614600565b43601155565b6003546001600160a01b031633146125995760405162461bcd60e51b8152600401610ae590614216565b6125a1610d9d565b15806125ba5750426013541180156125ba575042601454115b6125f05760405162461bcd60e51b815260206004820152600760248201526614d5105495115160ca1b6044820152606401610ae5565b6000805b828110156127c6578084848381811061260f5761260f6142c1565b61262592602060a090920201908101915061475d565b60ff16146126615760405162461bcd60e51b81526020600482015260096024820152680848288be929c888ab60bb1b6044820152606401610ae5565b600b548110156126b45783838281811061267d5761267d6142c1565b905060a00201600f8281548110612696576126966142c1565b9060005260206000200181816126ac9190614787565b905050612744565b600f8484838181106126c8576126c86142c1565b83546001810185556000948552602090942060a090910292909201929190910190506126f48282614787565b5050600e80546001810182556000918252604080516020810191829052839052612742927fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd90920191613a85565b505b838382818110612756576127566142c1565b905060a00201604001602081019061276e919061486a565b848483818110612780576127806142c1565b905060a002016060016020810190612798919061486a565b6127a29190614644565b6127b29063ffffffff16836142ed565b9150806127be81614305565b9150506125f4565b505b600f5482101561284357600f8054806127e3576127e3614887565b6000828152602090208101600019908101805470ffffffffffffffffffffffffffffffffff19169055019055600e80548061282057612820614887565b60019003818190600052602060002001600061283c9190613af9565b90556127c8565b600b91909155600c5550565b6016546001600160a01b038381166000908152601760205260408120549092919091169060ff161580156128f8575060405163c455279160e01b81526001600160a01b038581166004830152808516919083169063c455279190602401602060405180830381865afa1580156128c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ed919061489d565b6001600160a01b0316145b156129075760019150506109fc565b6001600160a01b0380851660009081526008602090815260408083209387168352929052205460ff165b949350505050565b6003546001600160a01b031633146129635760405162461bcd60e51b8152600401610ae590614216565b6001600160a01b0381166129a55760405162461bcd60e51b81526020600482015260096024820152682120a22fa7aba722a960b91b6044820152606401610ae5565b6129ae8161339f565b50565b600081815260076020526040902080546001600160a01b0319166001600160a01b03841690811790915581906129e68261180c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b038616612a685760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610ae5565b6001612a7b612a768761375a565b6137d7565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612ac9573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6000612afe82846142ed565b9392505050565b600080600f8381548110612b1b57612b1b6142c1565b60009182526020918290206040805160a081018252919092015460ff8116825263ffffffff6101008204811694830194909452600160281b81048416928201839052600160481b8104841660608301819052600160681b9091049093166080820181905290935091612b8d9190614644565b612b979190614644565b612ba2906002614669565b63ffffffff169392505050565b600080600f8381548110612bc557612bc56142c1565b60009182526020918290206040805160a081018252929091015460ff8116835263ffffffff61010082048116948401859052600160281b8204811692840192909252600160481b810482166060840152600160681b90041660808201529150612afe9066038d7ea4c68000906146cf565b60008181526006602052604081205460016001600160a01b0390911611612c885760405162461bcd60e51b815260206004820152600660248201526510905117d25160d21b6044820152606401610ae5565b6000612c938361180c565b9050806001600160a01b0316846001600160a01b03161480612cce5750836001600160a01b0316612cc384610a94565b6001600160a01b0316145b806129315750612931818561284f565b826001600160a01b0316612cf18261180c565b6001600160a01b031614612d175760405162461bcd60e51b8152600401610ae590614216565b60016001600160a01b03831611612d5f5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610ae5565b612d6a6000826129b1565b60008181526006602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600033301415612e1d57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150612e209050565b50335b90565b60195460009060ff1615612e625760405162461bcd60e51b815260206004820152600660248201526514105554d15160d21b6044820152606401610ae5565b600b548610612e835760405162461bcd60e51b8152600401610ae590614622565b6000600f8781548110612e9857612e986142c1565b600091825260208083206040805160a081018252919093015460ff8116825263ffffffff6101008204811693830193909352600160281b8104831693820193909352600160481b830482166060820152600160681b9092041660808201529150612f0287866146cf565b905080612f108760016142ed565b11612f475760405162461bcd60e51b81526020600482015260076024820152664c4f575f50415960c81b6044820152606401610ae5565b6000600183608001518460400151612f5f9190614669565b612f699190614644565b63ffffffff16905082606001516001612f829190614669565b63ffffffff166001612f948a846142ed565b612f9e9190614320565b10612fbb5760405162461bcd60e51b8152600401610ae5906144b8565b60005b8881101561300057612fe08683604051806020016040528060008152506134b2565b81612fea81614305565b9250508080612ff890614305565b915050612fbe565b5087836080018181516130139190614669565b63ffffffff16905250600f80548491908b908110613033576130336142c1565b6000918252602091829020835191018054928401516040850151606086015160809096015160ff90941664ffffffffff199095169490941761010063ffffffff92831602176cffffffffffffffff00000000001916600160281b9482169490940263ffffffff60481b191693909317600160481b948416949094029390931763ffffffff60681b1916600160681b929091169190910217905550979650505050505050565b60008281816040015160028111156130f2576130f2614337565b1461323c57606060028260400151600281111561311157613111614337565b141561314457606082015160405161312e919033906020016148ed565b6040516020818303038152906040529050613170565b8151608083015160405161315e929190339060200161492c565b60405160208183030381529060405290505b6000818051906020012090506001818460e001518560a001518660c00151604051600081526020016040526040516131c4949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156131e6573d6000803e3d6000fd5b5050604051601f1901516010546001600160a01b0390811691161490506132395760405162461bcd60e51b815260206004820152600760248201526609c9ebe82aaa8960cb1b6044820152606401610ae5565b50505b600b5484511061325e5760405162461bcd60e51b8152600401610ae590614622565b6000805b601554811080156132765750856020015182105b1561332a57600060158281548110613290576132906142c1565b90600052602060002001549050600081886060015184815181106132b6576132b66142c1565b602002602001015116111561331757866060015182815181106132db576132db6142c1565b6020026020010151198116905082806132f390614305565b935050806015838154811061330a5761330a6142c1565b6000918252602090912001555b508061332281614305565b915050613262565b50846020015181101561336d5760405162461bcd60e51b815260206004820152600b60248201526a1513d3d7d350539657d5d360aa1b6044820152606401610ae5565b600061337c8660000151612baf565b9050613395866000015187602001518784611125612dc6565b9695505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156134455760405162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f415050524f564560881b6044820152606401610ae5565b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6134bc8383613807565b6134c96000848484613903565b610ba55760405162461bcd60e51b8152600401610ae590614972565b6134f0848484612cde565b6134fc84848484613903565b6112b75760405162461bcd60e51b8152600401610ae590614972565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a08101825260008082526020820181905291810182905260608101829052608081019190915260005b600b5481101561362757600f818154811061358e5761358e6142c1565b60009182526020918290206040805160a081018252919092015460ff8116825263ffffffff6101008204811694830194909452600160281b81048416928201839052600160481b810484166060830152600160681b900490921660808301529092508410801590613609575083826060015163ffffffff1610155b15613615575092915050565b8061361f81614305565b915050613571565b5060405162461bcd60e51b815260206004820152600a6024820152691253959053125117d25160b21b6044820152606401610ae5565b6060816136815750506040805180820190915260018152600360fc1b602082015290565b8160005b81156136ab578061369581614305565b91506136a49050600a836146bb565b9150613685565b6000816001600160401b038111156136c5576136c5613c3c565b6040519080825280601f01601f1916602001820160405280156136ef576020820181803683370190505b5090505b841561293157613704600183614320565b9150613711600a866146a7565b61371c9060306142ed565b60f81b818381518110613731576137316142c1565b60200101906001600160f81b031916908160001a905350613753600a866146bb565b94506136f3565b60006040518060800160405280604381526020016149e960439139805160209182012083518483015160408087015180519086012090516137ba950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60006137e260015490565b60405161190160f01b60208201526022810191909152604281018390526062016137ba565b60016001600160a01b0383161161384f5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610ae5565b60008181526006602052604090205460016001600160a01b0390911611156138aa5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610ae5565b60008181526006602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156139f657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613947903390899088908890600401614998565b6020604051808303816000875af1925050508015613982575060408051601f3d908101601f1916820190925261397f918101906149cb565b60015b6139dc573d8080156139b0576040519150601f19603f3d011682016040523d82523d6000602084013e6139b5565b606091505b5080516139d45760405162461bcd60e51b8152600401610ae590614972565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612931565b506001949350505050565b828054613a0d906141db565b90600052602060002090601f016020900481019282613a2f5760008555613a75565b82601f10613a485782800160ff19823516178555613a75565b82800160010185558215613a75579182015b82811115613a75578235825591602001919060010190613a5a565b50613a81929150613b2f565b5090565b828054613a91906141db565b90600052602060002090601f016020900481019282613ab35760008555613a75565b82601f10613acc57805160ff1916838001178555613a75565b82800160010185558215613a75579182015b82811115613a75578251825591602001919060010190613ade565b508054613b05906141db565b6000825580601f10613b15575050565b601f0160209004906000526020600020908101906129ae91905b5b80821115613a815760008155600101613b30565b6001600160e01b0319811681146129ae57600080fd5b600060208284031215613b6c57600080fd5b8135612afe81613b44565b60005b83811015613b92578181015183820152602001613b7a565b838111156112b75750506000910152565b60008151808452613bbb816020860160208601613b77565b601f01601f19169290920160200192915050565b602081526000612afe6020830184613ba3565b600060208284031215613bf457600080fd5b5035919050565b6001600160a01b03811681146129ae57600080fd5b60008060408385031215613c2357600080fd5b8235613c2e81613bfb565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60405161010081016001600160401b0381118282101715613c7557613c75613c3c565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613ca357613ca3613c3c565b604052919050565b600082601f830112613cbc57600080fd5b81356001600160401b03811115613cd557613cd5613c3c565b613ce8601f8201601f1916602001613c7b565b818152846020838601011115613cfd57600080fd5b816020850160208301376000918101602001919091529392505050565b60ff811681146129ae57600080fd5b803561250b81613d1a565b600080600080600060a08688031215613d4c57600080fd5b8535613d5781613bfb565b945060208601356001600160401b03811115613d7257600080fd5b613d7e88828901613cab565b94505060408601359250606086013591506080860135613d9d81613d1a565b809150509295509295909350565b80151581146129ae57600080fd5b600060208284031215613dcb57600080fd5b8135612afe81613dab565b602080825282516080838301819052815160a0850181905260009392830191849160c08701905b80841015613e3b5784518051835286810151878401526040808201519084015260609081015190830152938501936001939093019290820190613dfd565b508488015160408801526040880151606088015260608801519450613e638288018615159052565b979650505050505050565b600080600060608486031215613e8357600080fd5b8335613e8e81613bfb565b92506020840135613e9e81613bfb565b929592945050506040919091013590565b600060208284031215613ec157600080fd5b8135612afe81613bfb565b60008083601f840112613ede57600080fd5b5081356001600160401b03811115613ef557600080fd5b6020830191508360208260051b8501011115613f1057600080fd5b9250929050565b60008060208385031215613f2a57600080fd5b82356001600160401b03811115613f4057600080fd5b613f4c85828601613ecc565b90969095509350505050565b60008060408385031215613f6b57600080fd5b50508035926020909101359150565b63ffffffff811681146129ae57600080fd5b60008060408385031215613f9f57600080fd5b823591506020830135613fb181613f7a565b809150509250929050565b60008060208385031215613fcf57600080fd5b82356001600160401b0380821115613fe657600080fd5b818501915085601f830112613ffa57600080fd5b81358181111561400957600080fd5b86602082850101111561401b57600080fd5b60209290920196919550909350505050565b6000806040838503121561404057600080fd5b823561404b81613bfb565b91506020830135613fb181613dab565b60008060008060006080868803121561407357600080fd5b85359450602086013593506040860135925060608601356001600160401b0381111561409e57600080fd5b6140aa88828901613ecc565b969995985093965092949392505050565b600080600080608085870312156140d157600080fd5b84356140dc81613bfb565b935060208501356140ec81613bfb565b92506040850135915060608501356001600160401b0381111561410e57600080fd5b61411a87828801613cab565b91505092959194509250565b6000806040838503121561413957600080fd5b823591506020830135613fb181613bfb565b6000806020838503121561415e57600080fd5b82356001600160401b038082111561417557600080fd5b818501915085601f83011261418957600080fd5b81358181111561419857600080fd5b86602060a08302850101111561401b57600080fd5b600080604083850312156141c057600080fd5b82356141cb81613bfb565b91506020830135613fb181613bfb565b600181811c908216806141ef57607f821691505b6020821081141561421057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b6001600160a01b0384811682528316602082015260606040820181905260009061426590830184613ba3565b95945050505050565b60008351614280818460208801613b77565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b600082516142b7818460208701613b77565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115614300576143006142d7565b500190565b6000600019821415614319576143196142d7565b5060010190565b600082821015614332576143326142d7565b500390565b634e487b7160e01b600052602160045260246000fd5b6000823560fe198336030181126142b757600080fd5b80356003811061250b57600080fd5b60006020828403121561438457600080fd5b612afe82614363565b600082601f83011261439e57600080fd5b813560206001600160401b038211156143b9576143b9613c3c565b8160051b6143c8828201613c7b565b92835284810182019282810190878511156143e257600080fd5b83870192505b84831015613e63578235825291830191908301906143e8565b6000610100823603121561441457600080fd5b61441c613c52565b823581526020830135602082015261443660408401614363565b604082015260608301356001600160401b038082111561445557600080fd5b6144613683870161438d565b6060840152608085013591508082111561447a57600080fd5b506144873682860161438d565b60808301525060a083013560a082015260c083013560c08201526144ad60e08401613d29565b60e082015292915050565b602080825260089082015267544f4f5f4d414e5960c01b604082015260600190565b6000602082840312156144ec57600080fd5b8151612afe81613dab565b6000808335601e1984360301811261450e57600080fd5b8301803591506001600160401b0382111561452857600080fd5b602001915036819003821315613f1057600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208082528181018390526000906040600585901b8401810190840186845b878110156145f357868403603f190183528135368a9003601e190181126145ab57600080fd5b890180356001600160401b038111156145c357600080fd5b8036038b13156145d257600080fd5b6145df868289850161453d565b955050509184019190840190600101614585565b5091979650505050505050565b602080825260089082015267149155915053115160c21b604082015260600190565b6020808252600890820152672120a22faa24a2a960c11b604082015260600190565b600063ffffffff83811690831681811015614661576146616142d7565b039392505050565b600063ffffffff808316818516808303821115614688576146886142d7565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b6000826146b6576146b6614691565b500690565b6000826146ca576146ca614691565b500490565b60008160001904831182151516156146e9576146e96142d7565b500290565b60008251614700818460208701613b77565b66191959985d5b1d60ca1b920191825250600701919050565b6000835161472b818460208801613b77565b6872657665616c65642f60b81b9083019081528351614751816009840160208801613b77565b01600901949350505050565b60006020828403121561476f57600080fd5b8135612afe81613d1a565b600081356109fc81613f7a565b813561479281613d1a565b60ff8116905081548160ff19821617835560208401356147b181613f7a565b64ffffffff008160081b169050808364ffffffffff1984161717845560408501356147db81613f7a565b68ffffffff00000000008160281b1690508368ffffffffffffffffff198416179350808483171785556060860135925061481483613f7a565b63ffffffff60481b8360481b1663ffffffff60481b19851683178217178555505050506114036148466080840161477a565b82805463ffffffff60681b191660689290921b63ffffffff60681b16919091179055565b60006020828403121561487c57600080fd5b8135612afe81613f7a565b634e487b7160e01b600052603160045260246000fd5b6000602082840312156148af57600080fd5b8151612afe81613bfb565b60008151602080840160005b838110156148e2578151875295820195908201906001016148c6565b509495945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152600061491f601c8301856148ba565b9283525050602001919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000815283601c8201526000614964603c8301856148ba565b928352505060200192915050565b6020808252600c908201526b2727aa2fa922a1a2a4ab22a960a11b604082015260600190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061339590830184613ba3565b6000602082840312156149dd57600080fd5b8151612afe81613b4456fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220a29abfee7d6730e7fd852e2c832c12b577327c0aacc557a3bcab8a0c8d7e82f864736f6c634300080b003368747470733a2f2f6f6e6a6f79726964652e6d7970696e6174612e636c6f75642f697066732f516d627858764c317253544859796533434e36683154424b6e7233614663544134704d754c4259533662566a426e2f746f6b656e732f68747470733a2f2f6f6e6a6f79726964652e6d7970696e6174612e636c6f75642f697066732f516d627858764c317253544859796533434e36683154424b6e7233614663544134704d754c4259533662566a426e2f636f6e7472616374000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000000000000000000000000000000000000000001c54656e6e6973204368616d70732047656e65736973205365726965730000000000000000000000000000000000000000000000000000000000000000000000064348414d50530000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061031a5760003560e01c8063715018a6116101ab578063c0a14a44116100f7578063e77772fe11610095578063e96f5aa61161006f578063e96f5aa61461093b578063e985e9c51461095b578063f2fde38b1461097b578063f43a22dc1461099b57600080fd5b8063e77772fe146108f1578063e8a3d48514610911578063e910d1c71461092657600080fd5b8063d997cb6a116100d1578063d997cb6a1461086f578063df878a7414610885578063e3cd2863146108c0578063e5b5019a146108db57600080fd5b8063c0a14a441461080f578063c87b56dd1461082f578063d69eef141461084f57600080fd5b8063a22cb46511610164578063a77c34a11161013e578063a77c34a114610799578063af933b57146107af578063b88d4fde146107cf578063be07dace146107ef57600080fd5b8063a22cb46514610744578063a475b5dd14610764578063a48a77841461077957600080fd5b8063715018a61461066557806376ae5dcf1461067a5780638d9ff4c51461069a5780638da5cb5b146106f157806395d89b411461070f578063a201fc501461072457600080fd5b80632c54c2bb1161026a5780633fee935f11610223578063512af50e116101fd578063512af50e146105f25780635c4b8d86146106125780636352211e1461062557806370a082311461064557600080fd5b80633fee935f1461059257806342842e0e146105b25780634929c778146105d257600080fd5b80632c54c2bb146104d65780632d0335ab146104f6578063306769721461052c5780633408e4701461053f5780633b82b3e4146105525780633ddb66491461057257600080fd5b806313590df6116102d75780631fd37db3116102b15780631fd37db31461046957806320379ee51461048b57806322f4596f146104a057806323b872dd146104b657600080fd5b806313590df61461041057806316c38b3c1461043457806318160ddd1461045457600080fd5b806301ffc9a71461031f57806306fdde0314610354578063081812fc14610376578063095ea7b3146103ae5780630c53c51c146103d05780630f7e5970146103e3575b600080fd5b34801561032b57600080fd5b5061033f61033a366004613b5a565b6109b0565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b50610369610a02565b60405161034b9190613bcf565b34801561038257600080fd5b50610396610391366004613be2565b610a94565b6040516001600160a01b03909116815260200161034b565b3480156103ba57600080fd5b506103ce6103c9366004613c10565b610b0a565b005b6103696103de366004613d34565b610baa565b3480156103ef57600080fd5b50610369604051806040016040528060018152602001603160f81b81525081565b34801561041c57600080fd5b5061042660135481565b60405190815260200161034b565b34801561044057600080fd5b506103ce61044f366004613db9565b610d60565b34801561046057600080fd5b50610426610d9d565b34801561047557600080fd5b5061047e610e0a565b60405161034b9190613dd6565b34801561049757600080fd5b50600154610426565b3480156104ac57600080fd5b50610426600c5481565b3480156104c257600080fd5b506103ce6104d1366004613e6e565b610f66565b3480156104e257600080fd5b506103ce6104f1366004613eaf565b610fb6565b34801561050257600080fd5b50610426610511366004613eaf565b6001600160a01b031660009081526002602052604090205490565b6103ce61053a366004613f17565b611002565b34801561054b57600080fd5b5046610426565b34801561055e57600080fd5b506103ce61056d366004613f58565b6112bd565b34801561057e57600080fd5b506103ce61058d366004613eaf565b611346565b34801561059e57600080fd5b506103ce6105ad366004613f17565b611407565b3480156105be57600080fd5b506103ce6105cd366004613e6e565b611554565b3480156105de57600080fd5b506104266105ed366004613f17565b61156f565b3480156105fe57600080fd5b506103ce61060d366004613f8c565b6115ec565b6103ce610620366004613f58565b611785565b34801561063157600080fd5b50610396610640366004613be2565b61180c565b34801561065157600080fd5b50610426610660366004613eaf565b61185d565b34801561067157600080fd5b506103ce6118f8565b34801561068657600080fd5b506103ce610695366004613be2565b61192e565b3480156106a657600080fd5b506106ba6106b5366004613be2565b6119ad565b6040805160ff909616865263ffffffff9485166020870152928416928501929092528216606084015216608082015260a00161034b565b3480156106fd57600080fd5b506003546001600160a01b0316610396565b34801561071b57600080fd5b506103696119fb565b34801561073057600080fd5b506103ce61073f366004613fbc565b611a0a565b34801561075057600080fd5b506103ce61075f36600461402d565b611a40565b34801561077057600080fd5b506103ce611a4b565b34801561078557600080fd5b506103ce61079436600461405b565b611b8d565b3480156107a557600080fd5b50610426600b5481565b3480156107bb57600080fd5b506103ce6107ca366004613eaf565b611ef4565b3480156107db57600080fd5b506103ce6107ea3660046140bb565b611ff3565b3480156107fb57600080fd5b506103ce61080a366004614126565b612044565b34801561081b57600080fd5b506103ce61082a366004613eaf565b612138565b34801561083b57600080fd5b5061036961084a366004613be2565b612184565b34801561085b57600080fd5b5061033f61086a366004613be2565b612369565b34801561087b57600080fd5b5061042660145481565b34801561089157600080fd5b506103ce6108a0366004613db9565b336000908152601760205260409020805460ff1916911515919091179055565b3480156108cc57600080fd5b5061042666038d7ea4c6800081565b3480156108e757600080fd5b5061042660001981565b3480156108fd57600080fd5b50600954610396906001600160a01b031681565b34801561091d57600080fd5b50610369612510565b34801561093257600080fd5b506103ce61251f565b34801561094757600080fd5b506103ce61095636600461414b565b61256f565b34801561096757600080fd5b5061033f6109763660046141ad565b61284f565b34801561098757600080fd5b506103ce610996366004613eaf565b612939565b3480156109a757600080fd5b50610426600581565b60006001600160e01b031982166380ac58cd60e01b14806109e157506001600160e01b03198216635b5e139f60e01b145b806109fc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610a11906141db565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3d906141db565b8015610a8a5780601f10610a5f57610100808354040283529160200191610a8a565b820191906000526020600020905b815481529060010190602001808311610a6d57829003601f168201915b5050505050905090565b60008181526006602052604081205460016001600160a01b0390911611610aee5760405162461bcd60e51b81526020600482015260096024820152682120a22faa27a5a2a760b91b60448201526064015b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610b158261180c565b9050806001600160a01b0316836001600160a01b03161415610b635760405162461bcd60e51b81526020600482015260076024820152661253959053125160ca1b6044820152606401610ae5565b336001600160a01b0382161480610b7f5750610b7f813361284f565b610b9b5760405162461bcd60e51b8152600401610ae590614216565b610ba583836129b1565b505050565b60408051606081810183526001600160a01b03881660008181526002602090815290859020548452830152918101869052610be88782878787612a1f565b610c215760405162461bcd60e51b815260206004820152600a6024820152692120a22fa9a4a3a722a960b11b6044820152606401610ae5565b6001600160a01b038716600090815260026020526040902054610c45906001612af2565b6001600160a01b0388166000908152600260205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610c9590899033908a90614239565b60405180910390a1600080306001600160a01b0316888a604051602001610cbd92919061426e565b60408051601f1981840301815290829052610cd7916142a5565b6000604051808303816000865af19150503d8060008114610d14576040519150601f19603f3d011682016040523d82523d6000602084013e610d19565b606091505b509150915081610d545760405162461bcd60e51b815260206004820152600660248201526511905253115160d21b6044820152606401610ae5565b98975050505050505050565b6003546001600160a01b03163314610d8a5760405162461bcd60e51b8152600401610ae590614216565b6019805460ff1916911515919091179055565b600080805b600b54811015610df657600f8181548110610dbf57610dbf6142c1565b600091825260209091200154610de290600160681b900463ffffffff16836142ed565b915080610dee81614305565b915050610da2565b50600b54610e049082614320565b91505090565b610e3760405180608001604052806060815260200160008152602001600081526020016000151581525090565b6000600b546001600160401b03811115610e5357610e53613c3c565b604051908082528060200260200182016040528015610eaf57816020015b610e9c6040518060800160405280600081526020016000815260200160008152602001600081525090565b815260200190600190039081610e715790505b50905060005b600b54811015610f3a576000610eca82612b05565b90506000610ed783612baf565b90506000610ee484612baf565b9050604051806080016040528085815260200184815260200183815260200182815250858581518110610f1957610f196142c1565b60200260200101819052505050508080610f3290614305565b915050610eb5565b506040805160808101825291825260145460208301526013549082015260125415156060820152919050565b610f703382612c36565b610fab5760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b6044820152606401610ae5565b610ba5838383612cde565b6003546001600160a01b03163314610fe05760405162461bcd60e51b8152600401610ae590614216565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b346000805b83811015611240576000858583818110611023576110236142c1565b9050602002810190611035919061434d565b611046906060810190604001614372565b600281111561105757611057614337565b141561117057426013541161109a5760405162461bcd60e51b81526020600482015260096024820152681393d517d4d510549560ba1b6044820152606401610ae5565b60006110c98686848181106110b1576110b16142c1565b90506020028101906110c3919061434d565b35612baf565b905061112a8686848181106110e0576110e06142c1565b90506020028101906110f2919061434d565b35878785818110611105576111056142c1565b9050602002810190611117919061434d565b602001358684611125612dc6565b612e23565b6111349085614320565b9350858583818110611148576111486142c1565b905060200281019061115a919061434d565b6111689060200135846142ed565b92505061122e565b60145442118015611182575060135442105b6111b75760405162461bcd60e51b81526020600482015260066024820152651393d517d5d360d21b6044820152606401610ae5565b6111ed8585838181106111cc576111cc6142c1565b90506020028101906111de919061434d565b6111e790614401565b846130d8565b6111f79084614320565b925084848281811061120b5761120b6142c1565b905060200281019061121d919061434d565b61122b9060200135836142ed565b91505b8061123881614305565b915050611007565b5033321461128d5732600090815260186020908152604080832043845290915290205461126d90826142ed565b326000908152601860209081526040808320438452909152902081905590505b611299600560016142ed565b81106112b75760405162461bcd60e51b8152600401610ae5906144b8565b50505050565b6003546001600160a01b031633146112e75760405162461bcd60e51b8152600401610ae590614216565b6112ef610d9d565b1580611308575042601354118015611308575042601454115b61133e5760405162461bcd60e51b815260206004820152600760248201526614d5105495115160ca1b6044820152606401610ae5565b601355601455565b6003546001600160a01b031633146113705760405162461bcd60e51b8152600401610ae590614216565b806001600160a01b031663095ea7b36113916003546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260001960248201526044016020604051808303816000875af11580156113df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140391906144da565b5050565b6003546001600160a01b031633146114315760405162461bcd60e51b8152600401610ae590614216565b600b54811461146d5760405162461bcd60e51b81526020600482015260086024820152674241445f5552495360c01b6044820152606401610ae5565b60005b600b548110156114db5782828281811061148c5761148c6142c1565b905060200281019061149e91906144f7565b600e83815481106114b1576114b16142c1565b9060005260206000200191906114c8929190613a01565b50806114d381614305565b915050611470565b506009546001600160a01b0316611403576009546040516340e1397f60e01b81526001600160a01b03909116906340e1397f9061151e9085908590600401614566565b600060405180830381600087803b15801561153857600080fd5b505af115801561154c573d6000803e3d6000fd5b505050505050565b610ba583838360405180602001604052806000815250611ff3565b600080805b6015548110156115e457600060158281548110611593576115936142c1565b906000526020600020015490506000818787858181106115b5576115b56142c1565b905060200201351611156115d157826115cd81614305565b9350505b50806115dc81614305565b915050611574565b509392505050565b6003546001600160a01b031633146116165760405162461bcd60e51b8152600401610ae590614216565b601254156116365760405162461bcd60e51b8152600401610ae590614600565b6000600f838154811061164b5761164b6142c1565b60009182526020918290206040805160a081018252919092015460ff8116825263ffffffff6101008204811694830194909452600160281b81048416928201839052600160481b810484166060830152600160681b90048316608082015292509083161180156116ca57508163ffffffff16816060015163ffffffff16115b6116e65760405162461bcd60e51b8152600401610ae590614622565b81600f84815481106116fa576116fa6142c1565b60009182526020822001805463ffffffff93909316600160481b0263ffffffff60481b19909316929092179091556040820151606083015161173c9190614644565b63ffffffff16905060008260400151846117569190614644565b63ffffffff1690506117688183614320565b600c60008282546117799190614320565b90915550505050505050565b42601354106117c65760405162461bcd60e51b815260206004820152600d60248201526c4245464f52455f5055424c494360981b6044820152606401610ae5565b6117d2600560016142ed565b81106117f05760405162461bcd60e51b8152600401610ae5906144b8565b60006117fb83612baf565b90506112b783833484611125612dc6565b6000818152600660205260408120546001600160a01b0316600181116109fc5760405162461bcd60e51b815260206004820152600660248201526510905117d25160d21b6044820152606401610ae5565b600060016001600160a01b03831611156118a55760405162461bcd60e51b81526020600482015260096024820152684241445f515545525960b81b6044820152606401610ae5565b6000805b600c548110156118f1576000818152600660205260409020546001600160a01b03858116911614156118e1576118de82614305565b91505b6118ea81614305565b90506118a9565b5092915050565b6003546001600160a01b031633146119225760405162461bcd60e51b8152600401610ae590614216565b61192c600061339f565b565b6003546001600160a01b031633146119585760405162461bcd60e51b8152600401610ae590614216565b60005b8181101561140357601580546001810182556000919091526000197f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47590910155806119a581614305565b91505061195b565b600f81815481106119bd57600080fd5b60009182526020909120015460ff8116915063ffffffff6101008204811691600160281b8104821691600160481b8204811691600160681b90041685565b606060058054610a11906141db565b6003546001600160a01b03163314611a345760405162461bcd60e51b8152600401610ae590614216565b610ba5600d8383613a01565b6114033383836133f1565b6003546001600160a01b03163314611a755760405162461bcd60e51b8152600401610ae590614216565b60125415611a955760405162461bcd60e51b8152600401610ae590614600565b601154611aa390600a6142ed565b40611ade5760405162461bcd60e51b815260206004820152600b60248201526a10d0539517d4915591505360aa1b6044820152606401610ae5565b601154611aec9060146142ed565b40611b275760405162461bcd60e51b815260206004820152600b60248201526a10d0539517d4915591505360aa1b6044820152606401610ae5565b601154611b359060146142ed565b40601154600f611b4591906142ed565b40601154600a611b5591906142ed565b60408051602081019490945283019190915240606082015260800160408051601f198184030181529190528051602090910120601255565b6003546001600160a01b03163314611bb75760405162461bcd60e51b8152600401610ae590614216565b6000600f8481548110611bcc57611bcc6142c1565b60009182526020918290206040805160a081018252919092015460ff8116825263ffffffff6101008204811694830194909452600160281b8104841692820192909252600160481b820483166060820152600160681b90910490911660808201529050611c3a8660016142ed565b816040015163ffffffff1610611c805760405162461bcd60e51b815260206004820152600b60248201526a2727aa2fa4a72faa24a2a960a91b6044820152606401610ae5565b6002611c8c86886142ed565b611c969190614320565b816060015163ffffffff1611611cdc5760405162461bcd60e51b815260206004820152600b60248201526a2727aa2fa4a72faa24a2a960a91b6044820152606401610ae5565b855b611ce886886142ed565b811015611e1e57611cf983886142ed565b8110611d79576000818152600660205260409020546001600160a01b031615611d555760405162461bcd60e51b815260206004820152600e60248201526d125117d25392551250531256915160921b6044820152606401610ae5565b600081815260066020526040902080546001600160a01b0319166001179055611e0c565b816040015163ffffffff168714611dc35760405162461bcd60e51b815260206004820152600e60248201526d10905117d194915150925157d25160921b6044820152606401610ae5565b611e0c8484611dd28a85614320565b818110611de157611de16142c1565b9050602002016020810190611df69190613eaf565b82604051806020016040528060008152506134b2565b80611e1681614305565b915050611cde565b50608081018051839190611e33908390614669565b63ffffffff16905250600f805482919086908110611e5357611e536142c1565b6000918252602091829020835191018054928401516040850151606086015160809096015160ff90941664ffffffffff199095169490941761010063ffffffff92831602176cffffffffffffffff00000000001916600160281b9482169490940263ffffffff60481b191693909317600160481b948416949094029390931763ffffffff60681b1916600160681b9290911691909102179055505050505050565b6003546001600160a01b03163314611f1e5760405162461bcd60e51b8152600401610ae590614216565b308031611f585760405162461bcd60e51b81526020600482015260086024820152672727afa2aa2422a960c11b6044820152606401610ae5565b6000826001600160a01b0316826001600160a01b03163160405160006040518083038185875af1925050503d8060008114611faf576040519150601f19603f3d011682016040523d82523d6000602084013e611fb4565b606091505b5050905080610ba55760405162461bcd60e51b815260206004820152600b60248201526a14d1539117d1905253115160aa1b6044820152606401610ae5565b611ffd3383612c36565b6120385760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b6044820152606401610ae5565b6112b7848484846134e5565b6002600a5414156120835760405162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b6044820152606401610ae5565b6002600a556009546001600160a01b0316336001600160a01b0316146120bc576040516308e5c1fd60e21b815260040160405180910390fd5b816120c681612369565b6120e357604051633e24282f60e21b815260040160405180910390fd5b6000600b54846120f391906146a7565b90506000600b548561210591906146bb565b6121109060026146cf565b61211b9060016142ed565b905061212b828260008088612e23565b50506001600a5550505050565b6003546001600160a01b031633146121625760405162461bcd60e51b8152600401610ae590614216565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60008181526006602052604090205460609060016001600160a01b03909116116121dd5760405162461bcd60e51b815260206004820152600a6024820152691253959053125117d25160b21b6044820152606401610ae5565b60006121e883613518565b90506000600e826000015160ff1681548110612206576122066142c1565b90600052602060002001805461221b906141db565b80601f0160208091040260200160405190810160405280929190818152602001828054612247906141db565b80156122945780601f1061226957610100808354040283529160200191612294565b820191906000526020600020905b81548152906001019060200180831161227757829003601f168201915b50505050509050601254600014156122cf57806040516020016122b791906146ee565b60405160208183030381529060405292505050919050565b6000826040015163ffffffff16856122e79190614320565b9050826040015183606001516122fd9190614644565b63ffffffff168160125461231191906142ed565b61231b91906146a7565b9050826040015163ffffffff168161233391906142ed565b90508161233f8261365d565b604051602001612350929190614719565b6040516020818303038152906040529350505050919050565b600042601354106123ac5760405162461bcd60e51b815260206004820152600d60248201526c4245464f52455f5055424c494360981b6044820152606401610ae5565b60195460ff16156123e85760405162461bcd60e51b815260206004820152600660248201526514105554d15160d21b6044820152606401610ae5565b6000600b54836123f891906146a7565b90506000600b548461240a91906146bb565b6124159060026146cf565b6124209060016142ed565b90506000600f8381548110612437576124376142c1565b600091825260208083206040805160a081018252919093015460ff8116825263ffffffff6101008204811693830193909352600160281b81048316938201849052600160481b810483166060830152600160681b9004909116608082018190529093506001916124a79190614669565b6124b19190614644565b60095463ffffffff9190911691506001600160a01b031615806124f1575060608201516124df906001614669565b63ffffffff166124ef84836142ed565b115b156125025750600095945050505050565b60019450505050505b919050565b6060600d8054610a11906141db565b6003546001600160a01b031633146125495760405162461bcd60e51b8152600401610ae590614216565b601254156125695760405162461bcd60e51b8152600401610ae590614600565b43601155565b6003546001600160a01b031633146125995760405162461bcd60e51b8152600401610ae590614216565b6125a1610d9d565b15806125ba5750426013541180156125ba575042601454115b6125f05760405162461bcd60e51b815260206004820152600760248201526614d5105495115160ca1b6044820152606401610ae5565b6000805b828110156127c6578084848381811061260f5761260f6142c1565b61262592602060a090920201908101915061475d565b60ff16146126615760405162461bcd60e51b81526020600482015260096024820152680848288be929c888ab60bb1b6044820152606401610ae5565b600b548110156126b45783838281811061267d5761267d6142c1565b905060a00201600f8281548110612696576126966142c1565b9060005260206000200181816126ac9190614787565b905050612744565b600f8484838181106126c8576126c86142c1565b83546001810185556000948552602090942060a090910292909201929190910190506126f48282614787565b5050600e80546001810182556000918252604080516020810191829052839052612742927fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd90920191613a85565b505b838382818110612756576127566142c1565b905060a00201604001602081019061276e919061486a565b848483818110612780576127806142c1565b905060a002016060016020810190612798919061486a565b6127a29190614644565b6127b29063ffffffff16836142ed565b9150806127be81614305565b9150506125f4565b505b600f5482101561284357600f8054806127e3576127e3614887565b6000828152602090208101600019908101805470ffffffffffffffffffffffffffffffffff19169055019055600e80548061282057612820614887565b60019003818190600052602060002001600061283c9190613af9565b90556127c8565b600b91909155600c5550565b6016546001600160a01b038381166000908152601760205260408120549092919091169060ff161580156128f8575060405163c455279160e01b81526001600160a01b038581166004830152808516919083169063c455279190602401602060405180830381865afa1580156128c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ed919061489d565b6001600160a01b0316145b156129075760019150506109fc565b6001600160a01b0380851660009081526008602090815260408083209387168352929052205460ff165b949350505050565b6003546001600160a01b031633146129635760405162461bcd60e51b8152600401610ae590614216565b6001600160a01b0381166129a55760405162461bcd60e51b81526020600482015260096024820152682120a22fa7aba722a960b91b6044820152606401610ae5565b6129ae8161339f565b50565b600081815260076020526040902080546001600160a01b0319166001600160a01b03841690811790915581906129e68261180c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b038616612a685760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610ae5565b6001612a7b612a768761375a565b6137d7565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612ac9573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6000612afe82846142ed565b9392505050565b600080600f8381548110612b1b57612b1b6142c1565b60009182526020918290206040805160a081018252919092015460ff8116825263ffffffff6101008204811694830194909452600160281b81048416928201839052600160481b8104841660608301819052600160681b9091049093166080820181905290935091612b8d9190614644565b612b979190614644565b612ba2906002614669565b63ffffffff169392505050565b600080600f8381548110612bc557612bc56142c1565b60009182526020918290206040805160a081018252929091015460ff8116835263ffffffff61010082048116948401859052600160281b8204811692840192909252600160481b810482166060840152600160681b90041660808201529150612afe9066038d7ea4c68000906146cf565b60008181526006602052604081205460016001600160a01b0390911611612c885760405162461bcd60e51b815260206004820152600660248201526510905117d25160d21b6044820152606401610ae5565b6000612c938361180c565b9050806001600160a01b0316846001600160a01b03161480612cce5750836001600160a01b0316612cc384610a94565b6001600160a01b0316145b806129315750612931818561284f565b826001600160a01b0316612cf18261180c565b6001600160a01b031614612d175760405162461bcd60e51b8152600401610ae590614216565b60016001600160a01b03831611612d5f5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610ae5565b612d6a6000826129b1565b60008181526006602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600033301415612e1d57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150612e209050565b50335b90565b60195460009060ff1615612e625760405162461bcd60e51b815260206004820152600660248201526514105554d15160d21b6044820152606401610ae5565b600b548610612e835760405162461bcd60e51b8152600401610ae590614622565b6000600f8781548110612e9857612e986142c1565b600091825260208083206040805160a081018252919093015460ff8116825263ffffffff6101008204811693830193909352600160281b8104831693820193909352600160481b830482166060820152600160681b9092041660808201529150612f0287866146cf565b905080612f108760016142ed565b11612f475760405162461bcd60e51b81526020600482015260076024820152664c4f575f50415960c81b6044820152606401610ae5565b6000600183608001518460400151612f5f9190614669565b612f699190614644565b63ffffffff16905082606001516001612f829190614669565b63ffffffff166001612f948a846142ed565b612f9e9190614320565b10612fbb5760405162461bcd60e51b8152600401610ae5906144b8565b60005b8881101561300057612fe08683604051806020016040528060008152506134b2565b81612fea81614305565b9250508080612ff890614305565b915050612fbe565b5087836080018181516130139190614669565b63ffffffff16905250600f80548491908b908110613033576130336142c1565b6000918252602091829020835191018054928401516040850151606086015160809096015160ff90941664ffffffffff199095169490941761010063ffffffff92831602176cffffffffffffffff00000000001916600160281b9482169490940263ffffffff60481b191693909317600160481b948416949094029390931763ffffffff60681b1916600160681b929091169190910217905550979650505050505050565b60008281816040015160028111156130f2576130f2614337565b1461323c57606060028260400151600281111561311157613111614337565b141561314457606082015160405161312e919033906020016148ed565b6040516020818303038152906040529050613170565b8151608083015160405161315e929190339060200161492c565b60405160208183030381529060405290505b6000818051906020012090506001818460e001518560a001518660c00151604051600081526020016040526040516131c4949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156131e6573d6000803e3d6000fd5b5050604051601f1901516010546001600160a01b0390811691161490506132395760405162461bcd60e51b815260206004820152600760248201526609c9ebe82aaa8960cb1b6044820152606401610ae5565b50505b600b5484511061325e5760405162461bcd60e51b8152600401610ae590614622565b6000805b601554811080156132765750856020015182105b1561332a57600060158281548110613290576132906142c1565b90600052602060002001549050600081886060015184815181106132b6576132b66142c1565b602002602001015116111561331757866060015182815181106132db576132db6142c1565b6020026020010151198116905082806132f390614305565b935050806015838154811061330a5761330a6142c1565b6000918252602090912001555b508061332281614305565b915050613262565b50846020015181101561336d5760405162461bcd60e51b815260206004820152600b60248201526a1513d3d7d350539657d5d360aa1b6044820152606401610ae5565b600061337c8660000151612baf565b9050613395866000015187602001518784611125612dc6565b9695505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156134455760405162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f415050524f564560881b6044820152606401610ae5565b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6134bc8383613807565b6134c96000848484613903565b610ba55760405162461bcd60e51b8152600401610ae590614972565b6134f0848484612cde565b6134fc84848484613903565b6112b75760405162461bcd60e51b8152600401610ae590614972565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a08101825260008082526020820181905291810182905260608101829052608081019190915260005b600b5481101561362757600f818154811061358e5761358e6142c1565b60009182526020918290206040805160a081018252919092015460ff8116825263ffffffff6101008204811694830194909452600160281b81048416928201839052600160481b810484166060830152600160681b900490921660808301529092508410801590613609575083826060015163ffffffff1610155b15613615575092915050565b8061361f81614305565b915050613571565b5060405162461bcd60e51b815260206004820152600a6024820152691253959053125117d25160b21b6044820152606401610ae5565b6060816136815750506040805180820190915260018152600360fc1b602082015290565b8160005b81156136ab578061369581614305565b91506136a49050600a836146bb565b9150613685565b6000816001600160401b038111156136c5576136c5613c3c565b6040519080825280601f01601f1916602001820160405280156136ef576020820181803683370190505b5090505b841561293157613704600183614320565b9150613711600a866146a7565b61371c9060306142ed565b60f81b818381518110613731576137316142c1565b60200101906001600160f81b031916908160001a905350613753600a866146bb565b94506136f3565b60006040518060800160405280604381526020016149e960439139805160209182012083518483015160408087015180519086012090516137ba950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60006137e260015490565b60405161190160f01b60208201526022810191909152604281018390526062016137ba565b60016001600160a01b0383161161384f5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610ae5565b60008181526006602052604090205460016001600160a01b0390911611156138aa5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610ae5565b60008181526006602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156139f657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613947903390899088908890600401614998565b6020604051808303816000875af1925050508015613982575060408051601f3d908101601f1916820190925261397f918101906149cb565b60015b6139dc573d8080156139b0576040519150601f19603f3d011682016040523d82523d6000602084013e6139b5565b606091505b5080516139d45760405162461bcd60e51b8152600401610ae590614972565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612931565b506001949350505050565b828054613a0d906141db565b90600052602060002090601f016020900481019282613a2f5760008555613a75565b82601f10613a485782800160ff19823516178555613a75565b82800160010185558215613a75579182015b82811115613a75578235825591602001919060010190613a5a565b50613a81929150613b2f565b5090565b828054613a91906141db565b90600052602060002090601f016020900481019282613ab35760008555613a75565b82601f10613acc57805160ff1916838001178555613a75565b82800160010185558215613a75579182015b82811115613a75578251825591602001919060010190613ade565b508054613b05906141db565b6000825580601f10613b15575050565b601f0160209004906000526020600020908101906129ae91905b5b80821115613a815760008155600101613b30565b6001600160e01b0319811681146129ae57600080fd5b600060208284031215613b6c57600080fd5b8135612afe81613b44565b60005b83811015613b92578181015183820152602001613b7a565b838111156112b75750506000910152565b60008151808452613bbb816020860160208601613b77565b601f01601f19169290920160200192915050565b602081526000612afe6020830184613ba3565b600060208284031215613bf457600080fd5b5035919050565b6001600160a01b03811681146129ae57600080fd5b60008060408385031215613c2357600080fd5b8235613c2e81613bfb565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60405161010081016001600160401b0381118282101715613c7557613c75613c3c565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613ca357613ca3613c3c565b604052919050565b600082601f830112613cbc57600080fd5b81356001600160401b03811115613cd557613cd5613c3c565b613ce8601f8201601f1916602001613c7b565b818152846020838601011115613cfd57600080fd5b816020850160208301376000918101602001919091529392505050565b60ff811681146129ae57600080fd5b803561250b81613d1a565b600080600080600060a08688031215613d4c57600080fd5b8535613d5781613bfb565b945060208601356001600160401b03811115613d7257600080fd5b613d7e88828901613cab565b94505060408601359250606086013591506080860135613d9d81613d1a565b809150509295509295909350565b80151581146129ae57600080fd5b600060208284031215613dcb57600080fd5b8135612afe81613dab565b602080825282516080838301819052815160a0850181905260009392830191849160c08701905b80841015613e3b5784518051835286810151878401526040808201519084015260609081015190830152938501936001939093019290820190613dfd565b508488015160408801526040880151606088015260608801519450613e638288018615159052565b979650505050505050565b600080600060608486031215613e8357600080fd5b8335613e8e81613bfb565b92506020840135613e9e81613bfb565b929592945050506040919091013590565b600060208284031215613ec157600080fd5b8135612afe81613bfb565b60008083601f840112613ede57600080fd5b5081356001600160401b03811115613ef557600080fd5b6020830191508360208260051b8501011115613f1057600080fd5b9250929050565b60008060208385031215613f2a57600080fd5b82356001600160401b03811115613f4057600080fd5b613f4c85828601613ecc565b90969095509350505050565b60008060408385031215613f6b57600080fd5b50508035926020909101359150565b63ffffffff811681146129ae57600080fd5b60008060408385031215613f9f57600080fd5b823591506020830135613fb181613f7a565b809150509250929050565b60008060208385031215613fcf57600080fd5b82356001600160401b0380821115613fe657600080fd5b818501915085601f830112613ffa57600080fd5b81358181111561400957600080fd5b86602082850101111561401b57600080fd5b60209290920196919550909350505050565b6000806040838503121561404057600080fd5b823561404b81613bfb565b91506020830135613fb181613dab565b60008060008060006080868803121561407357600080fd5b85359450602086013593506040860135925060608601356001600160401b0381111561409e57600080fd5b6140aa88828901613ecc565b969995985093965092949392505050565b600080600080608085870312156140d157600080fd5b84356140dc81613bfb565b935060208501356140ec81613bfb565b92506040850135915060608501356001600160401b0381111561410e57600080fd5b61411a87828801613cab565b91505092959194509250565b6000806040838503121561413957600080fd5b823591506020830135613fb181613bfb565b6000806020838503121561415e57600080fd5b82356001600160401b038082111561417557600080fd5b818501915085601f83011261418957600080fd5b81358181111561419857600080fd5b86602060a08302850101111561401b57600080fd5b600080604083850312156141c057600080fd5b82356141cb81613bfb565b91506020830135613fb181613bfb565b600181811c908216806141ef57607f821691505b6020821081141561421057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b6001600160a01b0384811682528316602082015260606040820181905260009061426590830184613ba3565b95945050505050565b60008351614280818460208801613b77565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b600082516142b7818460208701613b77565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115614300576143006142d7565b500190565b6000600019821415614319576143196142d7565b5060010190565b600082821015614332576143326142d7565b500390565b634e487b7160e01b600052602160045260246000fd5b6000823560fe198336030181126142b757600080fd5b80356003811061250b57600080fd5b60006020828403121561438457600080fd5b612afe82614363565b600082601f83011261439e57600080fd5b813560206001600160401b038211156143b9576143b9613c3c565b8160051b6143c8828201613c7b565b92835284810182019282810190878511156143e257600080fd5b83870192505b84831015613e63578235825291830191908301906143e8565b6000610100823603121561441457600080fd5b61441c613c52565b823581526020830135602082015261443660408401614363565b604082015260608301356001600160401b038082111561445557600080fd5b6144613683870161438d565b6060840152608085013591508082111561447a57600080fd5b506144873682860161438d565b60808301525060a083013560a082015260c083013560c08201526144ad60e08401613d29565b60e082015292915050565b602080825260089082015267544f4f5f4d414e5960c01b604082015260600190565b6000602082840312156144ec57600080fd5b8151612afe81613dab565b6000808335601e1984360301811261450e57600080fd5b8301803591506001600160401b0382111561452857600080fd5b602001915036819003821315613f1057600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208082528181018390526000906040600585901b8401810190840186845b878110156145f357868403603f190183528135368a9003601e190181126145ab57600080fd5b890180356001600160401b038111156145c357600080fd5b8036038b13156145d257600080fd5b6145df868289850161453d565b955050509184019190840190600101614585565b5091979650505050505050565b602080825260089082015267149155915053115160c21b604082015260600190565b6020808252600890820152672120a22faa24a2a960c11b604082015260600190565b600063ffffffff83811690831681811015614661576146616142d7565b039392505050565b600063ffffffff808316818516808303821115614688576146886142d7565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b6000826146b6576146b6614691565b500690565b6000826146ca576146ca614691565b500490565b60008160001904831182151516156146e9576146e96142d7565b500290565b60008251614700818460208701613b77565b66191959985d5b1d60ca1b920191825250600701919050565b6000835161472b818460208801613b77565b6872657665616c65642f60b81b9083019081528351614751816009840160208801613b77565b01600901949350505050565b60006020828403121561476f57600080fd5b8135612afe81613d1a565b600081356109fc81613f7a565b813561479281613d1a565b60ff8116905081548160ff19821617835560208401356147b181613f7a565b64ffffffff008160081b169050808364ffffffffff1984161717845560408501356147db81613f7a565b68ffffffff00000000008160281b1690508368ffffffffffffffffff198416179350808483171785556060860135925061481483613f7a565b63ffffffff60481b8360481b1663ffffffff60481b19851683178217178555505050506114036148466080840161477a565b82805463ffffffff60681b191660689290921b63ffffffff60681b16919091179055565b60006020828403121561487c57600080fd5b8135612afe81613f7a565b634e487b7160e01b600052603160045260246000fd5b6000602082840312156148af57600080fd5b8151612afe81613bfb565b60008151602080840160005b838110156148e2578151875295820195908201906001016148c6565b509495945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152600061491f601c8301856148ba565b9283525050602001919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000815283601c8201526000614964603c8301856148ba565b928352505060200192915050565b6020808252600c908201526b2727aa2fa922a1a2a4ab22a960a11b604082015260600190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061339590830184613ba3565b6000602082840312156149dd57600080fd5b8151612afe81613b4456fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220a29abfee7d6730e7fd852e2c832c12b577327c0aacc557a3bcab8a0c8d7e82f864736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000000000000000000000000000000000000000001c54656e6e6973204368616d70732047656e65736973205365726965730000000000000000000000000000000000000000000000000000000000000000000000064348414d50530000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): Tennis Champs Genesis Series
Arg [1] : symbol_ (string): CHAMPS
Arg [2] : proxy (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [3] : 000000000000000000000000000000000000000000000000000000000000001c
Arg [4] : 54656e6e6973204368616d70732047656e657369732053657269657300000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 4348414d50530000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
61287:17099:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34906:305;;;;;;;;;;-1:-1:-1;34906:305:0;;;;;:::i;:::-;;:::i;:::-;;;661:14:1;;654:22;636:41;;624:2;609:18;34906:305:0;;;;;;;;36135:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37580:186::-;;;;;;;;;;-1:-1:-1;37580:186:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1788:32:1;;;1770:51;;1758:2;1743:18;37580:186:0;1624:203:1;37176:338:0;;;;;;;;;;-1:-1:-1;37176:338:0;;;;;:::i;:::-;;:::i;:::-;;56974:1106;;;;;;:::i;:::-;;:::i;47520:43::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47520:43:0;;;;;61835:54;;;;;;;;;;;;;;;;;;;4853:25:1;;;4841:2;4826:18;61835:54:0;4707:177:1;66532:84:0;;;;;;;;;;-1:-1:-1;66532:84:0;;;;;:::i;:::-;;:::i;71747:244::-;;;;;;;;;;;;;:::i;69369:548::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;48529:101::-;;;;;;;;;;-1:-1:-1;48607:15:0;;48529:101;;61594:25;;;;;;;;;;;;;;;;38295:302;;;;;;;;;;-1:-1:-1;38295:302:0;;;;;:::i;:::-;;:::i;64977:123::-;;;;;;;;;;-1:-1:-1;64977:123:0;;;;;:::i;:::-;;:::i;58506:107::-;;;;;;;;;;-1:-1:-1;58506:107:0;;;;;:::i;:::-;-1:-1:-1;;;;;58593:12:0;58559:13;58593:12;;;:6;:12;;;;;;;58506:107;71999:1287;;;;;;:::i;:::-;;:::i;48638:161::-;;;;;;;;;;-1:-1:-1;48752:9:0;48638:161;;65108:212;;;;;;;;;;-1:-1:-1;65108:212:0;;;;;:::i;:::-;;:::i;78142:128::-;;;;;;;;;;-1:-1:-1;78142:128:0;;;;;:::i;:::-;;:::i;66624:374::-;;;;;;;;;;-1:-1:-1;66624:374:0;;;;;:::i;:::-;;:::i;38668:185::-;;;;;;;;;;-1:-1:-1;38668:185:0;;;;;:::i;:::-;;:::i;76160:406::-;;;;;;;;;;-1:-1:-1;76160:406:0;;;;;:::i;:::-;;:::i;66045:479::-;;;;;;;;;;-1:-1:-1;66045:479:0;;;;;:::i;:::-;;:::i;74219:276::-;;;;;;:::i;:::-;;:::i;35865:203::-;;;;;;;;;;-1:-1:-1;35865:203:0;;;;;:::i;:::-;;:::i;71350:299::-;;;;;;;;;;-1:-1:-1;71350:299:0;;;;;:::i;:::-;;:::i;7042:103::-;;;;;;;;;;;;;:::i;67006:178::-;;;;;;;;;;-1:-1:-1;67006:178:0;;;;;:::i;:::-;;:::i;61706:28::-;;;;;;;;;;-1:-1:-1;61706:28:0;;;;;:::i;:::-;;:::i;:::-;;;;10459:4:1;10447:17;;;10429:36;;10484:10;10530:15;;;10525:2;10510:18;;10503:43;10582:15;;;10562:18;;;10555:43;;;;10634:15;;10629:2;10614:18;;10607:43;10687:15;10681:3;10666:19;;10659:44;10416:3;10401:19;61706:28:0;10182:527:1;6414:87:0;;;;;;;;;;-1:-1:-1;6487:6:0;;-1:-1:-1;;;;;6487:6:0;6414:87;;36304:104;;;;;;;;;;;;;:::i;64852:117::-;;;;;;;;;;-1:-1:-1;64852:117:0;;;;;:::i;:::-;;:::i;37838:155::-;;;;;;;;;;-1:-1:-1;37838:155:0;;;;;:::i;:::-;;:::i;67299:384::-;;;;;;;;;;;;;:::i;67691:844::-;;;;;;;;;;-1:-1:-1;67691:844:0;;;;;:::i;:::-;;:::i;61562:25::-;;;;;;;;;;;;;;;;77786:348;;;;;;;;;;-1:-1:-1;77786:348:0;;;;;:::i;:::-;;:::i;38924:291::-;;;;;;;;;;-1:-1:-1;38924:291:0;;;;;:::i;:::-;;:::i;73873:338::-;;;;;;;;;;-1:-1:-1;73873:338:0;;;;;:::i;:::-;;:::i;64732:112::-;;;;;;;;;;-1:-1:-1;64732:112:0;;;;;:::i;:::-;;:::i;70386:694::-;;;;;;;;;;-1:-1:-1;70386:694:0;;;;;:::i;:::-;;:::i;73294:571::-;;;;;;;;;;-1:-1:-1;73294:571:0;;;;;:::i;:::-;;:::i;61896:57::-;;;;;;;;;;;;;;;;76669:121;;;;;;;;;;-1:-1:-1;76669:121:0;;;;;:::i;:::-;76761:10;76734:38;;;;:26;:38;;;;;:48;;-1:-1:-1;;76734:48:0;;;;;;;;;;76669:121;61471:37;;;;;;;;;;;;61504:4;61471:37;;33949:101;;;;;;;;;;;;-1:-1:-1;;33949:101:0;;59248:27;;;;;;;;;;-1:-1:-1;59248:27:0;;;;-1:-1:-1;;;;;59248:27:0;;;78278:105;;;;;;;;;;;;;:::i;67192:99::-;;;;;;;;;;;;;:::i;65328:709::-;;;;;;;;;;-1:-1:-1;65328:709:0;;;;;:::i;:::-;;:::i;76922:476::-;;;;;;;;;;-1:-1:-1;76922:476:0;;;;;:::i;:::-;;:::i;7300:172::-;;;;;;;;;;-1:-1:-1;7300:172:0;;;;;:::i;:::-;;:::i;61515:38::-;;;;;;;;;;;;61552:1;61515:38;;34906:305;35008:4;-1:-1:-1;;;;;;35045:40:0;;-1:-1:-1;;;35045:40:0;;:105;;-1:-1:-1;;;;;;;35102:48:0;;-1:-1:-1;;;35102:48:0;35045:105;:158;;;-1:-1:-1;;;;;;;;;;33508:40:0;;;35167:36;35025:178;34906:305;-1:-1:-1;;34906:305:0:o;36135:100::-;36189:13;36222:5;36215:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36135:100;:::o;37580:186::-;37656:7;40776:16;;;:7;:16;;;;;;40803:1;-1:-1:-1;;;;;40776:16:0;;;:29;37676:38;;;;-1:-1:-1;;;37676:38:0;;15261:2:1;37676:38:0;;;15243:21:1;15300:1;15280:18;;;15273:29;-1:-1:-1;;;15318:18:1;;;15311:39;15367:18;;37676:38:0;;;;;;;;;-1:-1:-1;37734:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37734:24:0;;37580:186::o;37176:338::-;37257:13;37273:23;37288:7;37273:14;:23::i;:::-;37257:39;;37321:5;-1:-1:-1;;;;;37315:11:0;:2;-1:-1:-1;;;;;37315:11:0;;;37307:31;;;;-1:-1:-1;;;37307:31:0;;15598:2:1;37307:31:0;;;15580:21:1;15637:1;15617:18;;;15610:29;-1:-1:-1;;;15655:18:1;;;15648:37;15702:18;;37307:31:0;15396:330:1;37307:31:0;2785:10;-1:-1:-1;;;;;37373:21:0;;;;:62;;-1:-1:-1;37398:37:0;37415:5;2785:10;76922:476;:::i;37398:37::-;37351:121;;;;-1:-1:-1;;;37351:121:0;;;;;;;:::i;:::-;37485:21;37494:2;37498:7;37485:8;:21::i;:::-;37246:268;37176:338;;:::o;56974:1106::-;57232:152;;;57175:12;57232:152;;;;;-1:-1:-1;;;;;57270:19:0;;57200:29;57270:19;;;:6;:19;;;;;;;;;57232:152;;;;;;;;;;;57419:45;57277:11;57232:152;57447:4;57453;57459;57419:6;:45::i;:::-;57397:105;;;;-1:-1:-1;;;57397:105:0;;16270:2:1;57397:105:0;;;16252:21:1;16309:2;16289:18;;;16282:30;-1:-1:-1;;;16328:18:1;;;16321:40;16378:18;;57397:105:0;16068:334:1;57397:105:0;-1:-1:-1;;;;;57591:19:0;;;;;;:6;:19;;;;;;:26;;57615:1;57591:23;:26::i;:::-;-1:-1:-1;;;;;57569:19:0;;;;;;:6;:19;;;;;;;:48;;;;57635:126;;;;;57576:11;;57707:10;;57733:17;;57635:126;:::i;:::-;;;;;;;;57872:12;57886:23;57921:4;-1:-1:-1;;;;;57913:18:0;57963:17;57982:11;57946:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;57946:48:0;;;;;;;;;;57913:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57871:134;;;;58024:7;58016:26;;;;-1:-1:-1;;;58016:26:0;;17745:2:1;58016:26:0;;;17727:21:1;17784:1;17764:18;;;17757:29;-1:-1:-1;;;17802:18:1;;;17795:36;17848:18;;58016:26:0;17543:329:1;58016:26:0;58062:10;56974:1106;-1:-1:-1;;;;;;;;56974:1106:0:o;66532:84::-;6487:6;;-1:-1:-1;;;;;6487:6:0;2785:10;6634:23;6626:45;;;;-1:-1:-1;;;6626:45:0;;;;;;;:::i;:::-;66593:7:::1;:15:::0;;-1:-1:-1;;66593:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;66532:84::o;71747:244::-;71791:7;;;71842:103;71862:10;;71858:1;:14;71842:103;;;71906:10;71917:1;71906:13;;;;;;;;:::i;:::-;;;;;;;;;;:27;71894:39;;-1:-1:-1;;;71906:27:0;;;;71894:39;;:::i;:::-;;-1:-1:-1;71874:3:0;;;;:::i;:::-;;;;71842:103;;;-1:-1:-1;71973:10:0;;71962:21;;:8;:21;:::i;:::-;71955:28;;;71747:244;:::o;69369:548::-;69418:14;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69418:14:0;69445:38;69509:10;;-1:-1:-1;;;;;69486:34:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69486:34:0;;;;;;;;;;;;;;;;;69445:75;;69535:6;69531:275;69551:10;;69547:1;:14;69531:275;;;69583:17;69603:13;69614:1;69603:10;:13::i;:::-;69583:33;;69631:16;69650:12;69660:1;69650:9;:12::i;:::-;69631:31;;69677:18;69698:14;69710:1;69698:11;:14::i;:::-;69677:35;;69745:49;;;;;;;;69762:1;69745:49;;;;69764:9;69745:49;;;;69774:8;69745:49;;;;69783:10;69745:49;;;69727:12;69740:1;69727:15;;;;;;;;:::i;:::-;;;;;;:67;;;;69568:238;;;69563:3;;;;;:::i;:::-;;;;69531:275;;;-1:-1:-1;69823:86:0;;;;;;;;;;;69845:24;;69823:86;;;;69871:21;;69823:86;;;;69894:9;;:14;;69823:86;;;;;69369:548;-1:-1:-1;69369:548:0:o;38295:302::-;38490:41;2785:10;38523:7;38490:18;:41::i;:::-;38482:66;;;;-1:-1:-1;;;38482:66:0;;18746:2:1;38482:66:0;;;18728:21:1;18785:2;18765:18;;;18758:30;-1:-1:-1;;;18804:18:1;;;18797:42;18856:18;;38482:66:0;18544:336:1;38482:66:0;38561:28;38571:4;38577:2;38581:7;38561:9;:28::i;64977:123::-;6487:6;;-1:-1:-1;;;;;6487:6:0;2785:10;6634:23;6626:45;;;;-1:-1:-1;;;6626:45:0;;;;;;;:::i;:::-;65059:24:::1;:33:::0;;-1:-1:-1;;;;;;65059:33:0::1;-1:-1:-1::0;;;;;65059:33:0;;;::::1;::::0;;;::::1;::::0;;64977:123::o;71999:1287::-;72109:9;72084:22;;72168:729;72184:16;;;72168:729;;;72250:24;72225:5;;72231:1;72225:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:21;;;;;;;;;:::i;:::-;:49;;;;;;;;:::i;:::-;;72222:664;;;72327:15;72303:21;;:39;72295:61;;;;-1:-1:-1;;;72295:61:0;;19930:2:1;72295:61:0;;;19912:21:1;19969:1;19949:18;;;19942:29;-1:-1:-1;;;19987:18:1;;;19980:39;20036:18;;72295:61:0;19728:332:1;72295:61:0;72375:13;72391:26;72401:5;;72407:1;72401:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:15;72391:9;:26::i;:::-;72375:42;;72454:84;72468:5;;72474:1;72468:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:15;72484:5;;72490:1;72484:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:17;;;72503:14;72519:5;72526:11;:9;:11::i;:::-;72454:13;:84::i;:::-;72436:102;;;;:::i;:::-;;;72575:5;;72581:1;72575:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;72557:35;;72575:17;;;72557:35;;:::i;:::-;;;72276:332;72222:664;;;72659:24;;72641:15;:42;:85;;;;;72705:21;;72687:15;:39;72641:85;72633:104;;;;-1:-1:-1;;;72633:104:0;;20267:2:1;72633:104:0;;;20249:21:1;20306:1;20286:18;;;20279:29;-1:-1:-1;;;20324:18:1;;;20317:36;20370:18;;72633:104:0;20065:329:1;72633:104:0;72774:42;72791:5;;72797:1;72791:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;72774:42;;;:::i;:::-;72801:14;72774:16;:42::i;:::-;72756:60;;;;:::i;:::-;;;72853:5;;72859:1;72853:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;72835:35;;72853:17;;;72835:35;;:::i;:::-;;;72222:664;72202:3;;;;:::i;:::-;;;;72168:729;;;-1:-1:-1;72912:10:0;72926:9;72912:23;72909:307;;73097:9;73070:37;;;;:26;:37;;;;;;;;73108:12;73070:51;;;;;;;;73052:69;;;;:::i;:::-;73163:9;73136:37;;;;:26;:37;;;;;;;;73174:12;73136:51;;;;;;;:68;;;73052:69;-1:-1:-1;72909:307:0;73253:12;61552:1;73253;:12;:::i;:::-;73236:14;:29;73228:50;;;;-1:-1:-1;;;73228:50:0;;;;;;;:::i;:::-;72073:1213;;71999:1287;;:::o;65108:212::-;6487:6;;-1:-1:-1;;;;;6487:6:0;2785:10;6634:23;6626:45;;;;-1:-1:-1;;;6626:45:0;;;;;;;:::i;:::-;64272:13:::1;:11;:13::i;:::-;:18:::0;;:107:::1;;;64318:15;64294:21;;:39;:85;;;;;64364:15;64337:24;;:42;64294:85;64264:127;;;::::0;-1:-1:-1;;;64264:127:0;;22752:2:1;64264:127:0::1;::::0;::::1;22734:21:1::0;22791:1;22771:18;;;22764:29;-1:-1:-1;;;22809:18:1;;;22802:37;22856:18;;64264:127:0::1;22550:330:1::0;64264:127:0::1;65223:21:::2;:36:::0;65270:24:::2;:42:::0;65108:212::o;78142:128::-;6487:6;;-1:-1:-1;;;;;6487:6:0;2785:10;6634:23;6626:45;;;;-1:-1:-1;;;6626:45:0;;;;;;;:::i;:::-;78222:6:::1;-1:-1:-1::0;;;;;78222:14:0::1;;78237:7;6487:6:::0;;-1:-1:-1;;;;;6487:6:0;;6414:87;78237:7:::1;78222:40;::::0;-1:-1:-1;;;;;;78222:40:0::1;::::0;;;;;;-1:-1:-1;;;;;23077:32:1;;;78222:40:0::1;::::0;::::1;23059:51:1::0;-1:-1:-1;;23126:18:1;;;23119:34;23032:18;;78222:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;78142:128:::0;:::o;66624:374::-;6487:6;;-1:-1:-1;;;;;6487:6:0;2785:10;6634:23;6626:45;;;;-1:-1:-1;;;6626:45:0;;;;;;;:::i;:::-;66745:10:::1;::::0;66722:33;::::1;66714:54;;;::::0;-1:-1:-1;;;66714:54:0;;23616:2:1;66714:54:0::1;::::0;::::1;23598:21:1::0;23655:1;23635:18;;;23628:29;-1:-1:-1;;;23673:18:1;;;23666:38;23721:18;;66714:54:0::1;23414:331:1::0;66714:54:0::1;66783:6;66779:97;66799:10;;66795:1;:14;66779:97;;;66849:12;;66862:1;66849:15;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;66831:12;66844:1;66831:15;;;;;;;;:::i;:::-;;;;;;;;:33;;;;;;;:::i;:::-;-1:-1:-1::0;66811:3:0;::::1;::::0;::::1;:::i;:::-;;;;66779:97;;;-1:-1:-1::0;66891:12:0::1;::::0;-1:-1:-1;;;;;66891:12:0::1;66888:102;;66946:12;::::0;66932:58:::1;::::0;-1:-1:-1;;;66932:58:0;;-1:-1:-1;;;;;66946:12:0;;::::1;::::0;66932:44:::1;::::0;:58:::1;::::0;66977:12;;;;66932:58:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66624:374:::0;;:::o;38668:185::-;38806:39;38823:4;38829:2;38833:7;38806:39;;;;;;;;;;;;:16;:39::i;76160:406::-;76254:4;;;76307:218;76327:14;:21;76323:25;;76307:218;;;76370:18;76391:14;76406:1;76391:17;;;;;;;;:::i;:::-;;;;;;;;;76370:38;;76458:1;76445:10;76426:13;;76440:1;76426:16;;;;;;;:::i;:::-;;;;;;;:29;:33;76423:91;;;76480:18;;;;:::i;:::-;;;;76423:91;-1:-1:-1;76350:3:0;;;;:::i;:::-;;;;76307:218;;;-1:-1:-1;76542:16:0;76160:406;-1:-1:-1;;;76160:406:0:o;66045:479::-;6487:6;;-1:-1:-1;;;;;6487:6:0;2785:10;6634:23;6626:45;;;;-1:-1:-1;;;6626:45:0;;;;;;;:::i;:::-;64590:9:::1;::::0;:14;64582:35:::1;;;;-1:-1:-1::0;;;64582:35:0::1;;;;;;;:::i;:::-;66155:20:::2;66178:10;66189:13;66178:25;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;66155:48:::2;::::0;;::::2;::::0;::::2;::::0;;66178:25;;;::::2;66155:48:::0;::::2;::::0;::::2;::::0;;::::2;;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;;;;-1:-1:-1;;;66155:48:0;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;;;66155:48:0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;66155:48:0;::::2;::::0;::::2;::::0;;;;;-1:-1:-1;66222:29:0;;::::2;-1:-1:-1::0;66222:60:0;::::2;;;;66271:11;66255:27;;:4;:13;;;:27;;;66222:60;66214:81;;;;-1:-1:-1::0;;;66214:81:0::2;;;;;;;:::i;:::-;66343:11;66306:10;66317:13;66306:25;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;:48:::0;;::::2;::::0;;;::::2;-1:-1:-1::0;;;66306:48:0::2;-1:-1:-1::0;;;;66306:48:0;;::::2;::::0;;;::::2;::::0;;;66398:15:::2;::::0;::::2;::::0;66382:13:::2;::::0;::::2;::::0;:31:::2;::::0;66398:15;66382:31:::2;:::i;:::-;66365:48;;;;66424:14;66455:4;:15;;;66441:11;:29;;;;:::i;:::-;66424:46;;::::0;-1:-1:-1;66495:21:0::2;66424:46:::0;66495:9;:21:::2;:::i;:::-;66481:10;;:35;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;66045:479:0:o;74219:276::-;64487:15;64463:21;;:39;64455:65;;;;-1:-1:-1;;;64455:65:0;;26847:2:1;64455:65:0;;;26829:21:1;26886:2;26866:18;;;26859:30;-1:-1:-1;;;26905:18:1;;;26898:43;26958:18;;64455:65:0;26645:337:1;64455:65:0;74342:12:::1;61552:1;74353;74342:12;:::i;:::-;74330:9;:24;74322:45;;;;-1:-1:-1::0;;;74322:45:0::1;;;;;;;:::i;:::-;74378:13;74394:18;74404:7;74394:9;:18::i;:::-;74378:34;;74423:64;74437:7;74446:9;74457;74468:5;74475:11;:9;:11::i;35865:203::-:0;35937:7;35973:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35973:16:0;;36008:18;;36000:37;;;;-1:-1:-1;;;36000:37:0;;27189:2:1;36000:37:0;;;27171:21:1;27228:1;27208:18;;;27201:29;-1:-1:-1;;;27246:18:1;;;27239:36;27292:18;;36000:37:0;26987:329:1;71350:299:0;71422:7;71467:1;-1:-1:-1;;;;;71450:19:0;;;;71442:41;;;;-1:-1:-1;;;71442:41:0;;27523:2:1;71442:41:0;;;27505:21:1;27562:1;27542:18;;;27535:29;-1:-1:-1;;;27580:18:1;;;27573:39;27629:18;;71442:41:0;27321:332:1;71442:41:0;71494:10;71520:6;71515:104;71532:10;;71528:1;:14;71515:104;;;71575:10;;;;:7;:10;;;;;;-1:-1:-1;;;;;71566:19:0;;;71575:10;;71566:19;71562:45;;;71600:7;;;:::i;:::-;;;71562:45;71544:3;;;:::i;:::-;;;71515:104;;;-1:-1:-1;71636:5:0;71350:299;-1:-1:-1;;71350:299:0:o;7042:103::-;6487:6;;-1:-1:-1;;;;;6487:6:0;2785:10;6634:23;6626:45;;;;-1:-1:-1;;;6626:45:0;;;;;;;:::i;:::-;7107:30:::1;7134:1;7107:18;:30::i;:::-;7042:103::o:0;67006:178::-;6487:6;;-1:-1:-1;;;;;6487:6:0;2785:10;6634:23;6626:45;;;;-1:-1:-1;;;6626:45:0;;;;;;;:::i;:::-;67081:6:::1;67077:100;67097:10;67093:1;:14;67077:100;;;67129:14;:36:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;67129:36:0;;;;-1:-1:-1;;67129:36:0;;;::::1;::::0;67109:3;::::1;::::0;::::1;:::i;:::-;;;;67077:100;;61706:28:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61706:28:0;;;;;;;-1:-1:-1;;;61706:28:0;;;;;-1:-1:-1;;;61706:28:0;;;;;-1:-1:-1;;;61706:28:0;;;;:::o;36304:104::-;36360:13;36393:7;36386:14;;;;;:::i;64852:117::-;6487:6;;-1:-1:-1;;;;;6487:6:0;2785:10;6634:23;6626:45;;;;-1:-1:-1;;;6626:45:0;;;;;;;:::i;:::-;64935:26:::1;:20;64958:3:::0;;64935:26:::1;:::i;37838:155::-:0;37933:52;2785:10;37966:8;37976;37933:18;:52::i;67299:384::-;6487:6;;-1:-1:-1;;;;;6487:6:0;2785:10;6634:23;6626:45;;;;-1:-1:-1;;;6626:45:0;;;;;;;:::i;:::-;64590:9:::1;::::0;:14;64582:35:::1;;;;-1:-1:-1::0;;;64582:35:0::1;;;;;;;:::i;:::-;67377:12:::2;::::0;:17:::2;::::0;67392:2:::2;67377:17;:::i;:::-;67367:28;67359:57;;;::::0;-1:-1:-1;;;67359:57:0;;27860:2:1;67359:57:0::2;::::0;::::2;27842:21:1::0;27899:2;27879:18;;;27872:30;-1:-1:-1;;;27918:18:1;;;27911:41;27969:18;;67359:57:0::2;27658:335:1::0;67359:57:0::2;67445:12;::::0;:17:::2;::::0;67460:2:::2;67445:17;:::i;:::-;67435:28;67427:57;;;::::0;-1:-1:-1;;;67427:57:0;;27860:2:1;67427:57:0::2;::::0;::::2;27842:21:1::0;27899:2;27879:18;;;27872:30;-1:-1:-1;;;27918:18:1;;;27911:41;27969:18;;67427:57:0::2;27658:335:1::0;67427:57:0::2;67566:12;::::0;:17:::2;::::0;67581:2:::2;67566:17;:::i;:::-;67556:28;67610:12;;67625:2;67610:17;;;;:::i;:::-;67600:28;67654:12;;67669:2;67654:17;;;;:::i;:::-;67525:148;::::0;;::::2;::::0;::::2;28183:19:1::0;;;;28218:12;;28211:28;;;;67644::0::2;28255:12:1::0;;;28248:28;28292:12;;67525:148:0::2;::::0;;-1:-1:-1;;67525:148:0;;::::2;::::0;;;;;;67515:159;;67525:148:::2;67515:159:::0;;::::2;::::0;67495:9:::2;:180:::0;67299:384::o;67691:844::-;6487:6;;-1:-1:-1;;;;;6487:6:0;2785:10;6634:23;6626:45;;;;-1:-1:-1;;;6626:45:0;;;;;;;:::i;:::-;67830:20:::1;67853:10;67864:7;67853:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;67830:42:::1;::::0;;::::1;::::0;::::1;::::0;;67853:19;;;::::1;67830:42:::0;::::1;::::0;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;67830:42:0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;67830:42:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;67830:42:0;;::::1;::::0;;::::1;::::0;;;;;-1:-1:-1;67909:8:0::1;:6:::0;67830:42;67909:8:::1;:::i;:::-;67891:4;:15;;;:26;;;67883:50;;;::::0;-1:-1:-1;;;67883:50:0;;28517:2:1;67883:50:0::1;::::0;::::1;28499:21:1::0;28556:2;28536:18;;;28529:30;-1:-1:-1;;;28575:18:1;;;28568:41;28626:18;;67883:50:0::1;28315:335:1::0;67883:50:0::1;67982:1;67968:13;67975:6:::0;67968;:13:::1;:::i;:::-;:15;;;;:::i;:::-;67952:4;:13;;;:31;;;67944:55;;;::::0;-1:-1:-1;;;67944:55:0;;28517:2:1;67944:55:0::1;::::0;::::1;28499:21:1::0;28556:2;28536:18;;;28529:30;-1:-1:-1;;;28575:18:1;;;28568:41;28626:18;;67944:55:0::1;28315:335:1::0;67944:55:0::1;68025:6:::0;68012:412:::1;68037:13;68044:6:::0;68037;:13:::1;:::i;:::-;68033:1;:17;68012:412;;;68080:33;68089:17:::0;68080:6;:33:::1;:::i;:::-;68075:1;:38;68072:341;;68164:1;68142:10:::0;;;:7:::1;:10;::::0;;;;;-1:-1:-1;;;;;68142:10:0::1;:24:::0;68134:51:::1;;;::::0;-1:-1:-1;;;68134:51:0;;28857:2:1;68134:51:0::1;::::0;::::1;28839:21:1::0;28896:2;28876:18;;;28869:30;-1:-1:-1;;;28915:18:1;;;28908:44;28969:18;;68134:51:0::1;28655:338:1::0;68134:51:0::1;68204:10;::::0;;;:7:::1;:10;::::0;;;;:23;;-1:-1:-1;;;;;;68204:23:0::1;68225:1;68204:23;::::0;;68072:341:::1;;;68299:4;:15;;;68289:25;;:6;:25;68281:52;;;::::0;-1:-1:-1;;;68281:52:0;;29200:2:1;68281:52:0::1;::::0;::::1;29182:21:1::0;29239:2;29219:18;;;29212:30;-1:-1:-1;;;29258:18:1;;;29251:44;29312:18;;68281:52:0::1;28998:338:1::0;68281:52:0::1;68352:45;68362:17:::0;;68380:8:::1;68382:6:::0;68380:1;:8:::1;:::i;:::-;68362:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;68391:1;68352:45;;;;;;;;;;;::::0;:9:::1;:45::i;:::-;68052:3:::0;::::1;::::0;::::1;:::i;:::-;;;;68012:412;;;-1:-1:-1::0;68434:18:0::1;::::0;::::1;:54:::0;;68463:17;;68434:18;:54:::1;::::0;68463:17;;68434:54:::1;:::i;:::-;;;::::0;;-1:-1:-1;68501:10:0::1;:19:::0;;68523:4;;68501:10;68512:7;;68501:19;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;:26;;:19;::::1;:26:::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;68501:26:0;;;;;;;::::1;;::::0;;::::1;;;-1:-1:-1::0;;68501:26:0;-1:-1:-1;;;68501:26:0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;68501:26:0;;;;;-1:-1:-1;;;68501:26:0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;68501:26:0::1;-1:-1:-1::0;;;68501:26:0;;;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;;;;;;67691:844:0:o;77786:348::-;6487:6;;-1:-1:-1;;;;;6487:6:0;2785:10;6634:23;6626:45;;;;-1:-1:-1;;;6626:45:0;;;;;;;:::i;:::-;77898:4:::1;77923:13:::0;::::1;77915:38;;;::::0;-1:-1:-1;;;77915:38:0;;29776:2:1;77915:38:0::1;::::0;::::1;29758:21:1::0;29815:1;29795:18;;;29788:29;-1:-1:-1;;;29833:18:1;;;29826:38;29881:18;;77915:38:0::1;29574:331:1::0;77915:38:0::1;77965:12;77983:9;-1:-1:-1::0;;;;;77983:14:0::1;78005:5;-1:-1:-1::0;;;;;78005:13:0::1;;77983:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77964:59;;;78042:7;78034:31;;;::::0;-1:-1:-1;;;78034:31:0;;30322:2:1;78034:31:0::1;::::0;::::1;30304:21:1::0;30361:2;30341:18;;;30334:30;-1:-1:-1;;;30380:18:1;;;30373:41;30431:18;;78034:31:0::1;30120:335:1::0;38924:291:0;39099:41;2785:10;39132:7;39099:18;:41::i;:::-;39091:66;;;;-1:-1:-1;;;39091:66:0;;18746:2:1;39091:66:0;;;18728:21:1;18785:2;18765:18;;;18758:30;-1:-1:-1;;;18804:18:1;;;18797:42;18856:18;;39091:66:0;18544:336:1;39091:66:0;39168:39;39182:4;39188:2;39192:7;39201:5;39168:13;:39::i;73873:338::-;4570:1;5168:7;;:19;;5160:41;;;;-1:-1:-1;;;5160:41:0;;30662:2:1;5160:41:0;;;30644:21:1;30701:1;30681:18;;;30674:29;-1:-1:-1;;;30719:18:1;;;30712:39;30768:18;;5160:41:0;30460:332:1;5160:41:0;4570:1;5279:7;:18;59402:12:::1;::::0;-1:-1:-1;;;;;59402:12:0::1;2785:10:::0;-1:-1:-1;;;;;59386:28:0::1;;59382:85;;59438:17;;-1:-1:-1::0;;;59438:17:0::1;;;;;;;;;;;59382:85;74020:9:::2;59546:25;59561:9;59546:14;:25::i;:::-;59541:85;;59595:19;;-1:-1:-1::0;;;59595:19:0::2;;;;;;;;;;;59541:85;74047:16:::3;74078:10;;74066:9;:22;;;;:::i;:::-;74047:41;;74099:16;74135:10;;74123:9;:22;;;;:::i;:::-;74122:26;::::0;74147:1:::3;74122:26;:::i;:::-;74118:30;::::0;:1:::3;:30;:::i;:::-;74099:49;;74159:44;74173:8;74183;74193:1;74196::::0;74199:3:::3;74159:13;:44::i;:::-;-1:-1:-1::0;;4526:1:0;5458:7;:22;-1:-1:-1;;;;73873:338:0:o;64732:112::-;6487:6;;-1:-1:-1;;;;;6487:6:0;2785:10;6634:23;6626:45;;;;-1:-1:-1;;;6626:45:0;;;;;;;:::i;:::-;64805:12:::1;:31:::0;;-1:-1:-1;;;;;;64805:31:0::1;-1:-1:-1::0;;;;;64805:31:0;;;::::1;::::0;;;::::1;::::0;;64732:112::o;70386:694::-;40752:4;40776:16;;;:7;:16;;;;;;70460:13;;40803:1;-1:-1:-1;;;;;40776:16:0;;;:29;70486:40;;;;-1:-1:-1;;;70486:40:0;;31546:2:1;70486:40:0;;;31528:21:1;31585:2;31565:18;;;31558:30;-1:-1:-1;;;31604:18:1;;;31597:40;31654:18;;70486:40:0;31344:334:1;70486:40:0;70537:20;70560:18;70569:8;70560;:18::i;:::-;70537:41;;70589:21;70613:12;70626:4;:14;;;70613:28;;;;;;;;;;:::i;:::-;;;;;;;;70589:52;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70655:9;;70668:1;70655:14;70652:421;;;70735:7;70718:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;70686:83;;;;70386:694;;;:::o;70652:421::-;70802:7;70823:4;:15;;;70812:26;;:8;:26;;;;:::i;:::-;70802:36;;70894:4;:15;;;70878:4;:13;;;:31;;;;:::i;:::-;70858:52;;70871:2;70859:9;;:14;;;;:::i;:::-;70858:52;;;;:::i;:::-;70853:57;;70931:4;:15;;;70925:21;;;;;;;:::i;:::-;;;71010:7;71032:13;:2;:11;:13::i;:::-;70993:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70961:100;;;;;70386:694;;;:::o;73294:571::-;73462:4;64487:15;64463:21;;:39;64455:65;;;;-1:-1:-1;;;64455:65:0;;26847:2:1;64455:65:0;;;26829:21:1;26886:2;26866:18;;;26859:30;-1:-1:-1;;;26905:18:1;;;26898:43;26958:18;;64455:65:0;26645:337:1;64455:65:0;64686:7:::1;::::0;::::1;;64685:8;64677:27;;;::::0;-1:-1:-1;;;64677:27:0;;32962:2:1;64677:27:0::1;::::0;::::1;32944:21:1::0;33001:1;32981:18;;;32974:29;-1:-1:-1;;;33019:18:1;;;33012:36;33065:18;;64677:27:0::1;32760:329:1::0;64677:27:0::1;73484:16:::2;73515:10;;73503:9;:22;;;;:::i;:::-;73484:41;;73536:16;73572:10;;73560:9;:22;;;;:::i;:::-;73559:26;::::0;73584:1:::2;73559:26;:::i;:::-;73555:30;::::0;:1:::2;:30;:::i;:::-;73536:49;;73596:20;73619:10;73630:8;73619:20;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;73596:43:::2;::::0;;::::2;::::0;::::2;::::0;;73619:20;;;::::2;73596:43:::0;::::2;::::0;::::2;::::0;;::::2;;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;;;;-1:-1:-1;;;73596:43:0;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;;;73596:43:0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;73596:43:0;::::2;::::0;;::::2;::::0;;;;;;;;-1:-1:-1;73596:43:0;;73669:36:::2;::::0;73596:43;73669:36:::2;:::i;:::-;:40;;;;:::i;:::-;73724:12;::::0;73650:59:::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;;73724:12:0::2;:26:::0;;:69:::2;;-1:-1:-1::0;73776:13:0::2;::::0;::::2;::::0;:17:::2;::::0;73792:1:::2;73776:17;:::i;:::-;73754:39;;:19;73765:8:::0;73754;:19:::2;:::i;:::-;:39;73724:69;73720:114;;;-1:-1:-1::0;73817:5:0::2;::::0;73294:571;-1:-1:-1;;;;;73294:571:0:o;73720:114::-:2;73853:4;73846:11;;;;;;64715:1;73294:571:::0;;;:::o;78278:105::-;78322:13;78355:20;78348:27;;;;;:::i;67192:99::-;6487:6;;-1:-1:-1;;;;;6487:6:0;2785:10;6634:23;6626:45;;;;-1:-1:-1;;;6626:45:0;;;;;;;:::i;:::-;64590:9:::1;::::0;:14;64582:35:::1;;;;-1:-1:-1::0;;;64582:35:0::1;;;;;;;:::i;:::-;67271:12:::2;67256;:27:::0;67192:99::o;65328:709::-;6487:6;;-1:-1:-1;;;;;6487:6:0;2785:10;6634:23;6626:45;;;;-1:-1:-1;;;6626:45:0;;;;;;;:::i;:::-;64272:13:::1;:11;:13::i;:::-;:18:::0;;:107:::1;;;64318:15;64294:21;;:39;:85;;;;;64364:15;64337:24;;:42;64294:85;64264:127;;;::::0;-1:-1:-1;;;64264:127:0;;22752:2:1;64264:127:0::1;::::0;::::1;22734:21:1::0;22791:1;22771:18;;;22764:29;-1:-1:-1;;;22809:18:1;;;22802:37;22856:18;;64264:127:0::1;22550:330:1::0;64264:127:0::1;65418:14:::2;65451:6:::0;65447:376:::2;65463:16:::0;;::::2;65447:376;;;65531:1;65509:5;;65515:1;65509:8;;;;;;;:::i;:::-;:18;::::0;::::2;:8;::::0;;::::2;;:18:::0;;::::2;::::0;-1:-1:-1;65509:18:0::2;:::i;:::-;:23;;;65501:45;;;::::0;-1:-1:-1;;;65501:45:0;;33544:2:1;65501:45:0::2;::::0;::::2;33526:21:1::0;33583:1;33563:18;;;33556:29;-1:-1:-1;;;33601:18:1;;;33594:39;33650:18;;65501:45:0::2;33342:332:1::0;65501:45:0::2;65568:10;;65564:1;:14;65561:184;;;65615:5;;65621:1;65615:8;;;;;;;:::i;:::-;;;;;;65599:10;65610:1;65599:13;;;;;;;;:::i;:::-;;;;;;;;:24;;;;;;:::i;:::-;;;;65561:184;;;65664:10;65680:5;;65686:1;65680:8;;;;;;;:::i;:::-;65664:25:::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;65664:25:0;;;::::2;::::0;;;65680:8:::2;::::0;;::::2;::::0;;;::::2;::::0;65664:25;;;::::2;::::0;-1:-1:-1;65664:25:0::2;65680:8:::0;65664:25;::::2;:::i;:::-;-1:-1:-1::0;;65708:12:0::2;:21:::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;65708:21:0;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;;;;::::2;::::0;::::2;:::i;:::-;;65561:184;65792:5;;65798:1;65792:8;;;;;;;:::i;:::-;;;;;;:19;;;;;;;;;;:::i;:::-;65772:5;;65778:1;65772:8;;;;;;;:::i;:::-;;;;;;:17;;;;;;;;;;:::i;:::-;:39;;;;:::i;:::-;65759:52;::::0;::::2;;::::0;::::2;:::i;:::-;::::0;-1:-1:-1;65481:3:0;::::2;::::0;::::2;:::i;:::-;;;;65447:376;;;;65843:116;65849:10;:17:::0;:32;-1:-1:-1;65843:116:0::2;;;65898:10;:16;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;-1:-1:-1;;65898:16:0;;;;;-1:-1:-1;;65898:16:0;;;;;;65929:12:::2;:18:::0;;;::::2;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;65843:116;;;65971:10;:25:::0;;;;66007:10:::2;:22:::0;-1:-1:-1;65328:709:0:o;76922:476::-;77176:13;;-1:-1:-1;;;;;77206:33:0;;;77047:4;77206:33;;;:26;:33;;;;;;77047:4;;77176:13;;;;;77206:33;;77205:34;:87;;;;-1:-1:-1;77251:28:0;;-1:-1:-1;;;77251:28:0;;-1:-1:-1;;;;;1788:32:1;;;77251:28:0;;;1770:51:1;77243:49:0;;;;77251:21;;;;;;1743:18:1;;77251:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;77243:49:0;;77205:87;77201:131;;;77316:4;77309:11;;;;;77201:131;-1:-1:-1;;;;;38185:25:0;;;38161:4;38185:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;77351:39;77344:46;76922:476;-1:-1:-1;;;;76922:476:0:o;7300:172::-;6487:6;;-1:-1:-1;;;;;6487:6:0;2785:10;6634:23;6626:45;;;;-1:-1:-1;;;6626:45:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7389:22:0;::::1;7381:44;;;::::0;-1:-1:-1;;;7381:44:0;;36088:2:1;7381:44:0::1;::::0;::::1;36070:21:1::0;36127:1;36107:18;;;36100:29;-1:-1:-1;;;36145:18:1;;;36138:39;36194:18;;7381:44:0::1;35886:332:1::0;7381:44:0::1;7436:28;7455:8;7436:18;:28::i;:::-;7300:172:::0;:::o;44508:174::-;44583:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;44583:29:0;-1:-1:-1;;;;;44583:29:0;;;;;;;;:24;;44637:23;44583:24;44637:14;:23::i;:::-;-1:-1:-1;;;;;44628:46:0;;;;;;;;;;;44508:174;;:::o;58621:463::-;58799:4;-1:-1:-1;;;;;58824:20:0;;58816:47;;;;-1:-1:-1;;;58816:47:0;;36425:2:1;58816:47:0;;;36407:21:1;36464:2;36444:18;;;36437:30;-1:-1:-1;;;36483:18:1;;;36476:44;36537:18;;58816:47:0;36223:338:1;58816:47:0;58917:159;58945:47;58964:27;58984:6;58964:19;:27::i;:::-;58945:18;:47::i;:::-;58917:159;;;;;;;;;;;;36793:25:1;;;;36866:4;36854:17;;36834:18;;;36827:45;36888:18;;;36881:34;;;36931:18;;;36924:34;;;36765:19;;58917:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58894:182:0;:6;-1:-1:-1;;;;;58894:182:0;;58874:202;;58621:463;;;;;;;:::o;51987:98::-;52045:7;52072:5;52076:1;52072;:5;:::i;:::-;52065:12;51987:98;-1:-1:-1;;;51987:98:0:o;68630:203::-;68689:7;68709:20;68732:10;68743:7;68732:19;;;;;;;;:::i;:::-;;;;;;;;;;68709:42;;;;;;;;68732:19;;;;68709:42;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68709:42:0;;;;;;;;;;-1:-1:-1;;;68709:42:0;;;;;;;;;;-1:-1:-1;;;68709:42:0;;;;;;;;;;;;;;-1:-1:-1;68709:42:0;68769:31;;68709:42;68769:31;:::i;:::-;:52;;;;:::i;:::-;:56;;68824:1;68769:56;:::i;:::-;68762:63;;;68630:203;-1:-1:-1;;;68630:203:0:o;68923:169::-;68981:7;69001:20;69024:10;69035:7;69024:19;;;;;;;;:::i;:::-;;;;;;;;;;69001:42;;;;;;;;69024:19;;;;69001:42;;;;;;;;;;;;;;;;;;-1:-1:-1;;;69001:42:0;;;;;;;;;;;-1:-1:-1;;;69001:42:0;;;;;;;;-1:-1:-1;;;69001:42:0;;;;;;;;-1:-1:-1;69061:23:0;;61504:4;;69061:23;:::i;77467:311::-;77561:4;40776:16;;;:7;:16;;;;;;40803:1;-1:-1:-1;;;;;40776:16:0;;;:29;77578:35;;;;-1:-1:-1;;;77578:35:0;;27189:2:1;77578:35:0;;;27171:21:1;27228:1;27208:18;;;27201:29;-1:-1:-1;;;27246:18:1;;;27239:36;27292:18;;77578:35:0;26987:329:1;77578:35:0;77624:13;77640:23;77655:7;77640:14;:23::i;:::-;77624:39;;77693:5;-1:-1:-1;;;;;77682:16:0;:7;-1:-1:-1;;;;;77682:16:0;;:51;;;;77726:7;-1:-1:-1;;;;;77702:31:0;:20;77714:7;77702:11;:20::i;:::-;-1:-1:-1;;;;;77702:31:0;;77682:51;:87;;;;77737:32;77754:5;77761:7;77737:16;:32::i;43865:525::-;44024:4;-1:-1:-1;;;;;43997:31:0;:23;44012:7;43997:14;:23::i;:::-;-1:-1:-1;;;;;43997:31:0;;43989:53;;;;-1:-1:-1;;;43989:53:0;;;;;;;:::i;:::-;44074:1;-1:-1:-1;;;;;44061:15:0;;;44053:40;;;;-1:-1:-1;;;44053:40:0;;37171:2:1;44053:40:0;;;37153:21:1;37210:2;37190:18;;;37183:30;-1:-1:-1;;;37229:18:1;;;37222:42;37281:18;;44053:40:0;36969:336:1;44053:40:0;44210:29;44227:1;44231:7;44210:8;:29::i;:::-;44316:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;44316:21:0;-1:-1:-1;;;;;44316:21:0;;;;;;;;;44355:27;;44316:16;;44355:27;;;;;;;43865:525;;;:::o;59890:650::-;59961:22;60005:10;60027:4;60005:27;60001:508;;;60049:18;60070:8;;60049:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;60109:8:0;60320:17;60314:24;-1:-1:-1;;;;;60288:134:0;;-1:-1:-1;60001:508:0;;-1:-1:-1;60001:508:0;;-1:-1:-1;60486:10:0;60001:508;59890:650;:::o;74503:787::-;64686:7;;74648:12;;64686:7;;64685:8;64677:27;;;;-1:-1:-1;;;64677:27:0;;32962:2:1;64677:27:0;;;32944:21:1;33001:1;32981:18;;;32974:29;-1:-1:-1;;;33019:18:1;;;33012:36;33065:18;;64677:27:0;32760:329:1;64677:27:0;74691:10:::1;;74681:7;:20;74673:41;;;;-1:-1:-1::0;;;74673:41:0::1;;;;;;;:::i;:::-;74727:20;74750:10;74761:7;74750:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;74727:42:::1;::::0;;::::1;::::0;::::1;::::0;;74750:19;;;::::1;74727:42:::0;::::1;::::0;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;74727:42:0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;74727:42:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;74727:42:0;;::::1;;::::0;;;;;-1:-1:-1;74801:17:0::1;74809:9:::0;74801:5;:17:::1;:::i;:::-;74780:38:::0;-1:-1:-1;74780:38:0;74837:16:::1;:14:::0;74852:1:::1;74837:16;:::i;:::-;:29;74829:49;;;::::0;-1:-1:-1;;;74829:49:0;;37512:2:1;74829:49:0::1;::::0;::::1;37494:21:1::0;37551:1;37531:18;;;37524:29;-1:-1:-1;;;37569:18:1;;;37562:37;37616:18;;74829:49:0::1;37310:330:1::0;74829:49:0::1;74891:16;74949:1;74928:4;:18;;;74910:4;:15;;;:36;;;;:::i;:::-;:40;;;;:::i;:::-;74891:59;;;;74996:4;:13;;;75012:1;74996:17;;;;:::i;:::-;74969:44;;74992:1;74969:20;74980:9:::0;74969:8;:20:::1;:::i;:::-;:24;;;;:::i;:::-;:44;74961:65;;;;-1:-1:-1::0;;;74961:65:0::1;;;;;;;:::i;:::-;75043:9;75039:125;75062:9;75058:1;:13;75039:125;;;75093:34;75103:9;75114:8;75093:34;;;;;;;;;;;::::0;:9:::1;:34::i;:::-;75142:10:::0;::::1;::::0;::::1;:::i;:::-;;;;75073:3;;;;;:::i;:::-;;;;75039:125;;;;75205:9;75176:4;:18;;:39;;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;75226:10:0::1;:19:::0;;75248:4;;75226:10;75237:7;;75226:19;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;:26;;:19;::::1;:26:::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;75226:26:0;;;;;;;::::1;;::::0;;::::1;;;-1:-1:-1::0;;75226:26:0;-1:-1:-1;;;75226:26:0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;75226:26:0;;;;;-1:-1:-1;;;75226:26:0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;75226:26:0::1;-1:-1:-1::0;;;75226:26:0;;;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;75272:10:0;74503:787;-1:-1:-1;;;;;;;74503:787:0:o;75298:854::-;75416:22;75400:5;75416:22;63133:13;:26;;;:54;;;;;;;;:::i;:::-;;63130:1072;;63204:32;63286:23;63256:13;:26;;;:53;;;;;;;;:::i;:::-;;63253:587;;;63448:27;;;;63352:184;;;;63448:27;63522:10;;63352:184;;;:::i;:::-;;;;;;;;;;;;;63330:206;;63253:587;;;63695:20;;63738:25;;;;63599:225;;;;63695:20;63738:25;63810:10;;63599:225;;;:::i;:::-;;;;;;;;;;;;;63577:247;;63253:587;63856:12;63881:19;63871:30;;;;;;63856:45;;63994:153;64004:4;64036:13;:18;;;64082:13;:18;;;64128:13;:18;;;63994:153;;;;;;;;;;;;;;;;;36793:25:1;;;36866:4;36854:17;;;;36849:2;36834:18;;36827:45;36903:2;36888:18;;36881:34;36946:2;36931:18;;36924:34;36780:3;36765:19;;36566:398;63994:153:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63994:153:0;;-1:-1:-1;;63994:153:0;;63944:24;;-1:-1:-1;;;;;63944:24:0;;;:203;;;;-1:-1:-1;63918:272:0;;;;-1:-1:-1;;;63918:272:0;;39375:2:1;63918:272:0;;;39357:21:1;39414:1;39394:18;;;39387:29;-1:-1:-1;;;39432:18:1;;;39425:37;39479:18;;63918:272:0;39173:330:1;63918:272:0;63189:1013;;63130:1072;75474:10:::1;::::0;75459:12;;:25:::1;75451:46;;;;-1:-1:-1::0;;;75451:46:0::1;;;;;;;:::i;:::-;75510:21;75550:6:::0;75546:378:::1;75566:14;:21:::0;75562:25;::::1;:62:::0;::::1;;;;75610:5;:14;;;75591:16;:33;75562:62;75546:378;;;75646:18;75667:14;75682:1;75667:17;;;;;;;;:::i;:::-;;;;;;;;;75646:38;;75740:1;75727:10;75702:5;:19;;;75722:1;75702:22;;;;;;;;:::i;:::-;;;;;;;:35;:39;75699:214;;;75789:5;:19;;;75809:1;75789:22;;;;;;;;:::i;:::-;;;;;;;75787:24;75775:10;:36;75762:49;;75830:18;;;;;:::i;:::-;;;;75887:10;75867:14;75882:1;75867:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:30:::0;75699:214:::1;-1:-1:-1::0;75626:3:0;::::1;::::0;::::1;:::i;:::-;;;;75546:378;;;;75964:5;:14;;;75944:16;:34;;75936:58;;;::::0;-1:-1:-1;;;75936:58:0;;39710:2:1;75936:58:0::1;::::0;::::1;39692:21:1::0;39749:2;39729:18;;;39722:30;-1:-1:-1;;;39768:18:1;;;39761:41;39819:18;;75936:58:0::1;39508:335:1::0;75936:58:0::1;76005:13;76021:25;76033:5;:12;;;76021:11;:25::i;:::-;76005:41;;76064:80;76078:5;:12;;;76092:5;:14;;;76108:15;76125:5;76132:11;:9;:11::i;76064:80::-;76057:87:::0;75298:854;-1:-1:-1;;;;;;75298:854:0:o;7632:191::-;7725:6;;;-1:-1:-1;;;;;7742:17:0;;;-1:-1:-1;;;;;;7742:17:0;;;;;;;7775:40;;7725:6;;;7742:17;7725:6;;7775:40;;7706:16;;7775:40;7695:128;7632:191;:::o;44824:305::-;44979:8;-1:-1:-1;;;;;44970:17:0;:5;-1:-1:-1;;;;;44970:17:0;;;44962:45;;;;-1:-1:-1;;;44962:45:0;;40050:2:1;44962:45:0;;;40032:21:1;40089:2;40069:18;;;40062:30;-1:-1:-1;;;40108:18:1;;;40101:45;40163:18;;44962:45:0;39848:339:1;44962:45:0;-1:-1:-1;;;;;45018:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;45018:46:0;;;;;;;;;;45080:41;;636::1;;;45080::0;;609:18:1;45080:41:0;;;;;;;44824:305;;;:::o;41969:283::-;42099:18;42105:2;42109:7;42099:5;:18::i;:::-;42150:54;42181:1;42185:2;42189:7;42198:5;42150:22;:54::i;:::-;42128:116;;;;-1:-1:-1;;;42128:116:0;;;;;;;:::i;40097:277::-;40254:28;40264:4;40270:2;40274:7;40254:9;:28::i;:::-;40301:48;40324:4;40330:2;40334:7;40343:5;40301:22;:48::i;:::-;40293:73;;;;-1:-1:-1;;;40293:73:0;;;;;;;:::i;69925:390::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70046:6:0;70042:205;70062:10;;70058:1;:14;70042:205;;;70101:10;70112:1;70101:13;;;;;;;;:::i;:::-;;;;;;;;;;70094:20;;;;;;;;70101:13;;;;70094:20;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;70094:20:0;;;;;;;;;;-1:-1:-1;;;70094:20:0;;;;;;;;-1:-1:-1;;;70094:20:0;;;;;;;;;;;-1:-1:-1;70132:27:0;-1:-1:-1;70132:27:0;;;:56;;;70180:8;70163:4;:13;;;:25;;;;70132:56;70129:107;;;-1:-1:-1;70216:4:0;69925:390;-1:-1:-1;;69925:390:0:o;70129:107::-;70074:3;;;;:::i;:::-;;;;70042:205;;;-1:-1:-1;70257:28:0;;-1:-1:-1;;;70257:28:0;;31546:2:1;70257:28:0;;;31528:21:1;31585:2;31565:18;;;31558:30;-1:-1:-1;;;31604:18:1;;;31597:40;31654:18;;70257:28:0;31344:334:1;424:723:0;480:13;701:10;697:53;;-1:-1:-1;;728:10:0;;;;;;;;;;;;-1:-1:-1;;;728:10:0;;;;;424:723::o;697:53::-;775:5;760:12;816:78;823:9;;816:78;;849:8;;;;:::i;:::-;;-1:-1:-1;872:10:0;;-1:-1:-1;880:2:0;872:10;;:::i;:::-;;;816:78;;;904:19;936:6;-1:-1:-1;;;;;926:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;926:17:0;;904:39;;954:154;961:10;;954:154;;988:11;998:1;988:11;;:::i;:::-;;-1:-1:-1;1057:10:0;1065:2;1057:5;:10;:::i;:::-;1044:24;;:2;:24;:::i;:::-;1031:39;;1014:6;1021;1014:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1014:56:0;;;;;;;;-1:-1:-1;1085:11:0;1094:2;1085:11;;:::i;:::-;;;954:154;;58088:410;58198:7;56310:100;;;;;;;;;;;;;;;;;56290:127;;;;;;;58352:12;;58387:11;;;;58431:24;;;;;58421:35;;;;;;58271:204;;;;;40764:25:1;;;40820:2;40805:18;;40798:34;;;;-1:-1:-1;;;;;40868:32:1;40863:2;40848:18;;40841:60;40932:2;40917:18;;40910:34;40751:3;40736:19;;40533:417;58271:204:0;;;;;;;;;;;;;58243:247;;;;;;58223:267;;58088:410;;;:::o;49168:258::-;49267:7;49369:20;48607:15;;;48529:101;49369:20;49340:63;;-1:-1:-1;;;49340:63:0;;;41213:27:1;41256:11;;;41249:27;;;;41292:12;;;41285:28;;;41329:12;;49340:63:0;40955:392:1;42588:349:0;42681:1;-1:-1:-1;;;;;42668:15:0;;;42660:40;;;;-1:-1:-1;;;42660:40:0;;37171:2:1;42660:40:0;;;37153:21:1;37210:2;37190:18;;;37183:30;-1:-1:-1;;;37229:18:1;;;37222:42;37281:18;;42660:40:0;36969:336:1;42660:40:0;40752:4;40776:16;;;:7;:16;;;;;;40803:1;-1:-1:-1;;;;;40776:16:0;;;:29;42719:17;42711:44;;;;-1:-1:-1;;;42711:44:0;;41554:2:1;42711:44:0;;;41536:21:1;41593:2;41573:18;;;41566:30;-1:-1:-1;;;41612:18:1;;;41605:44;41666:18;;42711:44:0;41352:338:1;42711:44:0;42857:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;42857:21:0;-1:-1:-1;;;;;42857:21:0;;;;;;;;42896:33;;42857:16;;;42896:33;;42857:16;;42896:33;42588:349;;:::o;45694:761::-;45849:4;-1:-1:-1;;;;;45870:13:0;;25971:20;26019:8;45866:582;;45906:72;;-1:-1:-1;;;45906:72:0;;-1:-1:-1;;;;;45906:36:0;;;;;:72;;2785:10;;45957:4;;45963:7;;45972:5;;45906:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45906:72:0;;;;;;;;-1:-1:-1;;45906:72:0;;;;;;;;;;;;:::i;:::-;;;45902:491;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46148:13:0;;46144:234;;46191:22;;-1:-1:-1;;;46191:22:0;;;;;;;:::i;46144:234::-;46328:6;46322:13;46313:6;46309:2;46305:15;46298:38;45902:491;-1:-1:-1;;;;;;46029:51:0;-1:-1:-1;;;46029:51:0;;-1:-1:-1;46022:58:0;;45866:582;-1:-1:-1;46432:4:0;45694:761;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;688:258::-;760:1;770:113;784:6;781:1;778:13;770:113;;;860:11;;;854:18;841:11;;;834:39;806:2;799:10;770:113;;;901:6;898:1;895:13;892:48;;;-1:-1:-1;;936:1:1;918:16;;911:27;688:258::o;951:::-;993:3;1031:5;1025:12;1058:6;1053:3;1046:19;1074:63;1130:6;1123:4;1118:3;1114:14;1107:4;1100:5;1096:16;1074:63;:::i;:::-;1191:2;1170:15;-1:-1:-1;;1166:29:1;1157:39;;;;1198:4;1153:50;;951:258;-1:-1:-1;;951:258:1:o;1214:220::-;1363:2;1352:9;1345:21;1326:4;1383:45;1424:2;1413:9;1409:18;1401:6;1383:45;:::i;1439:180::-;1498:6;1551:2;1539:9;1530:7;1526:23;1522:32;1519:52;;;1567:1;1564;1557:12;1519:52;-1:-1:-1;1590:23:1;;1439:180;-1:-1:-1;1439:180:1:o;1832:131::-;-1:-1:-1;;;;;1907:31:1;;1897:42;;1887:70;;1953:1;1950;1943:12;1968:315;2036:6;2044;2097:2;2085:9;2076:7;2072:23;2068:32;2065:52;;;2113:1;2110;2103:12;2065:52;2152:9;2139:23;2171:31;2196:5;2171:31;:::i;:::-;2221:5;2273:2;2258:18;;;;2245:32;;-1:-1:-1;;;1968:315:1:o;2288:127::-;2349:10;2344:3;2340:20;2337:1;2330:31;2380:4;2377:1;2370:15;2404:4;2401:1;2394:15;2420:255;2492:2;2486:9;2534:6;2522:19;;-1:-1:-1;;;;;2556:34:1;;2592:22;;;2553:62;2550:88;;;2618:18;;:::i;:::-;2654:2;2647:22;2420:255;:::o;2680:275::-;2751:2;2745:9;2816:2;2797:13;;-1:-1:-1;;2793:27:1;2781:40;;-1:-1:-1;;;;;2836:34:1;;2872:22;;;2833:62;2830:88;;;2898:18;;:::i;:::-;2934:2;2927:22;2680:275;;-1:-1:-1;2680:275:1:o;2960:530::-;3002:5;3055:3;3048:4;3040:6;3036:17;3032:27;3022:55;;3073:1;3070;3063:12;3022:55;3109:6;3096:20;-1:-1:-1;;;;;3131:2:1;3128:26;3125:52;;;3157:18;;:::i;:::-;3201:55;3244:2;3225:13;;-1:-1:-1;;3221:27:1;3250:4;3217:38;3201:55;:::i;:::-;3281:2;3272:7;3265:19;3327:3;3320:4;3315:2;3307:6;3303:15;3299:26;3296:35;3293:55;;;3344:1;3341;3334:12;3293:55;3409:2;3402:4;3394:6;3390:17;3383:4;3374:7;3370:18;3357:55;3457:1;3432:16;;;3450:4;3428:27;3421:38;;;;3436:7;2960:530;-1:-1:-1;;;2960:530:1:o;3495:114::-;3579:4;3572:5;3568:16;3561:5;3558:27;3548:55;;3599:1;3596;3589:12;3614:130;3680:20;;3709:29;3680:20;3709:29;:::i;3749:730::-;3851:6;3859;3867;3875;3883;3936:3;3924:9;3915:7;3911:23;3907:33;3904:53;;;3953:1;3950;3943:12;3904:53;3992:9;3979:23;4011:31;4036:5;4011:31;:::i;:::-;4061:5;-1:-1:-1;4117:2:1;4102:18;;4089:32;-1:-1:-1;;;;;4133:30:1;;4130:50;;;4176:1;4173;4166:12;4130:50;4199:49;4240:7;4231:6;4220:9;4216:22;4199:49;:::i;:::-;4189:59;;;4295:2;4284:9;4280:18;4267:32;4257:42;;4346:2;4335:9;4331:18;4318:32;4308:42;;4402:3;4391:9;4387:19;4374:33;4416:31;4439:7;4416:31;:::i;:::-;4466:7;4456:17;;;3749:730;;;;;;;;:::o;4889:118::-;4975:5;4968:13;4961:21;4954:5;4951:32;4941:60;;4997:1;4994;4987:12;5012:241;5068:6;5121:2;5109:9;5100:7;5096:23;5092:32;5089:52;;;5137:1;5134;5127:12;5089:52;5176:9;5163:23;5195:28;5217:5;5195:28;:::i;5258:1234::-;5429:2;5440:21;;;5532:13;;5564:4;5584:18;;;5577:30;;;5656:19;;5499:3;5484:19;;5684:22;;;5400:4;;5429:2;5764:21;;;5400:4;;5737:3;5722:19;;;5813:414;5827:6;5824:1;5821:13;5813:414;;;5886:13;;5924:9;;5912:22;;5974:11;;;5968:18;5954:12;;;5947:40;6010:4;6054:11;;;6048:18;6034:12;;;6027:40;6090:4;6134:11;;;6128:18;6114:12;;;6107:40;6202:15;;;;5849:1;5842:9;;;;;6167:12;;;;5813:414;;;5817:3;6283:2;6275:6;6271:15;6265:22;6258:4;6247:9;6243:20;6236:52;6344:4;6336:6;6332:17;6326:24;6319:4;6308:9;6304:20;6297:54;6400:4;6392:6;6388:17;6382:24;6360:46;;6415:51;6462:2;6451:9;6447:18;6431:14;470:13;463:21;451:34;;400:91;6415:51;6483:3;5258:1234;-1:-1:-1;;;;;;;5258:1234:1:o;6679:456::-;6756:6;6764;6772;6825:2;6813:9;6804:7;6800:23;6796:32;6793:52;;;6841:1;6838;6831:12;6793:52;6880:9;6867:23;6899:31;6924:5;6899:31;:::i;:::-;6949:5;-1:-1:-1;7006:2:1;6991:18;;6978:32;7019:33;6978:32;7019:33;:::i;:::-;6679:456;;7071:7;;-1:-1:-1;;;7125:2:1;7110:18;;;;7097:32;;6679:456::o;7140:247::-;7199:6;7252:2;7240:9;7231:7;7227:23;7223:32;7220:52;;;7268:1;7265;7258:12;7220:52;7307:9;7294:23;7326:31;7351:5;7326:31;:::i;7392:388::-;7476:8;7486:6;7540:3;7533:4;7525:6;7521:17;7517:27;7507:55;;7558:1;7555;7548:12;7507:55;-1:-1:-1;7581:20:1;;-1:-1:-1;;;;;7613:30:1;;7610:50;;;7656:1;7653;7646:12;7610:50;7693:4;7685:6;7681:17;7669:29;;7753:3;7746:4;7736:6;7733:1;7729:14;7721:6;7717:27;7713:38;7710:47;7707:67;;;7770:1;7767;7760:12;7707:67;7392:388;;;;;:::o;7785:490::-;7903:6;7911;7964:2;7952:9;7943:7;7939:23;7935:32;7932:52;;;7980:1;7977;7970:12;7932:52;8020:9;8007:23;-1:-1:-1;;;;;8045:6:1;8042:30;8039:50;;;8085:1;8082;8075:12;8039:50;8124:91;8207:7;8198:6;8187:9;8183:22;8124:91;:::i;:::-;8234:8;;8098:117;;-1:-1:-1;7785:490:1;-1:-1:-1;;;;7785:490:1:o;8280:248::-;8348:6;8356;8409:2;8397:9;8388:7;8384:23;8380:32;8377:52;;;8425:1;8422;8415:12;8377:52;-1:-1:-1;;8448:23:1;;;8518:2;8503:18;;;8490:32;;-1:-1:-1;8280:248:1:o;9738:121::-;9823:10;9816:5;9812:22;9805:5;9802:33;9792:61;;9849:1;9846;9839:12;9864:313;9931:6;9939;9992:2;9980:9;9971:7;9967:23;9963:32;9960:52;;;10008:1;10005;9998:12;9960:52;10044:9;10031:23;10021:33;;10104:2;10093:9;10089:18;10076:32;10117:30;10141:5;10117:30;:::i;:::-;10166:5;10156:15;;;9864:313;;;;;:::o;10714:592::-;10785:6;10793;10846:2;10834:9;10825:7;10821:23;10817:32;10814:52;;;10862:1;10859;10852:12;10814:52;10902:9;10889:23;-1:-1:-1;;;;;10972:2:1;10964:6;10961:14;10958:34;;;10988:1;10985;10978:12;10958:34;11026:6;11015:9;11011:22;11001:32;;11071:7;11064:4;11060:2;11056:13;11052:27;11042:55;;11093:1;11090;11083:12;11042:55;11133:2;11120:16;11159:2;11151:6;11148:14;11145:34;;;11175:1;11172;11165:12;11145:34;11220:7;11215:2;11206:6;11202:2;11198:15;11194:24;11191:37;11188:57;;;11241:1;11238;11231:12;11188:57;11272:2;11264:11;;;;;11294:6;;-1:-1:-1;10714:592:1;;-1:-1:-1;;;;10714:592:1:o;11311:382::-;11376:6;11384;11437:2;11425:9;11416:7;11412:23;11408:32;11405:52;;;11453:1;11450;11443:12;11405:52;11492:9;11479:23;11511:31;11536:5;11511:31;:::i;:::-;11561:5;-1:-1:-1;11618:2:1;11603:18;;11590:32;11631:30;11590:32;11631:30;:::i;11698:663::-;11811:6;11819;11827;11835;11843;11896:3;11884:9;11875:7;11871:23;11867:33;11864:53;;;11913:1;11910;11903:12;11864:53;11949:9;11936:23;11926:33;;12006:2;11995:9;11991:18;11978:32;11968:42;;12057:2;12046:9;12042:18;12029:32;12019:42;;12112:2;12101:9;12097:18;12084:32;-1:-1:-1;;;;;12131:6:1;12128:30;12125:50;;;12171:1;12168;12161:12;12125:50;12210:91;12293:7;12284:6;12273:9;12269:22;12210:91;:::i;:::-;11698:663;;;;-1:-1:-1;11698:663:1;;-1:-1:-1;12320:8:1;;12184:117;11698:663;-1:-1:-1;;;11698:663:1:o;12366:665::-;12461:6;12469;12477;12485;12538:3;12526:9;12517:7;12513:23;12509:33;12506:53;;;12555:1;12552;12545:12;12506:53;12594:9;12581:23;12613:31;12638:5;12613:31;:::i;:::-;12663:5;-1:-1:-1;12720:2:1;12705:18;;12692:32;12733:33;12692:32;12733:33;:::i;:::-;12785:7;-1:-1:-1;12839:2:1;12824:18;;12811:32;;-1:-1:-1;12894:2:1;12879:18;;12866:32;-1:-1:-1;;;;;12910:30:1;;12907:50;;;12953:1;12950;12943:12;12907:50;12976:49;13017:7;13008:6;12997:9;12993:22;12976:49;:::i;:::-;12966:59;;;12366:665;;;;;;;:::o;13036:315::-;13104:6;13112;13165:2;13153:9;13144:7;13140:23;13136:32;13133:52;;;13181:1;13178;13171:12;13133:52;13217:9;13204:23;13194:33;;13277:2;13266:9;13262:18;13249:32;13290:31;13315:5;13290:31;:::i;13630:646::-;13744:6;13752;13805:2;13793:9;13784:7;13780:23;13776:32;13773:52;;;13821:1;13818;13811:12;13773:52;13861:9;13848:23;-1:-1:-1;;;;;13931:2:1;13923:6;13920:14;13917:34;;;13947:1;13944;13937:12;13917:34;13985:6;13974:9;13970:22;13960:32;;14030:7;14023:4;14019:2;14015:13;14011:27;14001:55;;14052:1;14049;14042:12;14001:55;14092:2;14079:16;14118:2;14110:6;14107:14;14104:34;;;14134:1;14131;14124:12;14104:34;14190:7;14185:2;14177:4;14169:6;14165:17;14161:2;14157:26;14153:35;14150:48;14147:68;;;14211:1;14208;14201:12;14281:388;14349:6;14357;14410:2;14398:9;14389:7;14385:23;14381:32;14378:52;;;14426:1;14423;14416:12;14378:52;14465:9;14452:23;14484:31;14509:5;14484:31;:::i;:::-;14534:5;-1:-1:-1;14591:2:1;14576:18;;14563:32;14604:33;14563:32;14604:33;:::i;14674:380::-;14753:1;14749:12;;;;14796;;;14817:61;;14871:4;14863:6;14859:17;14849:27;;14817:61;14924:2;14916:6;14913:14;14893:18;14890:38;14887:161;;;14970:10;14965:3;14961:20;14958:1;14951:31;15005:4;15002:1;14995:15;15033:4;15030:1;15023:15;14887:161;;14674:380;;;:::o;15731:332::-;15933:2;15915:21;;;15972:1;15952:18;;;15945:29;-1:-1:-1;;;16005:2:1;15990:18;;15983:39;16054:2;16039:18;;15731:332::o;16407:432::-;-1:-1:-1;;;;;16664:15:1;;;16646:34;;16716:15;;16711:2;16696:18;;16689:43;16768:2;16763;16748:18;;16741:30;;;16589:4;;16788:45;;16814:18;;16806:6;16788:45;:::i;:::-;16780:53;16407:432;-1:-1:-1;;;;;16407:432:1:o;16844:415::-;17001:3;17039:6;17033:13;17055:53;17101:6;17096:3;17089:4;17081:6;17077:17;17055:53;:::i;:::-;17177:2;17173:15;;;;-1:-1:-1;;17169:53:1;17130:16;;;;17155:68;;;17250:2;17239:14;;16844:415;-1:-1:-1;;16844:415:1:o;17264:274::-;17393:3;17431:6;17425:13;17447:53;17493:6;17488:3;17481:4;17473:6;17469:17;17447:53;:::i;:::-;17516:16;;;;;17264:274;-1:-1:-1;;17264:274:1:o;17877:127::-;17938:10;17933:3;17929:20;17926:1;17919:31;17969:4;17966:1;17959:15;17993:4;17990:1;17983:15;18009:127;18070:10;18065:3;18061:20;18058:1;18051:31;18101:4;18098:1;18091:15;18125:4;18122:1;18115:15;18141:128;18181:3;18212:1;18208:6;18205:1;18202:13;18199:39;;;18218:18;;:::i;:::-;-1:-1:-1;18254:9:1;;18141:128::o;18274:135::-;18313:3;-1:-1:-1;;18334:17:1;;18331:43;;;18354:18;;:::i;:::-;-1:-1:-1;18401:1:1;18390:13;;18274:135::o;18414:125::-;18454:4;18482:1;18479;18476:8;18473:34;;;18487:18;;:::i;:::-;-1:-1:-1;18524:9:1;;18414:125::o;18885:127::-;18946:10;18941:3;18937:20;18934:1;18927:31;18977:4;18974:1;18967:15;19001:4;18998:1;18991:15;19017:330;19115:4;19173:11;19160:25;19267:3;19263:8;19252;19236:14;19232:29;19228:44;19208:18;19204:69;19194:97;;19287:1;19284;19277:12;19352:153;19430:20;;19479:1;19469:12;;19459:40;;19495:1;19492;19485:12;19510:213;19586:6;19639:2;19627:9;19618:7;19614:23;19610:32;19607:52;;;19655:1;19652;19645:12;19607:52;19678:39;19707:9;19678:39;:::i;20399:712::-;20453:5;20506:3;20499:4;20491:6;20487:17;20483:27;20473:55;;20524:1;20521;20514:12;20473:55;20560:6;20547:20;20586:4;-1:-1:-1;;;;;20605:2:1;20602:26;20599:52;;;20631:18;;:::i;:::-;20677:2;20674:1;20670:10;20700:28;20724:2;20720;20716:11;20700:28;:::i;:::-;20762:15;;;20832;;;20828:24;;;20793:12;;;;20864:15;;;20861:35;;;20892:1;20889;20882:12;20861:35;20928:2;20920:6;20916:15;20905:26;;20940:142;20956:6;20951:3;20948:15;20940:142;;;21022:17;;21010:30;;20973:12;;;;21060;;;;20940:142;;21116:1093;21228:9;21287:6;21279:5;21263:14;21259:26;21255:39;21252:59;;;21307:1;21304;21297:12;21252:59;21335:22;;:::i;:::-;21395:5;21382:19;21373:7;21366:36;21460:2;21453:5;21449:14;21436:28;21431:2;21422:7;21418:16;21411:54;21499:44;21539:2;21532:5;21528:14;21499:44;:::i;:::-;21494:2;21485:7;21481:16;21474:70;21591:2;21584:5;21580:14;21567:28;-1:-1:-1;;;;;21655:2:1;21647:6;21644:14;21641:34;;;21671:1;21668;21661:12;21641:34;21709:64;21758:14;21749:6;21742:5;21738:18;21709:64;:::i;:::-;21704:2;21695:7;21691:16;21684:90;21823:3;21816:5;21812:15;21799:29;21783:45;;21853:2;21843:8;21840:16;21837:36;;;21869:1;21866;21859:12;21837:36;;21908:66;21959:14;21948:8;21941:5;21937:20;21908:66;:::i;:::-;21902:3;21893:7;21889:17;21882:93;;22034:3;22027:5;22023:15;22010:29;22004:3;21995:7;21991:17;21984:56;22099:3;22092:5;22088:15;22075:29;22069:3;22060:7;22056:17;22049:56;22140:33;22168:3;22161:5;22157:15;22140:33;:::i;:::-;22134:3;22121:17;;22114:60;22125:7;21116:1093;-1:-1:-1;;21116:1093:1:o;22214:331::-;22416:2;22398:21;;;22455:1;22435:18;;;22428:29;-1:-1:-1;;;22488:2:1;22473:18;;22466:38;22536:2;22521:18;;22214:331::o;23164:245::-;23231:6;23284:2;23272:9;23263:7;23259:23;23255:32;23252:52;;;23300:1;23297;23290:12;23252:52;23332:9;23326:16;23351:28;23373:5;23351:28;:::i;23750:522::-;23828:4;23834:6;23894:11;23881:25;23988:2;23984:7;23973:8;23957:14;23953:29;23949:43;23929:18;23925:68;23915:96;;24007:1;24004;23997:12;23915:96;24034:33;;24086:20;;;-1:-1:-1;;;;;;24118:30:1;;24115:50;;;24161:1;24158;24151:12;24115:50;24194:4;24182:17;;-1:-1:-1;24225:14:1;24221:27;;;24211:38;;24208:58;;;24262:1;24259;24252:12;24277:267;24366:6;24361:3;24354:19;24418:6;24411:5;24404:4;24399:3;24395:14;24382:43;-1:-1:-1;24470:1:1;24445:16;;;24463:4;24441:27;;;24434:38;;;;24526:2;24505:15;;;-1:-1:-1;;24501:29:1;24492:39;;;24488:50;;24277:267::o;24549:1193::-;24752:2;24804:21;;;24777:18;;;24860:22;;;-1:-1:-1;;24913:2:1;24962:1;24958:14;;;24943:30;;24939:39;;;24898:18;;25001:6;-1:-1:-1;25035:678:1;25049:6;25046:1;25043:13;25035:678;;;25114:22;;;-1:-1:-1;;25110:36:1;25098:49;;25186:20;;25261:14;25257:27;;;-1:-1:-1;;25253:41:1;25229:66;;25219:94;;25309:1;25306;25299:12;25219:94;25339:31;;25397:19;;-1:-1:-1;;;;;25432:30:1;;25429:50;;;25475:1;25472;25465:12;25429:50;25527:6;25511:14;25507:27;25499:6;25495:40;25492:60;;;25548:1;25545;25538:12;25492:60;25575:58;25626:6;25618;25613:2;25606:5;25602:14;25575:58;:::i;:::-;25565:68;-1:-1:-1;;;25691:12:1;;;;25656:15;;;;25071:1;25064:9;25035:678;;;-1:-1:-1;25730:6:1;;24549:1193;-1:-1:-1;;;;;;;24549:1193:1:o;25747:331::-;25949:2;25931:21;;;25988:1;25968:18;;;25961:29;-1:-1:-1;;;26021:2:1;26006:18;;25999:38;26069:2;26054:18;;25747:331::o;26083:::-;26285:2;26267:21;;;26324:1;26304:18;;;26297:29;-1:-1:-1;;;26357:2:1;26342:18;;26335:38;26405:2;26390:18;;26083:331::o;26419:221::-;26458:4;26487:10;26547;;;;26517;;26569:12;;;26566:38;;;26584:18;;:::i;:::-;26621:13;;26419:221;-1:-1:-1;;;26419:221:1:o;29341:228::-;29380:3;29408:10;29445:2;29442:1;29438:10;29475:2;29472:1;29468:10;29506:3;29502:2;29498:12;29493:3;29490:21;29487:47;;;29514:18;;:::i;:::-;29550:13;;29341:228;-1:-1:-1;;;;29341:228:1:o;30797:127::-;30858:10;30853:3;30849:20;30846:1;30839:31;30889:4;30886:1;30879:15;30913:4;30910:1;30903:15;30929:112;30961:1;30987;30977:35;;30992:18;;:::i;:::-;-1:-1:-1;31026:9:1;;30929:112::o;31046:120::-;31086:1;31112;31102:35;;31117:18;;:::i;:::-;-1:-1:-1;31151:9:1;;31046:120::o;31171:168::-;31211:7;31277:1;31273;31269:6;31265:14;31262:1;31259:21;31254:1;31247:9;31240:17;31236:45;31233:71;;;31284:18;;:::i;:::-;-1:-1:-1;31324:9:1;;31171:168::o;31683:445::-;31915:3;31953:6;31947:13;31969:53;32015:6;32010:3;32003:4;31995:6;31991:17;31969:53;:::i;:::-;-1:-1:-1;;;32044:16:1;;32069:24;;;-1:-1:-1;32120:1:1;32109:13;;31683:445;-1:-1:-1;31683:445:1:o;32133:622::-;32413:3;32451:6;32445:13;32467:53;32513:6;32508:3;32501:4;32493:6;32489:17;32467:53;:::i;:::-;-1:-1:-1;;;32542:16:1;;;32567:26;;;32618:13;;32640:65;32618:13;32692:1;32681:13;;32674:4;32662:17;;32640:65;:::i;:::-;32725:20;32747:1;32721:28;;32133:622;-1:-1:-1;;;;32133:622:1:o;33094:243::-;33151:6;33204:2;33192:9;33183:7;33179:23;33175:32;33172:52;;;33220:1;33217;33210:12;33172:52;33259:9;33246:23;33278:29;33301:5;33278:29;:::i;33679:174::-;33723:11;33775:3;33762:17;33788:30;33812:5;33788:30;:::i;34077:1138::-;34244:5;34231:19;34259:31;34282:7;34259:31;:::i;:::-;34322:4;34313:7;34309:18;34299:28;;34352:4;34346:11;34401:2;34394:3;34390:8;34386:2;34382:17;34379:25;34373:4;34366:39;34453:2;34446:5;34442:14;34429:28;34466:32;34490:7;34466:32;:::i;:::-;34538:12;34528:7;34525:1;34521:15;34517:34;34507:44;;34612:2;34607;34591:12;34587:17;34583:2;34579:26;34576:34;34573:42;34567:4;34560:56;34664:2;34657:5;34653:14;34640:28;34677:32;34701:7;34677:32;:::i;:::-;34750:20;34740:7;34736:2;34732:16;34728:43;34718:53;;34829:2;34805:20;34801:25;34797:2;34793:34;34790:42;34780:52;;34869:2;34864;34860;34857:10;34854:18;34848:4;34841:32;34921:2;34914:5;34910:14;34897:28;34882:43;;34934:32;34958:7;34934:32;:::i;:::-;-1:-1:-1;;;35063:7:1;35059:2;35055:16;35051:51;-1:-1:-1;;;35013:33:1;35009:2;35005:42;35001:2;34998:50;34994:2;34991:58;34988:115;34982:4;34975:129;;;;;35113:96;35165:43;35203:3;35196:5;35192:15;35165:43;:::i;:::-;35159:4;33950:11;;-1:-1:-1;;;;33986:34:1;34047:3;34026:15;;;;-1:-1:-1;;;34022:42:1;33983:82;;;;33970:96;;33858:214;35220:245;35278:6;35331:2;35319:9;35310:7;35306:23;35302:32;35299:52;;;35347:1;35344;35337:12;35299:52;35386:9;35373:23;35405:30;35429:5;35405:30;:::i;35470:127::-;35531:10;35526:3;35522:20;35519:1;35512:31;35562:4;35559:1;35552:15;35586:4;35583:1;35576:15;35602:279;35700:6;35753:2;35741:9;35732:7;35728:23;35724:32;35721:52;;;35769:1;35766;35759:12;35721:52;35801:9;35795:16;35820:31;35845:5;35820:31;:::i;37645:398::-;37698:3;37736:5;37730:12;37780:4;37818:2;37811:5;37807:14;37839:1;37849:169;37863:6;37860:1;37857:13;37849:169;;;37924:13;;37912:26;;37958:12;;;;37993:15;;;;37885:1;37878:9;37849:169;;;-1:-1:-1;38034:3:1;;37645:398;-1:-1:-1;;;;;37645:398:1:o;38048:525::-;38368:66;38363:3;38356:79;38338:3;38457:50;38503:2;38498:3;38494:12;38486:6;38457:50;:::i;:::-;38516:21;;;-1:-1:-1;;38564:2:1;38553:14;;38048:525;-1:-1:-1;38048:525:1:o;38578:590::-;38926:66;38921:3;38914:79;39023:6;39018:2;39013:3;39009:12;39002:28;38896:3;39052:50;39098:2;39093:3;39089:12;39081:6;39052:50;:::i;:::-;39111:21;;;-1:-1:-1;;39159:2:1;39148:14;;38578:590;-1:-1:-1;;38578:590:1:o;40192:336::-;40394:2;40376:21;;;40433:2;40413:18;;;40406:30;-1:-1:-1;;;40467:2:1;40452:18;;40445:42;40519:2;40504:18;;40192:336::o;41695:489::-;-1:-1:-1;;;;;41964:15:1;;;41946:34;;42016:15;;42011:2;41996:18;;41989:43;42063:2;42048:18;;42041:34;;;42111:3;42106:2;42091:18;;42084:31;;;41889:4;;42132:46;;42158:19;;42150:6;42132:46;:::i;42189:249::-;42258:6;42311:2;42299:9;42290:7;42286:23;42282:32;42279:52;;;42327:1;42324;42317:12;42279:52;42359:9;42353:16;42378:30;42402:5;42378:30;:::i
Swarm Source
ipfs://a29abfee7d6730e7fd852e2c832c12b577327c0aacc557a3bcab8a0c8d7e82f8
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.