Token Smolizard
Overview ERC-721
Total Supply:
3,467 LIZARD
Holders:
1,861 addresses
Contract:
Balance
1 LIZARD
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Smolizard
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: CC-BY-ND-4.0 pragma solidity ^0.8.14; import "./ERC721A.sol"; import "./ERC20.sol"; abstract contract ERC721E is IERC721A, protected { struct OnChainMetadata { string SVG_Image; // Optional string Image_Uri; // Optional (has priority) string[] properties; mapping(string => string) attributes; // properties -> attributes } mapping(uint => OnChainMetadata) Token_Metadata; // tokenID -> metadata /* tokenURI can be set as https://apiurl.com/retrieve?nft=0xcontractaddress&id=tokenID The API will contain a web3 call with ERC721E abi contract and the below method returning ERC721 compatible json with imageURI being the url or the svg based on content */ function setMetadata(string memory SVG_Image, string memory Image_Uri, string[] memory properties, string[] memory attributes, uint CurrentIndex) internal { Token_Metadata[CurrentIndex].Image_Uri = Image_Uri; Token_Metadata[CurrentIndex].SVG_Image = SVG_Image; Token_Metadata[CurrentIndex].properties = properties; for (uint i; i < attributes.length; i++) { Token_Metadata[CurrentIndex].attributes[properties[i]] = attributes[i]; } } function retrieveMetadata(uint tokenID) public view returns(string memory SVG, string memory URI, string[] memory properties, string[] memory attributes) { string memory _svg = Token_Metadata[tokenID].SVG_Image; string memory _uri = Token_Metadata[tokenID].Image_Uri; string[] memory _properties = Token_Metadata[tokenID].properties; string[] memory _attributes; for(uint a; a < properties.length; a++) { _attributes[a] = (Token_Metadata[tokenID].attributes[properties[a]]); } return(_svg, _uri, _properties, _attributes); } } /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /**************************************************************** Smolizard Library for efficient types management *****************************************************************/ library SmolData { struct MINTER { uint minted_number; bool is_whitelisted; uint[] minted_ids; uint last_mint; } } /**************************************************************** Agile Minters Management and useful types for Smolizard managed externally *****************************************************************/ contract SmolMinters is protected { /* ---------------------------------------------------------------- TYPES ---------------------------------------------------------------- */ address public Magic = 0x539bdE0d7Dbd336b79148AA742883198BBF60342; // mainnet // 0x539bdE0d7Dbd336b79148AA742883198BBF60342; IERC20 Magic_Token = IERC20(Magic); uint required_no_decimals = 20; uint required_tokens = required_no_decimals * (10 ** (Magic_Token.decimals())); uint public MAX_NUMBER = 1; uint public MAX_MINTING = 6969; using SmolData for SmolData.MINTER; mapping(address => SmolData.MINTER) public minters; string base_uri; string external_uri; bool on_chain_metadata; function set_max_minting(uint _max_) public onlyAuth { MAX_MINTING = _max_; } function set_on_chain_metadata(bool on_chain) public onlyAuth { on_chain_metadata = on_chain; } function set_whitelist(address actor, bool is_whitelisted_) public onlyAuth { minters[actor].is_whitelisted = is_whitelisted_; } function set_whitelist_bulk(address[] memory actors) public onlyAuth { require(actors.length > 1, "This function accepts bulk addresses"); for(uint i; i < actors.length; i++) { minters[actors[i]].is_whitelisted = true; } } function get_owned_nfts(address actor) public view returns (uint[] memory _ids_) { return minters[actor].minted_ids; } function get_required_token_balance(address actor) public view returns (uint _balance_) { return Magic_Token.balanceOf(actor); } function is_allowed_on_required_token(address actor) public view returns (bool allowed) { if(Magic_Token.allowance(actor, address(this)) >= required_tokens) { return true; } else { return false; } } function set_required_tokens(uint tokens_no_decimals) public onlyAuth { required_no_decimals = tokens_no_decimals; required_tokens = required_no_decimals * (10 ** (Magic_Token.decimals())); } function set_minting_token(address token) public onlyAuth { Magic = token; Magic_Token = IERC20(Magic); } function set_minting_max_number(uint _MAX_) public onlyAuth { MAX_NUMBER = _MAX_; } function retrieve_payments() public onlyAuth { Magic_Token.transfer(msg.sender, Magic_Token.balanceOf(address(this))); } function retrieve_native() public onlyAuth { (bool sent,) =msg.sender.call{value: (address(this).balance)}(""); require(sent, "Not sent"); } } /**************************************************************** ERC721E: Extending ERC721A Standard with on chain metadata *****************************************************************/ /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract Smolizard is ERC721E, SmolMinters { /* ---------------------------------------------------------------- IMPLEMENTATION ---------------------------------------------------------------- */ // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); owner = msg.sender; is_auth[owner] = true; minters[owner].is_whitelisted = true; _mint(owner, 1); } /** * @dev Public mint endpoint */ function mint() public safe { address actor = msg.sender; require(_currentIndex <= MAX_MINTING, "Minting ended"); if(minters[actor].is_whitelisted) { if(block.timestamp < (minters[actor].last_mint + 3 days)) { require(balanceOf(actor) < 1, "Already minted"); } } else { require(balanceOf(actor) < 1, "Already minted"); } if(!(minters[actor].is_whitelisted)) { require(is_allowed_on_required_token(actor), "Allowance not set"); require(get_required_token_balance(actor) >= required_tokens, "Not enough required tokens"); Magic_Token.transferFrom(actor, address(this), required_tokens); } minters[actor].last_mint = block.timestamp; minters[actor].minted_number += 1; _mint(actor, 1); } function side_mint(uint quantity, address to) public onlyAuth { _mint(to, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint quantity) internal { uint256 startTokenId = _currentIndex; if (_addressToUint256(to) == 0) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() public view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address _owner) public view override returns (uint256) { if (_addressToUint256(_owner) == 0) revert BalanceQueryForZeroAddress(); return _packedAddressData[_owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address _owner) internal view returns (uint256) { return (_packedAddressData[_owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address _owner) internal view returns (uint256) { return (_packedAddressData[_owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address _owner) internal view returns (uint64) { return uint64(_packedAddressData[_owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address _owner, uint64 aux) internal { uint256 packed = _packedAddressData[_owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[_owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @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) { if(!on_chain_metadata) { return base_uri; } else { return external_uri; } } function _externalURI() public view returns(string memory) { return external_uri; } function set_base_uri(string memory base) public onlyAuth { base_uri = base; if(!on_chain_metadata) { external_uri = base; } } function set_external_uri(string memory _external) public onlyAuth { external_uri = _external; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address _owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == _owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != _owner) if (!isApprovedForAll(_owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(_owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), 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 { _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 { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); address approvedAddress = _tokenApprovals[tokenId]; bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || approvedAddress == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (_addressToUint256(to) == 0) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. if (_addressToUint256(approvedAddress) != 0) { delete _tokenApprovals[tokenId]; } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); address approvedAddress = _tokenApprovals[tokenId]; if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || approvedAddress == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. if (_addressToUint256(approvedAddress) != 0) { delete _tokenApprovals[tokenId]; } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } }
// SPDX-License-Identifier: CC-BY-ND-4.0 pragma solidity ^0.8.14; interface IERC20 { /// @return decs The decimals of the token function decimals() external view returns(uint256 decs); /// @param _owner The address from which the balance will be retrieved /// @return balance the balance function balanceOf(address _owner) external view returns (uint256 balance); /// @notice send `_value` token to `_to` from `msg.sender` /// @param _to The address of the recipient /// @param _value The amount of token to be transferred /// @return success Whether the transfer was successful or not function transfer(address _to, uint256 _value) external returns (bool success); /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from` /// @param _from The address of the sender /// @param _to The address of the recipient /// @param _value The amount of token to be transferred /// @return success Whether the transfer was successful or not function transferFrom(address _from, address _to, uint256 _value) external returns (bool success); /// @notice `msg.sender` approves `_addr` to spend `_value` tokens /// @param _spender The address of the account able to transfer the tokens /// @param _value The amount of wei to be approved for transfer /// @return success Whether the approval was successful or not function approve(address _spender, uint256 _value) external returns (bool success); /// @param _owner The address of the account owning tokens /// @param _spender The address of the account able to transfer the tokens /// @return remaining Amount of remaining tokens allowed to spent function allowance(address _owner, address _spender) external view returns (uint256 remaining); event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.14; contract protected { mapping (address => bool) is_auth; function authorized(address addy) public view returns(bool) { return is_auth[addy]; } function set_authorized(address addy, bool booly) public onlyAuth { is_auth[addy] = booly; } modifier onlyAuth() { require( is_auth[msg.sender] || msg.sender==owner, "not owner"); _; } address owner; modifier onlyOwner() { require(msg.sender==owner, "not owner"); _; } bool locked; modifier safe() { require(!locked, "reentrant"); locked = true; _; locked = false; } function change_owner(address new_owner) public onlyAuth { owner = new_owner; } receive() external payable {} fallback() external payable {} } /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @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`. * * 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; /** * @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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); // ============================== // IERC721Metadata // ============================== /** * @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 Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MAX_MINTING","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NUMBER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Magic","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_externalURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"new_owner","type":"address"}],"name":"change_owner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"actor","type":"address"}],"name":"get_owned_nfts","outputs":[{"internalType":"uint256[]","name":"_ids_","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"actor","type":"address"}],"name":"get_required_token_balance","outputs":[{"internalType":"uint256","name":"_balance_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"actor","type":"address"}],"name":"is_allowed_on_required_token","outputs":[{"internalType":"bool","name":"allowed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"uint256","name":"minted_number","type":"uint256"},{"internalType":"bool","name":"is_whitelisted","type":"bool"},{"internalType":"uint256","name":"last_mint","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"retrieveMetadata","outputs":[{"internalType":"string","name":"SVG","type":"string"},{"internalType":"string","name":"URI","type":"string"},{"internalType":"string[]","name":"properties","type":"string[]"},{"internalType":"string[]","name":"attributes","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"retrieve_native","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retrieve_payments","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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"set_authorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"base","type":"string"}],"name":"set_base_uri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_external","type":"string"}],"name":"set_external_uri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max_","type":"uint256"}],"name":"set_max_minting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MAX_","type":"uint256"}],"name":"set_minting_max_number","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"set_minting_token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"on_chain","type":"bool"}],"name":"set_on_chain_metadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens_no_decimals","type":"uint256"}],"name":"set_required_tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"actor","type":"address"},{"internalType":"bool","name":"is_whitelisted_","type":"bool"}],"name":"set_whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"actors","type":"address[]"}],"name":"set_whitelist_bulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"side_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060408190526003805473539bde0d7dbd336b79148aa742883198bbf603426001600160a01b031991821681179092556004805490911682178155601460055563313ce56760e01b8352909163313ce5679160849160209181865afa1580156200006e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009491906200030d565b620000a190600a6200043c565b600554620000b0919062000451565b6006556001600755611b39600855348015620000cb57600080fd5b5060405162002e2338038062002e23833981016040819052620000ee9162000540565b81516200010390600f90602085019062000267565b5080516200011990601090602084019062000267565b506000600d55600180546001600160a01b031916339081178255600090815260208181526040808320805460ff19908116861790915584546001600160a01b039081168552600990935292208301805490921683179091558154620001819291169062000189565b5050620005e6565b600d5482600003620001ad57604051622e076360e81b815260040160405180910390fd5b81600003620001cf5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660009081526012602090815260408083208054680100000000000000018702019055838352601190915290204260a01b84176001841460e11b179055808083015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106200021a5750600d55505050565b8280546200027590620005aa565b90600052602060002090601f016020900481019282620002995760008555620002e4565b82601f10620002b457805160ff1916838001178555620002e4565b82800160010185558215620002e4579182015b82811115620002e4578251825591602001919060010190620002c7565b50620002f2929150620002f6565b5090565b5b80821115620002f25760008155600101620002f7565b6000602082840312156200032057600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200037e57816000190482111562000362576200036262000327565b808516156200037057918102915b93841c939080029062000342565b509250929050565b600082620003975750600162000436565b81620003a65750600062000436565b8160018114620003bf5760028114620003ca57620003ea565b600191505062000436565b60ff841115620003de57620003de62000327565b50506001821b62000436565b5060208310610133831016604e8410600b84101617156200040f575081810a62000436565b6200041b83836200033d565b806000190482111562000432576200043262000327565b0290505b92915050565b60006200044a838362000386565b9392505050565b60008160001904831182151516156200046e576200046e62000327565b500290565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200049b57600080fd5b81516001600160401b0380821115620004b857620004b862000473565b604051601f8301601f19908116603f01168101908282118183101715620004e357620004e362000473565b816040528381526020925086838588010111156200050057600080fd5b600091505b8382101562000524578582018301518183018401529082019062000505565b83821115620005365760008385830101525b9695505050505050565b600080604083850312156200055457600080fd5b82516001600160401b03808211156200056c57600080fd5b6200057a8683870162000489565b935060208501519150808211156200059157600080fd5b50620005a08582860162000489565b9150509250929050565b600181811c90821680620005bf57607f821691505b602082108103620005e057634e487b7160e01b600052602260045260246000fd5b50919050565b61282d80620005f66000396000f3fe6080604052600436106102275760003560e01c80639bab805911610122578063c10f47c4116100a5578063e985e9c51161006c578063e985e9c5146106b7578063ed30f0bc146106d7578063f00c119d146106f7578063f46eccc41461070c578063fea9b5721461076657005b8063c10f47c414610607578063c87b56dd14610627578063da4b81ee14610647578063dc921bc514610677578063e495d4e71461069757005b8063b200107c116100e9578063b200107c1461054e578063b88d4fde1461056e578063b91816111461058e578063bd728363146105c7578063bfa9f25e146105e757005b80639bab8059146104ab578063a22cb465146104cb578063a84c0e67146104eb578063ae32d9db14610518578063af1c52111461052e57005b806341d3b22a116101aa578063737cc43c11610171578063737cc43c146104215780637e9254ff146104415780638efd2e7d1461046157806392aa3e741461047657806395d89b411461049657005b806341d3b22a1461039757806342842e0e146103ac5780636352211e146103cc57806370a08231146103ec578063736bf5911461040c57005b806318160ddd116101ee57806318160ddd146102f45780631962faec1461031757806323b872dd14610337578063253c8bd4146103575780632bfe87421461037757005b806301ffc9a71461023057806306fdde0314610265578063081812fc14610287578063095ea7b3146102bf5780631249c58b146102df57005b3661022e57005b005b34801561023c57600080fd5b5061025061024b366004612060565b61077c565b60405190151581526020015b60405180910390f35b34801561027157600080fd5b5061027a6107ce565b60405161025c91906120d5565b34801561029357600080fd5b506102a76102a23660046120e8565b610860565b6040516001600160a01b03909116815260200161025c565b3480156102cb57600080fd5b5061022e6102da366004612118565b6108a4565b3480156102eb57600080fd5b5061022e610976565b34801561030057600080fd5b50600e54600d54035b60405190815260200161025c565b34801561032357600080fd5b50610250610332366004612142565b610ca0565b34801561034357600080fd5b5061022e61035236600461215d565b610d38565b34801561036357600080fd5b5061022e610372366004612142565b610d48565b34801561038357600080fd5b5061022e6103923660046121a7565b610dae565b3480156103a357600080fd5b5061027a610e1d565b3480156103b857600080fd5b5061022e6103c736600461215d565b610e2c565b3480156103d857600080fd5b506102a76103e73660046120e8565b610e47565b3480156103f857600080fd5b50610309610407366004612142565b610e52565b34801561041857600080fd5b50600d54610309565b34801561042d57600080fd5b5061022e61043c3660046121de565b610e9b565b34801561044d57600080fd5b5061022e61045c3660046120e8565b610eed565b34801561046d57600080fd5b5061022e610f36565b34801561048257600080fd5b5061022e6104913660046120e8565b611000565b3480156104a257600080fd5b5061027a611049565b3480156104b757600080fd5b5061022e6104c63660046120e8565b611058565b3480156104d757600080fd5b5061022e6104e63660046121a7565b61112a565b3480156104f757600080fd5b5061050b610506366004612142565b6111bf565b60405161025c919061220a565b34801561052457600080fd5b5061030960085481565b34801561053a57600080fd5b5061022e6105493660046122ed565b61122e565b34801561055a57600080fd5b506003546102a7906001600160a01b031681565b34801561057a57600080fd5b5061022e610589366004612336565b6112a3565b34801561059a57600080fd5b506102506105a9366004612142565b6001600160a01b031660009081526020819052604090205460ff1690565b3480156105d357600080fd5b506103096105e2366004612142565b6112ed565b3480156105f357600080fd5b5061022e6106023660046123b2565b611361565b34801561061357600080fd5b5061022e6106223660046122ed565b6113b8565b34801561063357600080fd5b5061027a6106423660046120e8565b61140f565b34801561065357600080fd5b506106676106623660046120e8565b611493565b60405161025c9493929190612424565b34801561068357600080fd5b5061022e61069236600461247c565b6117e6565b3480156106a357600080fd5b5061022e6106b23660046121a7565b6118f2565b3480156106c357600080fd5b506102506106d2366004612529565b611964565b3480156106e357600080fd5b5061022e6106f2366004612142565b611992565b34801561070357600080fd5b5061022e611a02565b34801561071857600080fd5b5061074b610727366004612142565b600960205260009081526040902080546001820154600390920154909160ff169083565b6040805193845291151560208401529082015260600161025c565b34801561077257600080fd5b5061030960075481565b60006301ffc9a760e01b6001600160e01b0319831614806107ad57506380ac58cd60e01b6001600160e01b03198316145b806107c85750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600f80546107dd90612553565b80601f016020809104026020016040519081016040528092919081815260200182805461080990612553565b80156108565780601f1061082b57610100808354040283529160200191610856565b820191906000526020600020905b81548152906001019060200180831161083957829003601f168201915b5050505050905090565b600061086b82611b2c565b610888576040516333d1c03960e21b815260040160405180910390fd5b506000908152601360205260409020546001600160a01b031690565b60006108af82611b54565b9050806001600160a01b0316836001600160a01b0316036108e35760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161461091a576108fd8133611964565b61091a576040516367d9dca160e11b815260040160405180910390fd5b60008281526013602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600154600160a01b900460ff16156109c15760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b60448201526064015b60405180910390fd5b6001805460ff60a01b1916600160a01b179055600854600d5433911015610a1a5760405162461bcd60e51b815260206004820152600d60248201526c135a5b9d1a5b99c8195b991959609a1b60448201526064016109b8565b6001600160a01b03811660009081526009602052604090206001015460ff1615610abc576001600160a01b038116600090815260096020526040902060030154610a67906203f4806125a3565b421015610ab7576001610a7982610e52565b10610ab75760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b60448201526064016109b8565b610b05565b6001610ac782610e52565b10610b055760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b60448201526064016109b8565b6001600160a01b03811660009081526009602052604090206001015460ff16610c5057610b3181610ca0565b610b715760405162461bcd60e51b8152602060048201526011602482015270105b1b1bddd85b98d9481b9bdd081cd95d607a1b60448201526064016109b8565b600654610b7d826112ed565b1015610bcb5760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f75676820726571756972656420746f6b656e7300000000000060448201526064016109b8565b600480546006546040516323b872dd60e01b81526001600160a01b038581169482019490945230602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015610c2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4e91906125bb565b505b6001600160a01b0381166000908152600960205260408120426003820155805460019290610c7f9084906125a3565b90915550610c909050816001611bbb565b506001805460ff60a01b19169055565b60065460048054604051636eb1769f60e11b81526001600160a01b0385811693820193909352306024820152600093929091169063dd62ed3e90604401602060405180830381865afa158015610cfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1e91906125d8565b10610d2b57506001919050565b506000919050565b919050565b610d43838383611c96565b505050565b3360009081526020819052604090205460ff1680610d7057506001546001600160a01b031633145b610d8c5760405162461bcd60e51b81526004016109b8906125f1565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff1680610dd657506001546001600160a01b031633145b610df25760405162461bcd60e51b81526004016109b8906125f1565b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b6060600b80546107dd90612553565b610d43838383604051806020016040528060008152506112a3565b60006107c882611b54565b600081600003610e75576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526012602052604090205467ffffffffffffffff1690565b3360009081526020819052604090205460ff1680610ec357506001546001600160a01b031633145b610edf5760405162461bcd60e51b81526004016109b8906125f1565b610ee98183611bbb565b5050565b3360009081526020819052604090205460ff1680610f1557506001546001600160a01b031633145b610f315760405162461bcd60e51b81526004016109b8906125f1565b600755565b3360009081526020819052604090205460ff1680610f5e57506001546001600160a01b031633145b610f7a5760405162461bcd60e51b81526004016109b8906125f1565b604051600090339047908381818185875af1925050503d8060008114610fbc576040519150601f19603f3d011682016040523d82523d6000602084013e610fc1565b606091505b5050905080610ffd5760405162461bcd60e51b8152602060048201526008602482015267139bdd081cd95b9d60c21b60448201526064016109b8565b50565b3360009081526020819052604090205460ff168061102857506001546001600160a01b031633145b6110445760405162461bcd60e51b81526004016109b8906125f1565b600855565b6060601080546107dd90612553565b3360009081526020819052604090205460ff168061108057506001546001600160a01b031633145b61109c5760405162461bcd60e51b81526004016109b8906125f1565b6005819055600480546040805163313ce56760e01b815290516001600160a01b039092169263313ce5679282820192602092908290030181865afa1580156110e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110c91906125d8565b61111790600a6126f8565b6005546111249190612704565b60065550565b336001600160a01b038316036111535760405163b06307db60e01b815260040160405180910390fd5b3360008181526014602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6001600160a01b03811660009081526009602090815260409182902060020180548351818402810184019094528084526060939283018282801561122257602002820191906000526020600020905b81548152602001906001019080831161120e575b50505050509050919050565b3360009081526020819052604090205460ff168061125657506001546001600160a01b031633145b6112725760405162461bcd60e51b81526004016109b8906125f1565b805161128590600a906020840190611fb1565b50600c5460ff16610ffd578051610ee990600b906020840190611fb1565b6112ae848484611c96565b6001600160a01b0383163b156112e7576112ca84848484611e4f565b6112e7576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600480546040516370a0823160e01b81526001600160a01b0384811693820193909352600092909116906370a0823190602401602060405180830381865afa15801561133d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c891906125d8565b3360009081526020819052604090205460ff168061138957506001546001600160a01b031633145b6113a55760405162461bcd60e51b81526004016109b8906125f1565b600c805460ff1916911515919091179055565b3360009081526020819052604090205460ff16806113e057506001546001600160a01b031633145b6113fc5760405162461bcd60e51b81526004016109b8906125f1565b8051610ee990600b906020840190611fb1565b606061141a82611b2c565b61143757604051630a14c4b560e41b815260040160405180910390fd5b6000611441611f3b565b90508051600003611461576040518060200160405280600081525061148c565b8061146b84611f62565b60405160200161147c929190612723565b6040516020818303038152906040525b9392505050565b6000818152600260205260408120805460609283928392839291906114b790612553565b80601f01602080910402602001604051908101604052809291908181526020018280546114e390612553565b80156115305780601f1061150557610100808354040283529160200191611530565b820191906000526020600020905b81548152906001019060200180831161151357829003601f168201915b50505050509050600060026000888152602001908152602001600020600101805461155a90612553565b80601f016020809104026020016040519081016040528092919081815260200182805461158690612553565b80156115d35780601f106115a8576101008083540402835291602001916115d3565b820191906000526020600020905b8154815290600101906020018083116115b657829003601f168201915b50505050509050600060026000898152602001908152602001600020600201805480602002602001604051908101604052809291908181526020016000905b828210156116be57838290600052602060002001805461163190612553565b80601f016020809104026020016040519081016040528092919081815260200182805461165d90612553565b80156116aa5780601f1061167f576101008083540402835291602001916116aa565b820191906000526020600020905b81548152906001019060200180831161168d57829003601f168201915b505050505081526020019060010190611612565b505050509050606060005b86518110156117d657600260008b81526020019081526020016000206003018782815181106116fa576116fa612752565b602002602001015160405161170f9190612768565b9081526020016040518091039020805461172890612553565b80601f016020809104026020016040519081016040528092919081815260200182805461175490612553565b80156117a15780601f10611776576101008083540402835291602001916117a1565b820191906000526020600020905b81548152906001019060200180831161178457829003601f168201915b50505050508282815181106117b8576117b8612752565b602002602001018190525080806117ce90612784565b9150506116c9565b5092989197509550909350915050565b3360009081526020819052604090205460ff168061180e57506001546001600160a01b031633145b61182a5760405162461bcd60e51b81526004016109b8906125f1565b60018151116118875760405162461bcd60e51b8152602060048201526024808201527f546869732066756e6374696f6e20616363657074732062756c6b2061646472656044820152637373657360e01b60648201526084016109b8565b60005b8151811015610ee9576001600960008484815181106118ab576118ab612752565b6020908102919091018101516001600160a01b03168252810191909152604001600020600101805460ff1916911515919091179055806118ea81612784565b91505061188a565b3360009081526020819052604090205460ff168061191a57506001546001600160a01b031633145b6119365760405162461bcd60e51b81526004016109b8906125f1565b6001600160a01b03919091166000908152600960205260409020600101805460ff1916911515919091179055565b6001600160a01b03918216600090815260146020908152604080832093909416825291909152205460ff1690565b3360009081526020819052604090205460ff16806119ba57506001546001600160a01b031633145b6119d65760405162461bcd60e51b81526004016109b8906125f1565b600380546001600160a01b039092166001600160a01b0319928316811790915560048054909216179055565b3360009081526020819052604090205460ff1680611a2a57506001546001600160a01b031633145b611a465760405162461bcd60e51b81526004016109b8906125f1565b600480546040516370a0823160e01b815230928101929092526001600160a01b03169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abd91906125d8565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611b08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffd91906125bb565b6000600d54821080156107c8575050600090815260116020526040902054600160e01b161590565b600081600d54811015611ba25760008181526011602052604081205490600160e01b82169003611ba0575b8060000361148c575060001901600081815260116020526040902054611b7f565b505b604051636f96cda160e11b815260040160405180910390fd5b600d5482600003611bde57604051622e076360e81b815260040160405180910390fd5b81600003611bff5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660009081526012602090815260408083208054680100000000000000018702019055838352601190915290204260a01b84176001841460e11b179055808083015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611c4a5750600d55505050565b6000611ca182611b54565b9050836001600160a01b0316816001600160a01b031614611cd45760405162a1148160e81b815260040160405180910390fd5b6000828152601360205260408120546001600160a01b0390811691908616331480611d045750611d048633611964565b80611d1757506001600160a01b03821633145b905080611d3757604051632ce44b5f60e11b815260040160405180910390fd5b84600003611d5857604051633a954ecd60e21b815260040160405180910390fd5b8115611d7b57600084815260136020526040902080546001600160a01b03191690555b6001600160a01b038681166000908152601260209081526040808320805460001901905592881682528282208054600101905586825260119052908120600160e11b4260a01b8817811790915584169003611e0657600184016000818152601160205260408120549003611e0457600d548114611e045760008181526011602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611e8490339089908890889060040161279d565b6020604051808303816000875af1925050508015611ebf575060408051601f3d908101601f19168201909252611ebc918101906127da565b60015b611f1d573d808015611eed576040519150601f19603f3d011682016040523d82523d6000602084013e611ef2565b606091505b508051600003611f15576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b600c5460609060ff16611f5557600a80546107dd90612553565b600b80546107dd90612553565b604080516080810191829052607f0190826030600a8206018353600a90045b8015611f9f57600183039250600a81066030018353600a9004611f81565b50819003601f19909101908152919050565b828054611fbd90612553565b90600052602060002090601f016020900481019282611fdf5760008555612025565b82601f10611ff857805160ff1916838001178555612025565b82800160010185558215612025579182015b8281111561202557825182559160200191906001019061200a565b50612031929150612035565b5090565b5b808211156120315760008155600101612036565b6001600160e01b031981168114610ffd57600080fd5b60006020828403121561207257600080fd5b813561148c8161204a565b60005b83811015612098578181015183820152602001612080565b838111156112e75750506000910152565b600081518084526120c181602086016020860161207d565b601f01601f19169290920160200192915050565b60208152600061148c60208301846120a9565b6000602082840312156120fa57600080fd5b5035919050565b80356001600160a01b0381168114610d3357600080fd5b6000806040838503121561212b57600080fd5b61213483612101565b946020939093013593505050565b60006020828403121561215457600080fd5b61148c82612101565b60008060006060848603121561217257600080fd5b61217b84612101565b925061218960208501612101565b9150604084013590509250925092565b8015158114610ffd57600080fd5b600080604083850312156121ba57600080fd5b6121c383612101565b915060208301356121d381612199565b809150509250929050565b600080604083850312156121f157600080fd5b8235915061220160208401612101565b90509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561224257835183529284019291840191600101612226565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561228d5761228d61224e565b604052919050565b600067ffffffffffffffff8311156122af576122af61224e565b6122c2601f8401601f1916602001612264565b90508281528383830111156122d657600080fd5b828260208301376000602084830101529392505050565b6000602082840312156122ff57600080fd5b813567ffffffffffffffff81111561231657600080fd5b8201601f8101841361232757600080fd5b611f3384823560208401612295565b6000806000806080858703121561234c57600080fd5b61235585612101565b935061236360208601612101565b925060408501359150606085013567ffffffffffffffff81111561238657600080fd5b8501601f8101871361239757600080fd5b6123a687823560208401612295565b91505092959194509250565b6000602082840312156123c457600080fd5b813561148c81612199565b600081518084526020808501808196508360051b8101915082860160005b858110156124175782840389526124058483516120a9565b988501989350908401906001016123ed565b5091979650505050505050565b60808152600061243760808301876120a9565b828103602084015261244981876120a9565b9050828103604084015261245d81866123cf565b9050828103606084015261247181856123cf565b979650505050505050565b6000602080838503121561248f57600080fd5b823567ffffffffffffffff808211156124a757600080fd5b818501915085601f8301126124bb57600080fd5b8135818111156124cd576124cd61224e565b8060051b91506124de848301612264565b81815291830184019184810190888411156124f857600080fd5b938501935b8385101561251d5761250e85612101565b825293850193908501906124fd565b98975050505050505050565b6000806040838503121561253c57600080fd5b61254583612101565b915061220160208401612101565b600181811c9082168061256757607f821691505b60208210810361258757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156125b6576125b661258d565b500190565b6000602082840312156125cd57600080fd5b815161148c81612199565b6000602082840312156125ea57600080fd5b5051919050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b600181815b8085111561264f5781600019048211156126355761263561258d565b8085161561264257918102915b93841c9390800290612619565b509250929050565b600082612666575060016107c8565b81612673575060006107c8565b81600181146126895760028114612693576126af565b60019150506107c8565b60ff8411156126a4576126a461258d565b50506001821b6107c8565b5060208310610133831016604e8410600b84101617156126d2575081810a6107c8565b6126dc8383612614565b80600019048211156126f0576126f061258d565b029392505050565b600061148c8383612657565b600081600019048311821515161561271e5761271e61258d565b500290565b6000835161273581846020880161207d565b83519083019061274981836020880161207d565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b6000825161277a81846020870161207d565b9190910192915050565b6000600182016127965761279661258d565b5060010190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127d0908301846120a9565b9695505050505050565b6000602082840312156127ec57600080fd5b815161148c8161204a56fea2646970667358221220609a1e7dd5f9b1da501777fda34ef49b0adc485232ee9c722a6240822b05b0eb64736f6c634300080e0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000009536d6f6c697a617264000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064c495a4152440000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102275760003560e01c80639bab805911610122578063c10f47c4116100a5578063e985e9c51161006c578063e985e9c5146106b7578063ed30f0bc146106d7578063f00c119d146106f7578063f46eccc41461070c578063fea9b5721461076657005b8063c10f47c414610607578063c87b56dd14610627578063da4b81ee14610647578063dc921bc514610677578063e495d4e71461069757005b8063b200107c116100e9578063b200107c1461054e578063b88d4fde1461056e578063b91816111461058e578063bd728363146105c7578063bfa9f25e146105e757005b80639bab8059146104ab578063a22cb465146104cb578063a84c0e67146104eb578063ae32d9db14610518578063af1c52111461052e57005b806341d3b22a116101aa578063737cc43c11610171578063737cc43c146104215780637e9254ff146104415780638efd2e7d1461046157806392aa3e741461047657806395d89b411461049657005b806341d3b22a1461039757806342842e0e146103ac5780636352211e146103cc57806370a08231146103ec578063736bf5911461040c57005b806318160ddd116101ee57806318160ddd146102f45780631962faec1461031757806323b872dd14610337578063253c8bd4146103575780632bfe87421461037757005b806301ffc9a71461023057806306fdde0314610265578063081812fc14610287578063095ea7b3146102bf5780631249c58b146102df57005b3661022e57005b005b34801561023c57600080fd5b5061025061024b366004612060565b61077c565b60405190151581526020015b60405180910390f35b34801561027157600080fd5b5061027a6107ce565b60405161025c91906120d5565b34801561029357600080fd5b506102a76102a23660046120e8565b610860565b6040516001600160a01b03909116815260200161025c565b3480156102cb57600080fd5b5061022e6102da366004612118565b6108a4565b3480156102eb57600080fd5b5061022e610976565b34801561030057600080fd5b50600e54600d54035b60405190815260200161025c565b34801561032357600080fd5b50610250610332366004612142565b610ca0565b34801561034357600080fd5b5061022e61035236600461215d565b610d38565b34801561036357600080fd5b5061022e610372366004612142565b610d48565b34801561038357600080fd5b5061022e6103923660046121a7565b610dae565b3480156103a357600080fd5b5061027a610e1d565b3480156103b857600080fd5b5061022e6103c736600461215d565b610e2c565b3480156103d857600080fd5b506102a76103e73660046120e8565b610e47565b3480156103f857600080fd5b50610309610407366004612142565b610e52565b34801561041857600080fd5b50600d54610309565b34801561042d57600080fd5b5061022e61043c3660046121de565b610e9b565b34801561044d57600080fd5b5061022e61045c3660046120e8565b610eed565b34801561046d57600080fd5b5061022e610f36565b34801561048257600080fd5b5061022e6104913660046120e8565b611000565b3480156104a257600080fd5b5061027a611049565b3480156104b757600080fd5b5061022e6104c63660046120e8565b611058565b3480156104d757600080fd5b5061022e6104e63660046121a7565b61112a565b3480156104f757600080fd5b5061050b610506366004612142565b6111bf565b60405161025c919061220a565b34801561052457600080fd5b5061030960085481565b34801561053a57600080fd5b5061022e6105493660046122ed565b61122e565b34801561055a57600080fd5b506003546102a7906001600160a01b031681565b34801561057a57600080fd5b5061022e610589366004612336565b6112a3565b34801561059a57600080fd5b506102506105a9366004612142565b6001600160a01b031660009081526020819052604090205460ff1690565b3480156105d357600080fd5b506103096105e2366004612142565b6112ed565b3480156105f357600080fd5b5061022e6106023660046123b2565b611361565b34801561061357600080fd5b5061022e6106223660046122ed565b6113b8565b34801561063357600080fd5b5061027a6106423660046120e8565b61140f565b34801561065357600080fd5b506106676106623660046120e8565b611493565b60405161025c9493929190612424565b34801561068357600080fd5b5061022e61069236600461247c565b6117e6565b3480156106a357600080fd5b5061022e6106b23660046121a7565b6118f2565b3480156106c357600080fd5b506102506106d2366004612529565b611964565b3480156106e357600080fd5b5061022e6106f2366004612142565b611992565b34801561070357600080fd5b5061022e611a02565b34801561071857600080fd5b5061074b610727366004612142565b600960205260009081526040902080546001820154600390920154909160ff169083565b6040805193845291151560208401529082015260600161025c565b34801561077257600080fd5b5061030960075481565b60006301ffc9a760e01b6001600160e01b0319831614806107ad57506380ac58cd60e01b6001600160e01b03198316145b806107c85750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600f80546107dd90612553565b80601f016020809104026020016040519081016040528092919081815260200182805461080990612553565b80156108565780601f1061082b57610100808354040283529160200191610856565b820191906000526020600020905b81548152906001019060200180831161083957829003601f168201915b5050505050905090565b600061086b82611b2c565b610888576040516333d1c03960e21b815260040160405180910390fd5b506000908152601360205260409020546001600160a01b031690565b60006108af82611b54565b9050806001600160a01b0316836001600160a01b0316036108e35760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161461091a576108fd8133611964565b61091a576040516367d9dca160e11b815260040160405180910390fd5b60008281526013602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600154600160a01b900460ff16156109c15760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b60448201526064015b60405180910390fd5b6001805460ff60a01b1916600160a01b179055600854600d5433911015610a1a5760405162461bcd60e51b815260206004820152600d60248201526c135a5b9d1a5b99c8195b991959609a1b60448201526064016109b8565b6001600160a01b03811660009081526009602052604090206001015460ff1615610abc576001600160a01b038116600090815260096020526040902060030154610a67906203f4806125a3565b421015610ab7576001610a7982610e52565b10610ab75760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b60448201526064016109b8565b610b05565b6001610ac782610e52565b10610b055760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b60448201526064016109b8565b6001600160a01b03811660009081526009602052604090206001015460ff16610c5057610b3181610ca0565b610b715760405162461bcd60e51b8152602060048201526011602482015270105b1b1bddd85b98d9481b9bdd081cd95d607a1b60448201526064016109b8565b600654610b7d826112ed565b1015610bcb5760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f75676820726571756972656420746f6b656e7300000000000060448201526064016109b8565b600480546006546040516323b872dd60e01b81526001600160a01b038581169482019490945230602482015260448101919091529116906323b872dd906064016020604051808303816000875af1158015610c2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4e91906125bb565b505b6001600160a01b0381166000908152600960205260408120426003820155805460019290610c7f9084906125a3565b90915550610c909050816001611bbb565b506001805460ff60a01b19169055565b60065460048054604051636eb1769f60e11b81526001600160a01b0385811693820193909352306024820152600093929091169063dd62ed3e90604401602060405180830381865afa158015610cfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1e91906125d8565b10610d2b57506001919050565b506000919050565b919050565b610d43838383611c96565b505050565b3360009081526020819052604090205460ff1680610d7057506001546001600160a01b031633145b610d8c5760405162461bcd60e51b81526004016109b8906125f1565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff1680610dd657506001546001600160a01b031633145b610df25760405162461bcd60e51b81526004016109b8906125f1565b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b6060600b80546107dd90612553565b610d43838383604051806020016040528060008152506112a3565b60006107c882611b54565b600081600003610e75576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526012602052604090205467ffffffffffffffff1690565b3360009081526020819052604090205460ff1680610ec357506001546001600160a01b031633145b610edf5760405162461bcd60e51b81526004016109b8906125f1565b610ee98183611bbb565b5050565b3360009081526020819052604090205460ff1680610f1557506001546001600160a01b031633145b610f315760405162461bcd60e51b81526004016109b8906125f1565b600755565b3360009081526020819052604090205460ff1680610f5e57506001546001600160a01b031633145b610f7a5760405162461bcd60e51b81526004016109b8906125f1565b604051600090339047908381818185875af1925050503d8060008114610fbc576040519150601f19603f3d011682016040523d82523d6000602084013e610fc1565b606091505b5050905080610ffd5760405162461bcd60e51b8152602060048201526008602482015267139bdd081cd95b9d60c21b60448201526064016109b8565b50565b3360009081526020819052604090205460ff168061102857506001546001600160a01b031633145b6110445760405162461bcd60e51b81526004016109b8906125f1565b600855565b6060601080546107dd90612553565b3360009081526020819052604090205460ff168061108057506001546001600160a01b031633145b61109c5760405162461bcd60e51b81526004016109b8906125f1565b6005819055600480546040805163313ce56760e01b815290516001600160a01b039092169263313ce5679282820192602092908290030181865afa1580156110e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110c91906125d8565b61111790600a6126f8565b6005546111249190612704565b60065550565b336001600160a01b038316036111535760405163b06307db60e01b815260040160405180910390fd5b3360008181526014602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6001600160a01b03811660009081526009602090815260409182902060020180548351818402810184019094528084526060939283018282801561122257602002820191906000526020600020905b81548152602001906001019080831161120e575b50505050509050919050565b3360009081526020819052604090205460ff168061125657506001546001600160a01b031633145b6112725760405162461bcd60e51b81526004016109b8906125f1565b805161128590600a906020840190611fb1565b50600c5460ff16610ffd578051610ee990600b906020840190611fb1565b6112ae848484611c96565b6001600160a01b0383163b156112e7576112ca84848484611e4f565b6112e7576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600480546040516370a0823160e01b81526001600160a01b0384811693820193909352600092909116906370a0823190602401602060405180830381865afa15801561133d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c891906125d8565b3360009081526020819052604090205460ff168061138957506001546001600160a01b031633145b6113a55760405162461bcd60e51b81526004016109b8906125f1565b600c805460ff1916911515919091179055565b3360009081526020819052604090205460ff16806113e057506001546001600160a01b031633145b6113fc5760405162461bcd60e51b81526004016109b8906125f1565b8051610ee990600b906020840190611fb1565b606061141a82611b2c565b61143757604051630a14c4b560e41b815260040160405180910390fd5b6000611441611f3b565b90508051600003611461576040518060200160405280600081525061148c565b8061146b84611f62565b60405160200161147c929190612723565b6040516020818303038152906040525b9392505050565b6000818152600260205260408120805460609283928392839291906114b790612553565b80601f01602080910402602001604051908101604052809291908181526020018280546114e390612553565b80156115305780601f1061150557610100808354040283529160200191611530565b820191906000526020600020905b81548152906001019060200180831161151357829003601f168201915b50505050509050600060026000888152602001908152602001600020600101805461155a90612553565b80601f016020809104026020016040519081016040528092919081815260200182805461158690612553565b80156115d35780601f106115a8576101008083540402835291602001916115d3565b820191906000526020600020905b8154815290600101906020018083116115b657829003601f168201915b50505050509050600060026000898152602001908152602001600020600201805480602002602001604051908101604052809291908181526020016000905b828210156116be57838290600052602060002001805461163190612553565b80601f016020809104026020016040519081016040528092919081815260200182805461165d90612553565b80156116aa5780601f1061167f576101008083540402835291602001916116aa565b820191906000526020600020905b81548152906001019060200180831161168d57829003601f168201915b505050505081526020019060010190611612565b505050509050606060005b86518110156117d657600260008b81526020019081526020016000206003018782815181106116fa576116fa612752565b602002602001015160405161170f9190612768565b9081526020016040518091039020805461172890612553565b80601f016020809104026020016040519081016040528092919081815260200182805461175490612553565b80156117a15780601f10611776576101008083540402835291602001916117a1565b820191906000526020600020905b81548152906001019060200180831161178457829003601f168201915b50505050508282815181106117b8576117b8612752565b602002602001018190525080806117ce90612784565b9150506116c9565b5092989197509550909350915050565b3360009081526020819052604090205460ff168061180e57506001546001600160a01b031633145b61182a5760405162461bcd60e51b81526004016109b8906125f1565b60018151116118875760405162461bcd60e51b8152602060048201526024808201527f546869732066756e6374696f6e20616363657074732062756c6b2061646472656044820152637373657360e01b60648201526084016109b8565b60005b8151811015610ee9576001600960008484815181106118ab576118ab612752565b6020908102919091018101516001600160a01b03168252810191909152604001600020600101805460ff1916911515919091179055806118ea81612784565b91505061188a565b3360009081526020819052604090205460ff168061191a57506001546001600160a01b031633145b6119365760405162461bcd60e51b81526004016109b8906125f1565b6001600160a01b03919091166000908152600960205260409020600101805460ff1916911515919091179055565b6001600160a01b03918216600090815260146020908152604080832093909416825291909152205460ff1690565b3360009081526020819052604090205460ff16806119ba57506001546001600160a01b031633145b6119d65760405162461bcd60e51b81526004016109b8906125f1565b600380546001600160a01b039092166001600160a01b0319928316811790915560048054909216179055565b3360009081526020819052604090205460ff1680611a2a57506001546001600160a01b031633145b611a465760405162461bcd60e51b81526004016109b8906125f1565b600480546040516370a0823160e01b815230928101929092526001600160a01b03169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abd91906125d8565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611b08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffd91906125bb565b6000600d54821080156107c8575050600090815260116020526040902054600160e01b161590565b600081600d54811015611ba25760008181526011602052604081205490600160e01b82169003611ba0575b8060000361148c575060001901600081815260116020526040902054611b7f565b505b604051636f96cda160e11b815260040160405180910390fd5b600d5482600003611bde57604051622e076360e81b815260040160405180910390fd5b81600003611bff5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660009081526012602090815260408083208054680100000000000000018702019055838352601190915290204260a01b84176001841460e11b179055808083015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611c4a5750600d55505050565b6000611ca182611b54565b9050836001600160a01b0316816001600160a01b031614611cd45760405162a1148160e81b815260040160405180910390fd5b6000828152601360205260408120546001600160a01b0390811691908616331480611d045750611d048633611964565b80611d1757506001600160a01b03821633145b905080611d3757604051632ce44b5f60e11b815260040160405180910390fd5b84600003611d5857604051633a954ecd60e21b815260040160405180910390fd5b8115611d7b57600084815260136020526040902080546001600160a01b03191690555b6001600160a01b038681166000908152601260209081526040808320805460001901905592881682528282208054600101905586825260119052908120600160e11b4260a01b8817811790915584169003611e0657600184016000818152601160205260408120549003611e0457600d548114611e045760008181526011602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611e8490339089908890889060040161279d565b6020604051808303816000875af1925050508015611ebf575060408051601f3d908101601f19168201909252611ebc918101906127da565b60015b611f1d573d808015611eed576040519150601f19603f3d011682016040523d82523d6000602084013e611ef2565b606091505b508051600003611f15576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b600c5460609060ff16611f5557600a80546107dd90612553565b600b80546107dd90612553565b604080516080810191829052607f0190826030600a8206018353600a90045b8015611f9f57600183039250600a81066030018353600a9004611f81565b50819003601f19909101908152919050565b828054611fbd90612553565b90600052602060002090601f016020900481019282611fdf5760008555612025565b82601f10611ff857805160ff1916838001178555612025565b82800160010185558215612025579182015b8281111561202557825182559160200191906001019061200a565b50612031929150612035565b5090565b5b808211156120315760008155600101612036565b6001600160e01b031981168114610ffd57600080fd5b60006020828403121561207257600080fd5b813561148c8161204a565b60005b83811015612098578181015183820152602001612080565b838111156112e75750506000910152565b600081518084526120c181602086016020860161207d565b601f01601f19169290920160200192915050565b60208152600061148c60208301846120a9565b6000602082840312156120fa57600080fd5b5035919050565b80356001600160a01b0381168114610d3357600080fd5b6000806040838503121561212b57600080fd5b61213483612101565b946020939093013593505050565b60006020828403121561215457600080fd5b61148c82612101565b60008060006060848603121561217257600080fd5b61217b84612101565b925061218960208501612101565b9150604084013590509250925092565b8015158114610ffd57600080fd5b600080604083850312156121ba57600080fd5b6121c383612101565b915060208301356121d381612199565b809150509250929050565b600080604083850312156121f157600080fd5b8235915061220160208401612101565b90509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561224257835183529284019291840191600101612226565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561228d5761228d61224e565b604052919050565b600067ffffffffffffffff8311156122af576122af61224e565b6122c2601f8401601f1916602001612264565b90508281528383830111156122d657600080fd5b828260208301376000602084830101529392505050565b6000602082840312156122ff57600080fd5b813567ffffffffffffffff81111561231657600080fd5b8201601f8101841361232757600080fd5b611f3384823560208401612295565b6000806000806080858703121561234c57600080fd5b61235585612101565b935061236360208601612101565b925060408501359150606085013567ffffffffffffffff81111561238657600080fd5b8501601f8101871361239757600080fd5b6123a687823560208401612295565b91505092959194509250565b6000602082840312156123c457600080fd5b813561148c81612199565b600081518084526020808501808196508360051b8101915082860160005b858110156124175782840389526124058483516120a9565b988501989350908401906001016123ed565b5091979650505050505050565b60808152600061243760808301876120a9565b828103602084015261244981876120a9565b9050828103604084015261245d81866123cf565b9050828103606084015261247181856123cf565b979650505050505050565b6000602080838503121561248f57600080fd5b823567ffffffffffffffff808211156124a757600080fd5b818501915085601f8301126124bb57600080fd5b8135818111156124cd576124cd61224e565b8060051b91506124de848301612264565b81815291830184019184810190888411156124f857600080fd5b938501935b8385101561251d5761250e85612101565b825293850193908501906124fd565b98975050505050505050565b6000806040838503121561253c57600080fd5b61254583612101565b915061220160208401612101565b600181811c9082168061256757607f821691505b60208210810361258757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156125b6576125b661258d565b500190565b6000602082840312156125cd57600080fd5b815161148c81612199565b6000602082840312156125ea57600080fd5b5051919050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b600181815b8085111561264f5781600019048211156126355761263561258d565b8085161561264257918102915b93841c9390800290612619565b509250929050565b600082612666575060016107c8565b81612673575060006107c8565b81600181146126895760028114612693576126af565b60019150506107c8565b60ff8411156126a4576126a461258d565b50506001821b6107c8565b5060208310610133831016604e8410600b84101617156126d2575081810a6107c8565b6126dc8383612614565b80600019048211156126f0576126f061258d565b029392505050565b600061148c8383612657565b600081600019048311821515161561271e5761271e61258d565b500290565b6000835161273581846020880161207d565b83519083019061274981836020880161207d565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b6000825161277a81846020870161207d565b9190910192915050565b6000600182016127965761279661258d565b5060010190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127d0908301846120a9565b9695505050505050565b6000602082840312156127ec57600080fd5b815161148c8161204a56fea2646970667358221220609a1e7dd5f9b1da501777fda34ef49b0adc485232ee9c722a6240822b05b0eb64736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000009536d6f6c697a617264000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064c495a4152440000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): Smolizard
Arg [1] : symbol_ (string): LIZARD
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [3] : 536d6f6c697a6172640000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 4c495a4152440000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
6080:28052:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13334:607;;;;;;;;;;-1:-1:-1;13334:607:2;;;;;:::i;:::-;;:::i;:::-;;;565:14:3;;558:22;540:41;;528:2;513:18;13334:607:2;;;;;;;;18244:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20744:200::-;;;;;;;;;;-1:-1:-1;20744:200:2;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:3;;;1674:51;;1662:2;1647:18;20744:200:2;1528:203:3;20215:468:2;;;;;;;;;;-1:-1:-1;20215:468:2;;;;;:::i;:::-;;:::i;8960:882::-;;;;;;;;;;;;;:::i;12419:309::-;;;;;;;;;;-1:-1:-1;12681:12:2;;12665:13;;:28;12419:309;;;2319:25:3;;;2307:2;2292:18;12419:309:2;2173:177:3;4380:250:2;;;;;;;;;;-1:-1:-1;4380:250:2;;;;;:::i;:::-;;:::i;21606:164::-;;;;;;;;;;-1:-1:-1;21606:164:2;;;;;:::i;:::-;;:::i;756:91:1:-;;;;;;;;;;-1:-1:-1;756:91:1;;;;;:::i;:::-;;:::i;277:104::-;;;;;;;;;;-1:-1:-1;277:104:1;;;;;:::i;:::-;;:::i;19333:95:2:-;;;;;;;;;;;;;:::i;21836:179::-;;;;;;;;;;-1:-1:-1;21836:179:2;;;;;:::i;:::-;;:::i;18040:142::-;;;;;;;;;;-1:-1:-1;18040:142:2;;;;;:::i;:::-;;:::i;14000:234::-;;;;;;;;;;-1:-1:-1;14000:234:2;;;;;:::i;:::-;;:::i;12821:277::-;;;;;;;;;;-1:-1:-1;13050:13:2;;12821:277;;9849:99;;;;;;;;;;-1:-1:-1;9849:99:2;;;;;:::i;:::-;;:::i;4984:95::-;;;;;;;;;;-1:-1:-1;4984:95:2;;;;;:::i;:::-;;:::i;5223:160::-;;;;;;;;;;;;;:::i;3475:89::-;;;;;;;;;;-1:-1:-1;3475:89:2;;;;;:::i;:::-;;:::i;18406:102::-;;;;;;;;;;;;;:::i;4636:211::-;;;;;;;;;;-1:-1:-1;4636:211:2;;;;;:::i;:::-;;:::i;21011:303::-;;;;;;;;;;-1:-1:-1;21011:303:2;;;;;:::i;:::-;;:::i;4098:130::-;;;;;;;;;;-1:-1:-1;4098:130:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3263:30::-;;;;;;;;;;;;;;;;19434:166;;;;;;;;;;-1:-1:-1;19434:166:2;;;;;:::i;:::-;;:::i;2934:65::-;;;;;;;;;;-1:-1:-1;2934:65:2;;;;-1:-1:-1;;;;;2934:65:2;;;22081:385;;;;;;;;;;-1:-1:-1;22081:385:2;;;;;:::i;:::-;;:::i;175:97:1:-;;;;;;;;;;-1:-1:-1;175:97:1;;;;;:::i;:::-;-1:-1:-1;;;;;252:13:1;229:4;252:13;;;;;;;;;;;;;;175:97;4234:140:2;;;;;;;;;;-1:-1:-1;4234:140:2;;;;;:::i;:::-;;:::i;3570:107::-;;;;;;;;;;-1:-1:-1;3570:107:2;;;;;:::i;:::-;;:::i;19606:108::-;;;;;;;;;;-1:-1:-1;19606:108:2;;;;;:::i;:::-;;:::i;18574:313::-;;;;;;;;;;-1:-1:-1;18574:313:2;;;;;:::i;:::-;;:::i;1259:596::-;;;;;;;;;;-1:-1:-1;1259:596:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;3830:262::-;;;;;;;;;;-1:-1:-1;3830:262:2;;;;;:::i;:::-;;:::i;3684:140::-;;;;;;;;;;-1:-1:-1;3684:140:2;;;;;:::i;:::-;;:::i;21380:164::-;;;;;;;;;;-1:-1:-1;21380:164:2;;;;;:::i;:::-;;:::i;4853:125::-;;;;;;;;;;-1:-1:-1;4853:125:2;;;;;:::i;:::-;;:::i;5085:132::-;;;;;;;;;;;;;:::i;3341:50::-;;;;;;;;;;-1:-1:-1;3341:50:2;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9291:25:3;;;9359:14;;9352:22;9347:2;9332:18;;9325:50;9391:18;;;9384:34;9279:2;9264:18;3341:50:2;9095:329:3;3230:26:2;;;;;;;;;;;;;;;;13334:607;13419:4;-1:-1:-1;;;;;;;;;13714:25:2;;;;:101;;-1:-1:-1;;;;;;;;;;13790:25:2;;;13714:101;:177;;;-1:-1:-1;;;;;;;;;;13866:25:2;;;13714:177;13695:196;13334:607;-1:-1:-1;;13334:607:2:o;18244:98::-;18298:13;18330:5;18323:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18244:98;:::o;20744:200::-;20812:7;20836:16;20844:7;20836;:16::i;:::-;20831:64;;20861:34;;-1:-1:-1;;;20861:34:2;;;;;;;;;;;20831:64;-1:-1:-1;20913:24:2;;;;:15;:24;;;;;;-1:-1:-1;;;;;20913:24:2;;20744:200::o;20215:468::-;20287:14;20320:27;20339:7;20320:18;:27::i;:::-;20287:62;;20369:6;-1:-1:-1;;;;;20363:12:2;:2;-1:-1:-1;;;;;20363:12:2;;20359:49;;20384:24;;-1:-1:-1;;;20384:24:2;;;;;;;;;;;20359:49;32092:10;-1:-1:-1;;;;;20423:29:2;;;20419:174;;20471:45;20488:6;32092:10;21380:164;:::i;20471:45::-;20466:127;;20543:35;;-1:-1:-1;;;20543:35:2;;;;;;;;;;;20466:127;20603:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;20603:29:2;-1:-1:-1;;;;;20603:29:2;;;;;;;;;20647;;20603:24;;20647:29;;;;;;;20277:406;20215:468;;:::o;8960:882::-;666:6:1;;-1:-1:-1;;;666:6:1;;;;665:7;657:29;;;;-1:-1:-1;;;657:29:1;;10016:2:3;657:29:1;;;9998:21:3;10055:1;10035:18;;;10028:29;-1:-1:-1;;;10073:18:3;;;10066:39;10122:18;;657:29:1;;;;;;;;;705:4;696:13;;-1:-1:-1;;;;696:13:1;-1:-1:-1;;;696:13:1;;;9060:11:2::1;::::0;9043:13:::1;::::0;9015:10:::1;::::0;-1:-1:-1;9043:28:2::1;9035:54;;;::::0;-1:-1:-1;;;9035:54:2;;10353:2:3;9035:54:2::1;::::0;::::1;10335:21:3::0;10392:2;10372:18;;;10365:30;-1:-1:-1;;;10411:18:3;;;10404:43;10464:18;;9035:54:2::1;10151:337:3::0;9035:54:2::1;-1:-1:-1::0;;;;;9103:14:2;::::1;;::::0;;;:7:::1;:14;::::0;;;;:29:::1;;::::0;::::1;;9100:278;;;-1:-1:-1::0;;;;;9170:14:2;::::1;;::::0;;;:7:::1;:14;::::0;;;;:24:::1;;::::0;:33:::1;::::0;9197:6:::1;9170:33;:::i;:::-;9151:15;:53;9148:138;;;9251:1;9232:16;9242:5;9232:9;:16::i;:::-;:20;9224:47;;;::::0;-1:-1:-1;;;9224:47:2;;10960:2:3;9224:47:2::1;::::0;::::1;10942:21:3::0;10999:2;10979:18;;;10972:30;-1:-1:-1;;;11018:18:3;;;11011:44;11072:18;;9224:47:2::1;10758:338:3::0;9224:47:2::1;9100:278;;;9347:1;9328:16;9338:5;9328:9;:16::i;:::-;:20;9320:47;;;::::0;-1:-1:-1;;;9320:47:2;;10960:2:3;9320:47:2::1;::::0;::::1;10942:21:3::0;10999:2;10979:18;;;10972:30;-1:-1:-1;;;11018:18:3;;;11011:44;11072:18;;9320:47:2::1;10758:338:3::0;9320:47:2::1;-1:-1:-1::0;;;;;9400:14:2;::::1;;::::0;;;:7:::1;:14;::::0;;;;:29:::1;;::::0;::::1;;9395:309;;9454:35;9483:5;9454:28;:35::i;:::-;9446:65;;;::::0;-1:-1:-1;;;9446:65:2;;11303:2:3;9446:65:2::1;::::0;::::1;11285:21:3::0;11342:2;11322:18;;;11315:30;-1:-1:-1;;;11361:18:3;;;11354:47;11418:18;;9446:65:2::1;11101:341:3::0;9446:65:2::1;9570:15;;9533:33;9560:5;9533:26;:33::i;:::-;:52;;9525:91;;;::::0;-1:-1:-1;;;9525:91:2;;11649:2:3;9525:91:2::1;::::0;::::1;11631:21:3::0;11688:2;11668:18;;;11661:30;11727:28;11707:18;;;11700:56;11773:18;;9525:91:2::1;11447:350:3::0;9525:91:2::1;9630:11;::::0;;9677:15:::1;::::0;9630:63:::1;::::0;-1:-1:-1;;;9630:63:2;;-1:-1:-1;;;;;12060:15:3;;;9630:63:2;;::::1;12042:34:3::0;;;;9670:4:2::1;12092:18:3::0;;;12085:43;12144:18;;;12137:34;;;;9630:11:2;::::1;::::0;:24:::1;::::0;11977:18:3;;9630:63:2::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9395:309;-1:-1:-1::0;;;;;9723:14:2;::::1;;::::0;;;:7:::1;:14;::::0;;;;9750:15:::1;9723:24;::::0;::::1;:42:::0;9775:33;;9807:1:::1;::::0;9723:14;9775:33:::1;::::0;9807:1;;9775:33:::1;:::i;:::-;::::0;;;-1:-1:-1;9818:15:2::1;::::0;-1:-1:-1;9824:5:2;9831:1:::1;9818:5;:15::i;:::-;-1:-1:-1::0;730:6:1;:14;;-1:-1:-1;;;;730:14:1;;;8960:882:2:o;4380:250::-;4528:15;;4481:11;;;:43;;-1:-1:-1;;;4481:43:2;;-1:-1:-1;;;;;12662:15:3;;;4481:43:2;;;12644:34:3;;;;4518:4:2;12694:18:3;;;12687:43;4454:12:2;;4528:15;4481:11;;;;:21;;12579:18:3;;4481:43:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;4478:146;;-1:-1:-1;4566:4:2;;4380:250;-1:-1:-1;4380:250:2:o;4478:146::-;-1:-1:-1;4608:5:2;;4380:250;-1:-1:-1;4380:250:2:o;4478:146::-;4380:250;;;:::o;21606:164::-;21735:28;21745:4;21751:2;21755:7;21735:9;:28::i;:::-;21606:164;;;:::o;756:91:1:-;433:10;425:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;460:5:1;;-1:-1:-1;;;;;460:5:1;448:10;:17;425:40;416:63;;;;-1:-1:-1;;;416:63:1;;;;;;;:::i;:::-;823:5:::1;:17:::0;;-1:-1:-1;;;;;;823:17:1::1;-1:-1:-1::0;;;;;823:17:1;;;::::1;::::0;;;::::1;::::0;;756:91::o;277:104::-;433:10;425:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;460:5:1;;-1:-1:-1;;;;;460:5:1;448:10;:17;425:40;416:63;;;;-1:-1:-1;;;416:63:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;353:13:1;;;::::1;:7;:13:::0;;;::::1;::::0;;;;;;:21;;-1:-1:-1;;353:21:1::1;::::0;::::1;;::::0;;;::::1;::::0;;277:104::o;19333:95:2:-;19377:13;19409:12;19402:19;;;;;:::i;21836:179::-;21969:39;21986:4;21992:2;21996:7;21969:39;;;;;;;;;;;;:16;:39::i;18040:142::-;18104:7;18146:27;18165:7;18146:18;:27::i;14000:234::-;14065:7;14106:6;14117:1;14088:30;14084:71;;14127:28;;-1:-1:-1;;;14127:28:2;;;;;;;;;;;14084:71;-1:-1:-1;;;;;;14172:26:2;;;;;:18;:26;;;;;;6424:13;14172:55;;14000:234::o;9849:99::-;433:10:1;425:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;460:5:1;;-1:-1:-1;;;;;460:5:1;448:10;:17;425:40;416:63;;;;-1:-1:-1;;;416:63:1;;;;;;;:::i;:::-;9921:19:2::1;9927:2;9931:8;9921:5;:19::i;:::-;9849:99:::0;;:::o;4984:95::-;433:10:1;425:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;460:5:1;;-1:-1:-1;;;;;460:5:1;448:10;:17;425:40;416:63;;;;-1:-1:-1;;;416:63:1;;;;;;;:::i;:::-;5054:10:2::1;:18:::0;4984:95::o;5223:160::-;433:10:1;425:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;460:5:1;;-1:-1:-1;;;;;460:5:1;448:10;:17;425:40;416:63;;;;-1:-1:-1;;;416:63:1;;;;;;;:::i;:::-;5290:51:2::1;::::0;5277:9:::1;::::0;5290:10:::1;::::0;5314:21:::1;::::0;5277:9;5290:51;5277:9;5290:51;5314:21;5290:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5276:65;;;5359:4;5351:25;;;::::0;-1:-1:-1;;;5351:25:2;;13679:2:3;5351:25:2::1;::::0;::::1;13661:21:3::0;13718:1;13698:18;;;13691:29;-1:-1:-1;;;13736:18:3;;;13729:38;13784:18;;5351:25:2::1;13477:331:3::0;5351:25:2::1;5266:117;5223:160::o:0;3475:89::-;433:10:1;425:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;460:5:1;;-1:-1:-1;;;;;460:5:1;448:10;:17;425:40;416:63;;;;-1:-1:-1;;;416:63:1;;;;;;;:::i;:::-;3538:11:2::1;:19:::0;3475:89::o;18406:102::-;18462:13;18494:7;18487:14;;;;;:::i;4636:211::-;433:10:1;425:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;460:5:1;;-1:-1:-1;;;;;460:5:1;448:10;:17;425:40;416:63;;;;-1:-1:-1;;;416:63:1;;;;;;;:::i;:::-;4716:20:2::1;:41:::0;;;4816:11:::1;::::0;;:22:::1;::::0;;-1:-1:-1;;;4816:22:2;;;;-1:-1:-1;;;;;4816:11:2;;::::1;::::0;:20:::1;::::0;:22;;::::1;::::0;::::1;::::0;;;;;;;:11;:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4809:30;::::0;:2:::1;:30;:::i;:::-;4785:20;;:55;;;;:::i;:::-;4767:15;:73:::0;-1:-1:-1;4636:211:2:o;21011:303::-;32092:10;-1:-1:-1;;;;;21109:31:2;;;21105:61;;21149:17;;-1:-1:-1;;;21149:17:2;;;;;;;;;;;21105:61;32092:10;21177:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;21177:49:2;;;;;;;;;;;;:60;;-1:-1:-1;;21177:60:2;;;;;;;;;;21252:55;;540:41:3;;;21177:49:2;;32092:10;21252:55;;513:18:3;21252:55:2;;;;;;;21011:303;;:::o;4098:130::-;-1:-1:-1;;;;;4196:14:2;;;;;;:7;:14;;;;;;;;;:25;;4189:32;;;;;;;;;;;;;;;;;4158:19;;4189:32;;;4196:25;4189:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4098:130;;;:::o;19434:166::-;433:10:1;425:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;460:5:1;;-1:-1:-1;;;;;460:5:1;448:10;:17;425:40;416:63;;;;-1:-1:-1;;;416:63:1;;;;;;;:::i;:::-;19502:15:2;;::::1;::::0;:8:::1;::::0;:15:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;19531:17:2::1;::::0;::::1;;19527:67;;19564:19:::0;;::::1;::::0;:12:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;22081:385::-:0;22242:28;22252:4;22258:2;22262:7;22242:9;:28::i;:::-;-1:-1:-1;;;;;22284:14:2;;;:19;22280:180;;22322:56;22353:4;22359:2;22363:7;22372:5;22322:30;:56::i;:::-;22317:143;;22405:40;;-1:-1:-1;;;22405:40:2;;;;;;;;;;;22317:143;22081:385;;;;:::o;4234:140::-;4339:11;;;:28;;-1:-1:-1;;;4339:28:2;;-1:-1:-1;;;;;1692:32:3;;;4339:28:2;;;1674:51:3;;;;4306:14:2;;4339:11;;;;:21;;1647:18:3;;4339:28:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3570:107::-;433:10:1;425:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;460:5:1;;-1:-1:-1;;;;;460:5:1;448:10;:17;425:40;416:63;;;;-1:-1:-1;;;416:63:1;;;;;;;:::i;:::-;3642:17:2::1;:28:::0;;-1:-1:-1;;3642:28:2::1;::::0;::::1;;::::0;;;::::1;::::0;;3570:107::o;19606:108::-;433:10:1;425:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;460:5:1;;-1:-1:-1;;;;;460:5:1;448:10;:17;425:40;416:63;;;;-1:-1:-1;;;416:63:1;;;;;;;:::i;:::-;19683:24:2;;::::1;::::0;:12:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;18574:313::-:0;18647:13;18677:16;18685:7;18677;:16::i;:::-;18672:59;;18702:29;;-1:-1:-1;;;18702:29:2;;;;;;;;;;;18672:59;18742:21;18766:10;:8;:10::i;:::-;18742:34;;18799:7;18793:21;18818:1;18793:26;:87;;;;;;;;;;;;;;;;;18846:7;18855:18;18865:7;18855:9;:18::i;:::-;18829:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18793:87;18786:94;18574:313;-1:-1:-1;;;18574:313:2:o;1259:596::-;1423:18;1444:23;;;:14;:23;;;;;1423:54;;1319:17;;;;;;;;1423:18;1444:23;1423:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1487:18;1508:14;:23;1523:7;1508:23;;;;;;;;;;;:33;;1487:54;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1551:27;1581:14;:23;1596:7;1581:23;;;;;;;;;;;:34;;1551:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1625:27;1666:6;1662:133;1678:10;:17;1674:1;:21;1662:133;;;1734:14;:23;1749:7;1734:23;;;;;;;;;;;:34;;1769:10;1780:1;1769:13;;;;;;;;:::i;:::-;;;;;;;1734:49;;;;;;:::i;:::-;;;;;;;;;;;;;1716:68;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;1728:1;1716:14;;;;;;;;:::i;:::-;;;;;;:68;;;;1697:3;;;;;:::i;:::-;;;;1662:133;;;-1:-1:-1;1811:4:2;;1817;;-1:-1:-1;1817:4:2;-1:-1:-1;1811:4:2;;-1:-1:-1;1259:596:2;-1:-1:-1;;1259:596:2:o;3830:262::-;433:10:1;425:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;460:5:1;;-1:-1:-1;;;;;460:5:1;448:10;:17;425:40;416:63;;;;-1:-1:-1;;;416:63:1;;;;;;;:::i;:::-;3933:1:2::1;3917:6;:13;:17;3909:66;;;::::0;-1:-1:-1;;;3909:66:2;;16590:2:3;3909:66:2::1;::::0;::::1;16572:21:3::0;16629:2;16609:18;;;16602:30;16668:34;16648:18;;;16641:62;-1:-1:-1;;;16719:18:3;;;16712:34;16763:19;;3909:66:2::1;16388:400:3::0;3909:66:2::1;3989:6;3985:101;4001:6;:13;3997:1;:17;3985:101;;;4071:4;4035:7;:18;4043:6;4050:1;4043:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;4035:18:2::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;4035:18:2;:33:::1;;:40:::0;;-1:-1:-1;;4035:40:2::1;::::0;::::1;;::::0;;;::::1;::::0;;4016:3;::::1;::::0;::::1;:::i;:::-;;;;3985:101;;3684:140:::0;433:10:1;425:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;460:5:1;;-1:-1:-1;;;;;460:5:1;448:10;:17;425:40;416:63;;;;-1:-1:-1;;;416:63:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;3770:14:2;;;::::1;;::::0;;;:7:::1;:14;::::0;;;;:29:::1;;:47:::0;;-1:-1:-1;;3770:47:2::1;::::0;::::1;;::::0;;;::::1;::::0;;3684:140::o;21380:164::-;-1:-1:-1;;;;;21501:26:2;;;21478:4;21501:26;;;:18;:26;;;;;;;;:36;;;;;;;;;;;;;;;21380:164::o;4853:125::-;433:10:1;425:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;460:5:1;;-1:-1:-1;;;;;460:5:1;448:10;:17;425:40;416:63;;;;-1:-1:-1;;;416:63:1;;;;;;;:::i;:::-;4921:5:2::1;:13:::0;;-1:-1:-1;;;;;4921:13:2;;::::1;-1:-1:-1::0;;;;;;4921:13:2;;::::1;::::0;::::1;::::0;;;4944:11:::1;:27:::0;;;;::::1;;::::0;;4853:125::o;5085:132::-;433:10:1;425:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;460:5:1;;-1:-1:-1;;;;;460:5:1;448:10;:17;425:40;416:63;;;;-1:-1:-1;;;416:63:1;;;;;;;:::i;:::-;5140:11:2::1;::::0;;5173:36:::1;::::0;-1:-1:-1;;;5173:36:2;;5203:4:::1;5173:36:::0;;::::1;1674:51:3::0;;;;-1:-1:-1;;;;;5140:11:2::1;::::0;:20:::1;::::0;5161:10:::1;::::0;5140:11;;5173:21:::1;::::0;1647:18:3;;5173:36:2::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5140:70;::::0;-1:-1:-1;;;;;;5140:70:2::1;::::0;;;;;;-1:-1:-1;;;;;16985:32:3;;;5140:70:2::1;::::0;::::1;16967:51:3::0;17034:18;;;17027:34;16940:18;;5140:70:2::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22712:268::-:0;22769:4;22856:13;;22846:7;:23;22804:150;;;;-1:-1:-1;;22906:26:2;;;;:17;:26;;;;;;-1:-1:-1;;;22906:43:2;:48;;22712:268::o;15617:1105::-;15684:7;15718;15816:13;;15809:4;:20;15805:853;;;15853:14;15870:23;;;:17;:23;;;;;;;-1:-1:-1;;;15957:23:2;;:28;;15953:687;;16468:111;16475:6;16485:1;16475:11;16468:111;;-1:-1:-1;;;16545:6:2;16527:25;;;;:17;:25;;;;;;16468:111;;15953:687;15831:827;15805:853;16684:31;;-1:-1:-1;;;16684:31:2;;;;;;;;;;;10195:1625;10279:13;;10324:2;10331:1;10306:26;10302:58;;10341:19;;-1:-1:-1;;;10341:19:2;;;;;;;;;;;10302:58;10374:8;10386:1;10374:13;10370:44;;10396:18;;-1:-1:-1;;;10396:18:2;;;;;;;;;;;10370:44;-1:-1:-1;;;;;10950:22:2;;;;;;:18;:22;;;;6558:2;10950:22;;;:70;;10988:31;10976:44;;10950:70;;;11256:31;;;:17;:31;;;;;11347:15;7063:3;11347:41;11306:83;;-1:-1:-1;11424:13:2;;7320:3;11409:56;11306:160;11256:210;;:31;11544:23;;;11582:109;11608:40;;11633:14;;;;;-1:-1:-1;;;;;11608:40:2;;;11625:1;;11608:40;;11625:1;;11608:40;11686:3;11671:12;:18;11582:109;;-1:-1:-1;11705:13:2;:28;21606:164;;;:::o;23222:2595::-;23332:27;23362;23381:7;23362:18;:27::i;:::-;23332:57;;23445:4;-1:-1:-1;;;;;23404:45:2;23420:19;-1:-1:-1;;;;;23404:45:2;;23400:86;;23458:28;;-1:-1:-1;;;23458:28:2;;;;;;;;;;;23400:86;23497:23;23523:24;;;:15;:24;;;;;;-1:-1:-1;;;;;23523:24:2;;;;23497:23;23584:27;;32092:10;23584:27;;:86;;-1:-1:-1;23627:43:2;23644:4;32092:10;21380:164;:::i;23627:43::-;23584:140;;;-1:-1:-1;;;;;;23686:38:2;;32092:10;23686:38;23584:140;23558:167;;23741:17;23736:66;;23767:35;;-1:-1:-1;;;23767:35:2;;;;;;;;;;;23736:66;23834:2;23841:1;23816:26;23812:62;;23851:23;;-1:-1:-1;;;23851:23:2;;;;;;;;;;;23812:62;24013:15;23995:39;23991:101;;24057:24;;;;:15;:24;;;;;24050:31;;-1:-1:-1;;;;;;24050:31:2;;;23991:101;-1:-1:-1;;;;;24452:24:2;;;;;;;:18;:24;;;;;;;;24450:26;;-1:-1:-1;;24450:26:2;;;24520:22;;;;;;;;24518:24;;-1:-1:-1;24518:24:2;;;24806:26;;;:17;:26;;;;;-1:-1:-1;;;24892:15:2;7063:3;24892:41;24851:83;;:126;;24806:171;;;25094:46;;:51;;25090:616;;25197:1;25187:11;;25165:19;25318:30;;;:17;:30;;;;;;:35;;25314:378;;25454:13;;25439:11;:28;25435:239;;25599:30;;;;:17;:30;;;;;:52;;;25435:239;25147:559;25090:616;25750:7;25746:2;-1:-1:-1;;;;;25731:27:2;25740:4;-1:-1:-1;;;;;25731:27:2;;;;;;;;;;;23322:2495;;;23222:2595;;;:::o;29546:697::-;29724:88;;-1:-1:-1;;;29724:88:2;;29704:4;;-1:-1:-1;;;;;29724:45:2;;;;;:88;;32092:10;;29791:4;;29797:7;;29806:5;;29724:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29724:88:2;;;;;;;;-1:-1:-1;;29724:88:2;;;;;;;;;;;;:::i;:::-;;;29720:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30002:6;:13;30019:1;30002:18;29998:229;;30047:40;;-1:-1:-1;;;30047:40:2;;;;;;;;;;;29998:229;30187:6;30181:13;30172:6;30168:2;30164:15;30157:38;29720:517;-1:-1:-1;;;;;;29880:64:2;-1:-1:-1;;;29880:64:2;;-1:-1:-1;29720:517:2;29546:697;;;;;;:::o;19128:199::-;19208:17;;19179:13;;19208:17;;19204:117;;19248:8;19241:15;;;;;:::i;19204:117::-;19294:12;19287:19;;;;;:::i;32210:1920::-;32675:4;32669:11;;32682:3;32665:21;;32758:17;;;;33442:11;;;33323:5;33572:2;33586;33576:13;;33568:22;33442:11;33555:36;33626:2;33616:13;;33216:668;33644:4;33216:668;;;33815:1;33810:3;33806:11;33799:18;;33865:2;33859:4;33855:13;33851:2;33847:22;33842:3;33834:36;33738:2;33728:13;;33216:668;;;-1:-1:-1;33924:13:2;;;-1:-1:-1;;34037:12:2;;;34095:19;;;34037:12;32210:1920;-1:-1:-1;32210:1920:2:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:3;-1:-1:-1;;;;;;88:32:3;;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;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:3;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:3;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:3:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:3;;1343:180;-1:-1:-1;1343:180:3:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:3;;1843:42;;1833:70;;1899:1;1896;1889:12;1914:254;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:3:o;2355:186::-;2414:6;2467:2;2455:9;2446:7;2442:23;2438:32;2435:52;;;2483:1;2480;2473:12;2435:52;2506:29;2525:9;2506:29;:::i;2546:328::-;2623:6;2631;2639;2692:2;2680:9;2671:7;2667:23;2663:32;2660:52;;;2708:1;2705;2698:12;2660:52;2731:29;2750:9;2731:29;:::i;:::-;2721:39;;2779:38;2813:2;2802:9;2798:18;2779:38;:::i;:::-;2769:48;;2864:2;2853:9;2849:18;2836:32;2826:42;;2546:328;;;;;:::o;2879:118::-;2965:5;2958:13;2951:21;2944:5;2941:32;2931:60;;2987:1;2984;2977:12;3002:315;3067:6;3075;3128:2;3116:9;3107:7;3103:23;3099:32;3096:52;;;3144:1;3141;3134:12;3096:52;3167:29;3186:9;3167:29;:::i;:::-;3157:39;;3246:2;3235:9;3231:18;3218:32;3259:28;3281:5;3259:28;:::i;:::-;3306:5;3296:15;;;3002:315;;;;;:::o;3322:254::-;3390:6;3398;3451:2;3439:9;3430:7;3426:23;3422:32;3419:52;;;3467:1;3464;3457:12;3419:52;3503:9;3490:23;3480:33;;3532:38;3566:2;3555:9;3551:18;3532:38;:::i;:::-;3522:48;;3322:254;;;;;:::o;3581:632::-;3752:2;3804:21;;;3874:13;;3777:18;;;3896:22;;;3723:4;;3752:2;3975:15;;;;3949:2;3934:18;;;3723:4;4018:169;4032:6;4029:1;4026:13;4018:169;;;4093:13;;4081:26;;4162:15;;;;4127:12;;;;4054:1;4047:9;4018:169;;;-1:-1:-1;4204:3:3;;3581:632;-1:-1:-1;;;;;;3581:632:3:o;4218:127::-;4279:10;4274:3;4270:20;4267:1;4260:31;4310:4;4307:1;4300:15;4334:4;4331:1;4324:15;4350:275;4421:2;4415:9;4486:2;4467:13;;-1:-1:-1;;4463:27:3;4451:40;;4521:18;4506:34;;4542:22;;;4503:62;4500:88;;;4568:18;;:::i;:::-;4604:2;4597:22;4350:275;;-1:-1:-1;4350:275:3:o;4630:407::-;4695:5;4729:18;4721:6;4718:30;4715:56;;;4751:18;;:::i;:::-;4789:57;4834:2;4813:15;;-1:-1:-1;;4809:29:3;4840:4;4805:40;4789:57;:::i;:::-;4780:66;;4869:6;4862:5;4855:21;4909:3;4900:6;4895:3;4891:16;4888:25;4885:45;;;4926:1;4923;4916:12;4885:45;4975:6;4970:3;4963:4;4956:5;4952:16;4939:43;5029:1;5022:4;5013:6;5006:5;5002:18;4998:29;4991:40;4630:407;;;;;:::o;5042:451::-;5111:6;5164:2;5152:9;5143:7;5139:23;5135:32;5132:52;;;5180:1;5177;5170:12;5132:52;5220:9;5207:23;5253:18;5245:6;5242:30;5239:50;;;5285:1;5282;5275:12;5239:50;5308:22;;5361:4;5353:13;;5349:27;-1:-1:-1;5339:55:3;;5390:1;5387;5380:12;5339:55;5413:74;5479:7;5474:2;5461:16;5456:2;5452;5448:11;5413:74;:::i;5498:667::-;5593:6;5601;5609;5617;5670:3;5658:9;5649:7;5645:23;5641:33;5638:53;;;5687:1;5684;5677:12;5638:53;5710:29;5729:9;5710:29;:::i;:::-;5700:39;;5758:38;5792:2;5781:9;5777:18;5758:38;:::i;:::-;5748:48;;5843:2;5832:9;5828:18;5815:32;5805:42;;5898:2;5887:9;5883:18;5870:32;5925:18;5917:6;5914:30;5911:50;;;5957:1;5954;5947:12;5911:50;5980:22;;6033:4;6025:13;;6021:27;-1:-1:-1;6011:55:3;;6062:1;6059;6052:12;6011:55;6085:74;6151:7;6146:2;6133:16;6128:2;6124;6120:11;6085:74;:::i;:::-;6075:84;;;5498:667;;;;;;;:::o;6170:241::-;6226:6;6279:2;6267:9;6258:7;6254:23;6250:32;6247:52;;;6295:1;6292;6285:12;6247:52;6334:9;6321:23;6353:28;6375:5;6353:28;:::i;6416:616::-;6468:3;6506:5;6500:12;6533:6;6528:3;6521:19;6559:4;6600:2;6595:3;6591:12;6625:11;6652;6645:18;;6702:6;6699:1;6695:14;6688:5;6684:26;6672:38;;6744:2;6737:5;6733:14;6765:1;6775:231;6789:6;6786:1;6783:13;6775:231;;;6860:5;6854:4;6850:16;6845:3;6838:29;6888:38;6921:4;6912:6;6906:13;6888:38;:::i;:::-;6984:12;;;;6880:46;-1:-1:-1;6949:15:3;;;;6811:1;6804:9;6775:231;;;-1:-1:-1;7022:4:3;;6416:616;-1:-1:-1;;;;;;;6416:616:3:o;7037:831::-;7430:3;7419:9;7412:22;7393:4;7457:46;7498:3;7487:9;7483:19;7475:6;7457:46;:::i;:::-;7551:9;7543:6;7539:22;7534:2;7523:9;7519:18;7512:50;7585:33;7611:6;7603;7585:33;:::i;:::-;7571:47;;7666:9;7658:6;7654:22;7649:2;7638:9;7634:18;7627:50;7700:43;7736:6;7728;7700:43;:::i;:::-;7686:57;;7791:9;7783:6;7779:22;7774:2;7763:9;7759:18;7752:50;7819:43;7855:6;7847;7819:43;:::i;:::-;7811:51;7037:831;-1:-1:-1;;;;;;;7037:831:3:o;7873:952::-;7957:6;7988:2;8031;8019:9;8010:7;8006:23;8002:32;7999:52;;;8047:1;8044;8037:12;7999:52;8087:9;8074:23;8116:18;8157:2;8149:6;8146:14;8143:34;;;8173:1;8170;8163:12;8143:34;8211:6;8200:9;8196:22;8186:32;;8256:7;8249:4;8245:2;8241:13;8237:27;8227:55;;8278:1;8275;8268:12;8227:55;8314:2;8301:16;8336:2;8332;8329:10;8326:36;;;8342:18;;:::i;:::-;8388:2;8385:1;8381:10;8371:20;;8411:28;8435:2;8431;8427:11;8411:28;:::i;:::-;8473:15;;;8543:11;;;8539:20;;;8504:12;;;;8571:19;;;8568:39;;;8603:1;8600;8593:12;8568:39;8627:11;;;;8647:148;8663:6;8658:3;8655:15;8647:148;;;8729:23;8748:3;8729:23;:::i;:::-;8717:36;;8680:12;;;;8773;;;;8647:148;;;8814:5;7873:952;-1:-1:-1;;;;;;;;7873:952:3:o;8830:260::-;8898:6;8906;8959:2;8947:9;8938:7;8934:23;8930:32;8927:52;;;8975:1;8972;8965:12;8927:52;8998:29;9017:9;8998:29;:::i;:::-;8988:39;;9046:38;9080:2;9069:9;9065:18;9046:38;:::i;9429:380::-;9508:1;9504:12;;;;9551;;;9572:61;;9626:4;9618:6;9614:17;9604:27;;9572:61;9679:2;9671:6;9668:14;9648:18;9645:38;9642:161;;9725:10;9720:3;9716:20;9713:1;9706:31;9760:4;9757:1;9750:15;9788:4;9785:1;9778:15;9642:161;;9429:380;;;:::o;10493:127::-;10554:10;10549:3;10545:20;10542:1;10535:31;10585:4;10582:1;10575:15;10609:4;10606:1;10599:15;10625:128;10665:3;10696:1;10692:6;10689:1;10686:13;10683:39;;;10702:18;;:::i;:::-;-1:-1:-1;10738:9:3;;10625:128::o;12182:245::-;12249:6;12302:2;12290:9;12281:7;12277:23;12273:32;12270:52;;;12318:1;12315;12308:12;12270:52;12350:9;12344:16;12369:28;12391:5;12369:28;:::i;12741:184::-;12811:6;12864:2;12852:9;12843:7;12839:23;12835:32;12832:52;;;12880:1;12877;12870:12;12832:52;-1:-1:-1;12903:16:3;;12741:184;-1:-1:-1;12741:184:3:o;12930:332::-;13132:2;13114:21;;;13171:1;13151:18;;;13144:29;-1:-1:-1;;;13204:2:3;13189:18;;13182:39;13253:2;13238:18;;12930:332::o;13813:422::-;13902:1;13945:5;13902:1;13959:270;13980:7;13970:8;13967:21;13959:270;;;14039:4;14035:1;14031:6;14027:17;14021:4;14018:27;14015:53;;;14048:18;;:::i;:::-;14098:7;14088:8;14084:22;14081:55;;;14118:16;;;;14081:55;14197:22;;;;14157:15;;;;13959:270;;;13963:3;13813:422;;;;;:::o;14240:806::-;14289:5;14319:8;14309:80;;-1:-1:-1;14360:1:3;14374:5;;14309:80;14408:4;14398:76;;-1:-1:-1;14445:1:3;14459:5;;14398:76;14490:4;14508:1;14503:59;;;;14576:1;14571:130;;;;14483:218;;14503:59;14533:1;14524:10;;14547:5;;;14571:130;14608:3;14598:8;14595:17;14592:43;;;14615:18;;:::i;:::-;-1:-1:-1;;14671:1:3;14657:16;;14686:5;;14483:218;;14785:2;14775:8;14772:16;14766:3;14760:4;14757:13;14753:36;14747:2;14737:8;14734:16;14729:2;14723:4;14720:12;14716:35;14713:77;14710:159;;;-1:-1:-1;14822:19:3;;;14854:5;;14710:159;14901:34;14926:8;14920:4;14901:34;:::i;:::-;14971:6;14967:1;14963:6;14959:19;14950:7;14947:32;14944:58;;;14982:18;;:::i;:::-;15020:20;;14240:806;-1:-1:-1;;;14240:806:3:o;15051:131::-;15111:5;15140:36;15167:8;15161:4;15140:36;:::i;15187:168::-;15227:7;15293:1;15289;15285:6;15281:14;15278:1;15275:21;15270:1;15263:9;15256:17;15252:45;15249:71;;;15300:18;;:::i;:::-;-1:-1:-1;15340:9:3;;15187:168::o;15360:470::-;15539:3;15577:6;15571:13;15593:53;15639:6;15634:3;15627:4;15619:6;15615:17;15593:53;:::i;:::-;15709:13;;15668:16;;;;15731:57;15709:13;15668:16;15765:4;15753:17;;15731:57;:::i;:::-;15804:20;;15360:470;-1:-1:-1;;;;15360:470:3:o;15835:127::-;15896:10;15891:3;15887:20;15884:1;15877:31;15927:4;15924:1;15917:15;15951:4;15948:1;15941:15;15967:276;16098:3;16136:6;16130:13;16152:53;16198:6;16193:3;16186:4;16178:6;16174:17;16152:53;:::i;:::-;16221:16;;;;;15967:276;-1:-1:-1;;15967:276:3:o;16248:135::-;16287:3;16308:17;;;16305:43;;16328:18;;:::i;:::-;-1:-1:-1;16375:1:3;16364:13;;16248:135::o;17072:489::-;-1:-1:-1;;;;;17341:15:3;;;17323:34;;17393:15;;17388:2;17373:18;;17366:43;17440:2;17425:18;;17418:34;;;17488:3;17483:2;17468:18;;17461:31;;;17266:4;;17509:46;;17535:19;;17527:6;17509:46;:::i;:::-;17501:54;17072:489;-1:-1:-1;;;;;;17072:489:3:o;17566:249::-;17635:6;17688:2;17676:9;17667:7;17663:23;17659:32;17656:52;;;17704:1;17701;17694:12;17656:52;17736:9;17730:16;17755:30;17779:5;17755:30;:::i
Metadata Hash
ipfs://609a1e7dd5f9b1da501777fda34ef49b0adc485232ee9c722a6240822b05b0eb