ERC-721
NFT
Overview
Max Total Supply
6,666 SXNR
Holders
2,162
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 SXNRLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Strxngers
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT //Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721) pragma solidity ^0.8.0; /* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$J/ft////////////////////////xkkkkkkbbd&$$$ $$$$ZQQt}}/cvvvvvvvvvvvvvvvvvvvvvvvXpppqqqo##%$$$ $$$$t[}{{}ckddddddddddddddddddddddddpppbkkB$$$ $$$$j}{{{}cdppdddddddddddddddppppppppqd@$$$$$$ $$$$j}{{}[ckkC}{{{{{{{{{{{{{}(tttt/v88%$$$$ $$$$j}{fnxucc/l!!!!!!!!!!!!!l+}[[[]t$$$$ $$$$j}}CbkjIl!iiiiiiiiiiiiii!_}}}}[f$$$$ $$$$j}}Jbkjli!!!!!!!!!!!!!!i!+}[[[]t$$$$ $$$%nrx\|(xzzt}}(nxxxxxuuunnu([[/cccXzJhhkZOO0 $$$8<ll1\|){{(//umZmbbdzccJLLcxxCbbZvccUUJ000O $$$8+!i]}}~!!]/\nZOq$$8;'`{/\UZOo$$O.':\\t0ZOO $$$8<Il]}{~!i]t/umZp$$8:.'{\|UmO*$$0 ',\\/Q00O $$$%JXY]~+>!i+]](zcUook\)(uzcccvOooO)(\ccc0ZZ0 $$$$/][~!iii!+\(fOOOwwwmmwcffXZO0QQ0qqpk $$$$@@flii!!~{}\dddddddddpppppbJ[[f$$$$ $$$fIl+]?/QQz<<<<<<<<<[))|t/nLCZ$$$$ $$$$kddn)(){{xbbO]]]]]]]]](//fxrXbph$$$$ $$$@B%%x(|YZZu{{jqmqbbbbbbbbbbbbddddddh$$$$ $$$@nfj////tt/\\|))fdddppppppppppppa@@@$$$$ $$$WCCJ/\\\\\\\\\//\((\cczmwwwwwmmmmmZh$$$ $$$M|||\//rxxt\\\\\////\\/UJJJJJQOOOO0b$$$ $$$M\\////LZZu\/////\\\\\\\\\\\\YZOOO0b$$$ $$$M//////QmmO0000Ou<<+{{1\////\YZOZZOk$$$ $$$#]]]]]]\tttff\))]!!>___)))\/\YZZYnxQ$$$ $$$o!!iiii!!!!!!lll!iii!!i[}}|/\YZZx[]v$$$ $$$o!!!!!!!!!!!lxooUl!!!!i[}}|/\YZZn[[c$$$ $$$*---????????_c#*L-?????/tt/\\YZZf<>r$$$ $$$MXYXrjjjjjjjjJbb0jjjjjjfff//\YZmt!lf$$$ $$$$wZZZZZZZZZOOOZZZZZOt\\//\YZmt!lf$$$ :'######:::::'########::::'########:::::'##::::'##::::'##::: ##:::::'######::::::'########::::'########::::::'######:: '##... ##::::... ##..::::: ##.... ##::::. ##::'##::::: ###:: ##::::'##... ##::::: ##.....::::: ##.... ##::::'##... ##: ##:::..:::::::: ##::::::: ##:::: ##:::::. ##'##:::::: ####: ##:::: ##:::..:::::: ##:::::::::: ##:::: ##:::: ##:::..:: . ######:::::::: ##::::::: ########:::::::. ###::::::: ## ## ##:::: ##::'####:::: ######:::::: ########:::::. ######:: :..... ##::::::: ##::::::: ##.. ##:::::::: ## ##:::::: ##. ####:::: ##::: ##::::: ##...::::::: ##.. ##:::::::..... ##: '##::: ##::::::: ##::::::: ##::. ##:::::: ##:. ##::::: ##:. ###:::: ##::: ##::::: ##:::::::::: ##::. ##:::::'##::: ##: . ######:::::::: ##::::::: ##:::. ##:::: ##:::. ##:::: ##::. ##::::. ######:::::: ########:::: ##:::. ##::::. ######:: :......:::::::::..::::::::..:::::..:::::..:::::..:::::..::::..::::::......:::::::........:::::..:::::..::::::......::: */ import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/interfaces/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import {IStrxngersMetadata} from "./interfaces/IStrxngersMetadata.sol"; contract Strxngers is ERC721, Ownable, ReentrancyGuard { using Counters for Counters.Counter; using Strings for uint256; Counters.Counter private tokenCounter; string public STRXNGERS_PROVENANCE = ""; string private baseURI; // openSeaProxyRegistryAddress address private openSeaProxyRegistryAddress; bool private isOpenSeaProxyActive = true; // Max strxngers amount. uint256 public constant MAX_STRXNGERS = 6666; // Wallet max strxngers amount. uint256 public constant MAX_STRXNGERS_PER_WALLET_LIMIT = 5; // Max free minting amount. uint256 public constant MAX_FREE_MINTING_STRXNGERS = 433; // Max gifted amount. uint256 public constant MAX_GIFT_STRXNGERS = 400; bool public isPublicSaleActive; bool public isFreeMintActive; // RESERVED bool public useMetaDataContract = false; // RESERVED address public metaDataAddress; uint256 public numMintedStrxngers; uint256 public numGiftedStrxngers; uint256 public numFreeMintedStrxngers; mapping(address => bool) public freeMintedCounts; mapping(address => uint256) public numWalletMints; // ============ ACCESS CONTROL MODIFIERS ============ modifier publicSaleActive() { require(isPublicSaleActive, "Public sale is not open"); _; } modifier freeMintActive() { require(isFreeMintActive, "Free Mint is not open"); _; } modifier maxStrxngersPerWallet(uint256 numberOfTokens) { uint256 walletCurMints = numWalletMints[msg.sender]; require( walletCurMints + numberOfTokens <= MAX_STRXNGERS_PER_WALLET_LIMIT, "Can only mint 5 strxngers pre wallet" ); _; } modifier canMintStrxngers(uint256 numberOfTokens) { require( tokenCounter.current() + numberOfTokens <= MAX_STRXNGERS, "Not enough strxngers remaining to mint" ); _; } modifier canFreeMintStrxngers(uint256 numberOfTokens) { require( !freeMintedCounts[msg.sender], "Strxnger already free minted by this wallet" ); require( numFreeMintedStrxngers + numberOfTokens <= MAX_FREE_MINTING_STRXNGERS, "Not enough strxngers remaining to free mint" ); require( tokenCounter.current() + numberOfTokens <= MAX_STRXNGERS, "Not enough strxngers remaining to mint" ); _; } modifier canGiftStrxngers(uint256 numberOfTokens) { require( numGiftedStrxngers + numberOfTokens <= MAX_GIFT_STRXNGERS, "Not enough strxngers remaining to gift" ); require( tokenCounter.current() + numberOfTokens <= MAX_STRXNGERS, "Not enough strxngers remaining to gift" ); _; } modifier isCorrectPayment(uint256 numberOfTokens) { uint256 price = 0.01 ether; if (numMintedStrxngers + numberOfTokens > 2500) { price = 0.02 ether; } require( price * numberOfTokens == msg.value, "Incorrect ETH value sent" ); _; } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract."); _; } constructor(address _openSeaProxyRegistryAddress) ERC721("Strxngers", "SXNR") { openSeaProxyRegistryAddress = _openSeaProxyRegistryAddress; } // ============ PUBLIC FUNCTIONS FOR MINTING ============ function mint(uint256 numberOfTokens) external payable nonReentrant callerIsUser isCorrectPayment(numberOfTokens) publicSaleActive canMintStrxngers(numberOfTokens) maxStrxngersPerWallet(numberOfTokens) { uint256 walletCurMints = numWalletMints[msg.sender]; numWalletMints[msg.sender] = (walletCurMints + numberOfTokens); for (uint256 i = 0; i < numberOfTokens; i++) { numMintedStrxngers += 1; _safeMint(msg.sender, nextTokenId()); } } function freeMint() external callerIsUser freeMintActive canFreeMintStrxngers(1) { freeMintedCounts[msg.sender] = true; numFreeMintedStrxngers += 1; _safeMint(msg.sender, nextTokenId()); } // ============ PUBLIC READ-ONLY FUNCTIONS ============ function getBaseURI() external view returns (string memory) { return baseURI; } function getLastTokenId() external view returns (uint256) { return tokenCounter.current(); } function totalSupply() external view returns (uint256) { return tokenCounter.current(); } // ============ OWNER-ONLY ADMIN FUNCTIONS ============ function setBaseURI(string memory _baseURI) external onlyOwner { baseURI = _baseURI; } /* * Set provenance once it's calculated */ function setProvenanceHash(string memory _provenanceHash) public onlyOwner { STRXNGERS_PROVENANCE = _provenanceHash; } // function to disable gasless listings for security in case // opensea ever shuts down or is compromised function setIsOpenSeaProxyActive(bool _isOpenSeaProxyActive) external onlyOwner { isOpenSeaProxyActive = _isOpenSeaProxyActive; } function setIsPublicSaleActive(bool _isPublicSaleActive) external onlyOwner { isPublicSaleActive = _isPublicSaleActive; } function setIsFreeMintActive(bool _isFreeMintActive) external onlyOwner { isFreeMintActive = _isFreeMintActive; } function setMetaDataAddress(address _metaDataAddress) external onlyOwner { metaDataAddress = _metaDataAddress; } function setUseMetaDataContract(bool _useMetaDataContract) external onlyOwner { useMetaDataContract = _useMetaDataContract; } function reserveForGifting(uint256 numToReserve) external nonReentrant onlyOwner canGiftStrxngers(numToReserve) { numGiftedStrxngers += numToReserve; for (uint256 i = 0; i < numToReserve; i++) { _safeMint(msg.sender, nextTokenId()); } } function batchGiftStrxngers(address dropAddress, uint256 numToGift) external nonReentrant onlyOwner canGiftStrxngers(numToGift) { numGiftedStrxngers += numToGift; for (uint256 i = 0; i < numToGift; i++) { _safeMint(dropAddress, nextTokenId()); } } function giftStrxngers(address[] calldata addresses) external nonReentrant onlyOwner canGiftStrxngers(addresses.length) { uint256 numToGift = addresses.length; numGiftedStrxngers += numToGift; for (uint256 i = 0; i < numToGift; i++) { _safeMint(addresses[i], nextTokenId()); } } function withdraw() public onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } function withdrawTokens(IERC20 token) public onlyOwner { uint256 balance = token.balanceOf(address(this)); token.transfer(msg.sender, balance); } // ============ SUPPORTING FUNCTIONS ============ function nextTokenId() private returns (uint256) { tokenCounter.increment(); return tokenCounter.current(); } // ============ FUNCTION OVERRIDES ============ /** * @dev Override isApprovedForAll to allowlist user's OpenSea proxy accounts to enable gas-less listings. */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { // Get a reference to OpenSea's proxy registry contract by instantiating // the contract using the already existing address. ProxyRegistry proxyRegistry = ProxyRegistry( openSeaProxyRegistryAddress ); if ( isOpenSeaProxyActive && address(proxyRegistry.proxies(owner)) == operator ) { return true; } return super.isApprovedForAll(owner, operator); } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "Nonexistent token"); return useMetaDataContract ? IStrxngersMetadata(metaDataAddress).tokenURI(tokenId) : string( abi.encodePacked(baseURI, "/", tokenId.toString(), ".json") ); } } // These contract definitions are used to create a reference to the OpenSea // ProxyRegistry contract by using the registry's address (see isApprovedForAll). contract OwnableDelegateProxy { } contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; }
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; interface IStrxngersMetadata { function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; import "../token/ERC20/IERC20.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_openSeaProxyRegistryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_FREE_MINTING_STRXNGERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GIFT_STRXNGERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_STRXNGERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_STRXNGERS_PER_WALLET_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STRXNGERS_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dropAddress","type":"address"},{"internalType":"uint256","name":"numToGift","type":"uint256"}],"name":"batchGiftStrxngers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintedCounts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"giftStrxngers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isFreeMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metaDataAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numFreeMintedStrxngers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numGiftedStrxngers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numMintedStrxngers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numWalletMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numToReserve","type":"uint256"}],"name":"reserveForGifting","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":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isFreeMintActive","type":"bool"}],"name":"setIsFreeMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isOpenSeaProxyActive","type":"bool"}],"name":"setIsOpenSeaProxyActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPublicSaleActive","type":"bool"}],"name":"setIsPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_metaDataAddress","type":"address"}],"name":"setMetaDataAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_useMetaDataContract","type":"bool"}],"name":"setUseMetaDataContract","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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useMetaDataContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600990805190602001906200002b92919062000273565b506001600b60146101000a81548160ff0219169083151502179055506000600b60176101000a81548160ff0219169083151502179055503480156200006f57600080fd5b50604051620050513803806200505183398181016040528101906200009591906200033a565b6040518060400160405280600981526020017f537472786e6765727300000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f53584e520000000000000000000000000000000000000000000000000000000081525081600090805190602001906200011992919062000273565b5080600190805190602001906200013292919062000273565b5050506200015562000149620001a560201b60201c565b620001ad60201b60201c565b600160078190555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000424565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200028190620003a0565b90600052602060002090601f016020900481019282620002a55760008555620002f1565b82601f10620002c057805160ff1916838001178555620002f1565b82800160010185558215620002f1579182015b82811115620002f0578251825591602001919060010190620002d3565b5b50905062000300919062000304565b5090565b5b808211156200031f57600081600090555060010162000305565b5090565b60008151905062000334816200040a565b92915050565b60006020828403121562000353576200035262000405565b5b6000620003638482850162000323565b91505092915050565b6000620003798262000380565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620003b957607f821691505b60208210811415620003d057620003cf620003d6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b62000415816200036c565b81146200042157600080fd5b50565b614c1d80620004346000396000f3fe6080604052600436106102885760003560e01c806370a082311161015a578063aa3a8b01116100c1578063d8fa02d01161007a578063d8fa02d014610985578063e355e2aa146109b0578063e43082f7146109db578063e985e9c514610a04578063f2fde38b14610a41578063f419117114610a6a57610288565b8063aa3a8b0114610875578063ae0f830c146108a0578063b88d4fde146108cb578063c87b56dd146108f4578063c9f3829114610931578063cf1365111461095c57610288565b80638da5cb5b116101135780638da5cb5b14610772578063950820ee1461079d57806395d89b41146107da578063a0712d6814610805578063a22cb46514610821578063a8c6a8851461084a57610288565b806370a082311461066057806370e119a41461069d578063714c5398146106da578063715018a6146107055780637a5b85c11461071c57806383c4c00d1461074757610288565b806328cad13d116101fe5780634ded0942116101b75780634ded09421461056657806355f804b3146105915780635b70ea9f146105ba57806361cf301c146105d15780636352211e146105fa5780636c3a9b4a1461063757610288565b806328cad13d146104805780633075244f146104a95780633ccfd60b146104d45780633e29d7fd146104eb57806342842e0e1461051457806349df728c1461053d57610288565b80630e4f888c116102505780630e4f888c1461038457806310969523146103ad57806318160ddd146103d65780631e84c4131461040157806322c7d2351461042c57806323b872dd1461045757610288565b806301ffc9a71461028d57806303f80f46146102ca57806306fdde03146102f3578063081812fc1461031e578063095ea7b31461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906135e1565b610a95565b6040516102c19190613d28565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190613377565b610b77565b005b3480156102ff57600080fd5b50610308610bc3565b6040516103159190613d43565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190613727565b610c55565b6040516103529190613c98565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d91906134fa565b610c9b565b005b34801561039057600080fd5b506103ab60048036038101906103a691906134fa565b610db3565b005b3480156103b957600080fd5b506103d460048036038101906103cf9190613695565b610f0b565b005b3480156103e257600080fd5b506103eb610f2d565b6040516103f89190614065565b60405180910390f35b34801561040d57600080fd5b50610416610f3e565b6040516104239190613d28565b60405180910390f35b34801561043857600080fd5b50610441610f51565b60405161044e9190614065565b60405180910390f35b34801561046357600080fd5b5061047e600480360381019061047991906133e4565b610f57565b005b34801561048c57600080fd5b506104a760048036038101906104a29190613587565b610fb7565b005b3480156104b557600080fd5b506104be610fdc565b6040516104cb9190613d43565b60405180910390f35b3480156104e057600080fd5b506104e961106a565b005b3480156104f757600080fd5b50610512600480360381019061050d9190613587565b6110c1565b005b34801561052057600080fd5b5061053b600480360381019061053691906133e4565b6110e6565b005b34801561054957600080fd5b50610564600480360381019061055f919061363b565b611106565b005b34801561057257600080fd5b5061057b61122d565b6040516105889190614065565b60405180910390f35b34801561059d57600080fd5b506105b860048036038101906105b39190613695565b611233565b005b3480156105c657600080fd5b506105cf611255565b005b3480156105dd57600080fd5b506105f860048036038101906105f39190613587565b6114d2565b005b34801561060657600080fd5b50610621600480360381019061061c9190613727565b6114f7565b60405161062e9190613c98565b60405180910390f35b34801561064357600080fd5b5061065e60048036038101906106599190613727565b6115a9565b005b34801561066c57600080fd5b5061068760048036038101906106829190613377565b611700565b6040516106949190614065565b60405180910390f35b3480156106a957600080fd5b506106c460048036038101906106bf9190613377565b6117b8565b6040516106d19190614065565b60405180910390f35b3480156106e657600080fd5b506106ef6117d0565b6040516106fc9190613d43565b60405180910390f35b34801561071157600080fd5b5061071a611862565b005b34801561072857600080fd5b50610731611876565b60405161073e9190613d28565b60405180910390f35b34801561075357600080fd5b5061075c611889565b6040516107699190614065565b60405180910390f35b34801561077e57600080fd5b5061078761189a565b6040516107949190613c98565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf9190613377565b6118c4565b6040516107d19190613d28565b60405180910390f35b3480156107e657600080fd5b506107ef6118e4565b6040516107fc9190613d43565b60405180910390f35b61081f600480360381019061081a9190613727565b611976565b005b34801561082d57600080fd5b50610848600480360381019061084391906134ba565b611cd9565b005b34801561085657600080fd5b5061085f611cef565b60405161086c9190614065565b60405180910390f35b34801561088157600080fd5b5061088a611cf5565b6040516108979190613c98565b60405180910390f35b3480156108ac57600080fd5b506108b5611d1b565b6040516108c29190614065565b60405180910390f35b3480156108d757600080fd5b506108f260048036038101906108ed9190613437565b611d21565b005b34801561090057600080fd5b5061091b60048036038101906109169190613727565b611d83565b6040516109289190613d43565b60405180910390f35b34801561093d57600080fd5b50610946611ec9565b6040516109539190613d28565b60405180910390f35b34801561096857600080fd5b50610983600480360381019061097e919061353a565b611edc565b005b34801561099157600080fd5b5061099a612067565b6040516109a79190614065565b60405180910390f35b3480156109bc57600080fd5b506109c561206d565b6040516109d29190614065565b60405180910390f35b3480156109e757600080fd5b50610a0260048036038101906109fd9190613587565b612073565b005b348015610a1057600080fd5b50610a2b6004803603810190610a2691906133a4565b612098565b604051610a389190613d28565b60405180910390f35b348015610a4d57600080fd5b50610a686004803603810190610a639190613377565b6121b2565b005b348015610a7657600080fd5b50610a7f612236565b604051610a8c9190614065565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b705750610b6f8261223b565b5b9050919050565b610b7f6122a5565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008054610bd29061434e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfe9061434e565b8015610c4b5780601f10610c2057610100808354040283529160200191610c4b565b820191906000526020600020905b815481529060010190602001808311610c2e57829003601f168201915b5050505050905090565b6000610c6082612323565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ca6826114f7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e90613fc5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d3661236e565b73ffffffffffffffffffffffffffffffffffffffff161480610d655750610d6481610d5f61236e565b612098565b5b610da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b90613f45565b60405180910390fd5b610dae8383612376565b505050565b60026007541415610df9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df090614025565b60405180910390fd5b6002600781905550610e096122a5565b8061019081600e54610e1b919061415f565b1115610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5390613d85565b60405180910390fd5b611a0a81610e6a600861242f565b610e74919061415f565b1115610eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eac90613d85565b60405180910390fd5b81600e6000828254610ec7919061415f565b9250508190555060005b82811015610efd57610eea84610ee561243d565b612458565b8080610ef5906143b1565b915050610ed1565b505060016007819055505050565b610f136122a5565b8060099080519060200190610f29929190613071565b5050565b6000610f39600861242f565b905090565b600b60159054906101000a900460ff1681565b600e5481565b610f68610f6261236e565b82612476565b610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e90614005565b60405180910390fd5b610fb283838361250b565b505050565b610fbf6122a5565b80600b60156101000a81548160ff02191690831515021790555050565b60098054610fe99061434e565b80601f01602080910402602001604051908101604052809291908181526020018280546110159061434e565b80156110625780601f1061103757610100808354040283529160200191611062565b820191906000526020600020905b81548152906001019060200180831161104557829003601f168201915b505050505081565b6110726122a5565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156110bd573d6000803e3d6000fd5b5050565b6110c96122a5565b80600b60176101000a81548160ff02191690831515021790555050565b61110183838360405180602001604052806000815250611d21565b505050565b61110e6122a5565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111499190613c98565b60206040518083038186803b15801561116157600080fd5b505afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111999190613754565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016111d6929190613cff565b602060405180830381600087803b1580156111f057600080fd5b505af1158015611204573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122891906135b4565b505050565b6101b181565b61123b6122a5565b80600a9080519060200190611251929190613071565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90613d65565b60405180910390fd5b600b60169054906101000a900460ff16611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990613ec5565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139890613e25565b60405180910390fd5b6101b181600f546113b2919061415f565b11156113f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ea90613e45565b60405180910390fd5b611a0a81611401600861242f565b61140b919061415f565b111561144c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144390613f25565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60008282546114b7919061415f565b925050819055506114cf336114ca61243d565b612458565b50565b6114da6122a5565b80600b60166101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159790613fa5565b60405180910390fd5b80915050919050565b600260075414156115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e690614025565b60405180910390fd5b60026007819055506115ff6122a5565b8061019081600e54611611919061415f565b1115611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164990613d85565b60405180910390fd5b611a0a81611660600861242f565b61166a919061415f565b11156116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a290613d85565b60405180910390fd5b81600e60008282546116bd919061415f565b9250508190555060005b828110156116f3576116e0336116db61243d565b612458565b80806116eb906143b1565b9150506116c7565b5050600160078190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176890613ee5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60116020528060005260406000206000915090505481565b6060600a80546117df9061434e565b80601f016020809104026020016040519081016040528092919081815260200182805461180b9061434e565b80156118585780601f1061182d57610100808354040283529160200191611858565b820191906000526020600020905b81548152906001019060200180831161183b57829003601f168201915b5050505050905090565b61186a6122a5565b6118746000612772565b565b600b60169054906101000a900460ff1681565b6000611895600861242f565b905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60106020528060005260406000206000915054906101000a900460ff1681565b6060600180546118f39061434e565b80601f016020809104026020016040519081016040528092919081815260200182805461191f9061434e565b801561196c5780601f106119415761010080835404028352916020019161196c565b820191906000526020600020905b81548152906001019060200180831161194f57829003601f168201915b5050505050905090565b600260075414156119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b390614025565b60405180910390fd5b60026007819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2990613d65565b60405180910390fd5b806000662386f26fc1000090506109c482600d54611a50919061415f565b1115611a615766470de4df82000090505b348282611a6e91906141e6565b14611aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa590613fe5565b60405180910390fd5b600b60159054906101000a900460ff16611afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af490614045565b60405180910390fd5b82611a0a81611b0c600861242f565b611b16919061415f565b1115611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e90613f25565b60405180910390fd5b836000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060058282611baa919061415f565b1115611beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be290613ea5565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508681611c3b919061415f565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b87811015611cc7576001600d6000828254611c9c919061415f565b92505081905550611cb433611caf61243d565b612458565b8080611cbf906143b1565b915050611c81565b50505050505050600160078190555050565b611ceb611ce461236e565b8383612838565b5050565b61019081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a0a81565b611d32611d2c61236e565b83612476565b611d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6890614005565b60405180910390fd5b611d7d848484846129a5565b50505050565b6060611d8e82612a01565b611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490613f05565b60405180910390fd5b600b60179054906101000a900460ff16611e1157600a611dec83612a6d565b604051602001611dfd929190613c5e565b604051602081830303815290604052611ec2565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b8152600401611e6c9190614065565b60006040518083038186803b158015611e8457600080fd5b505afa158015611e98573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ec191906136de565b5b9050919050565b600b60179054906101000a900460ff1681565b60026007541415611f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1990614025565b60405180910390fd5b6002600781905550611f326122a5565b8181905061019081600e54611f47919061415f565b1115611f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7f90613d85565b60405180910390fd5b611a0a81611f96600861242f565b611fa0919061415f565b1115611fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd890613d85565b60405180910390fd5b600083839050905080600e6000828254611ffb919061415f565b9250508190555060005b8181101561205857612045858583818110612023576120226144b8565b5b90506020020160208101906120389190613377565b61204061243d565b612458565b8080612050906143b1565b915050612005565b50505060016007819055505050565b600d5481565b600f5481565b61207b6122a5565b80600b60146101000a81548160ff02191690831515021790555050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600b60149054906101000a900460ff16801561218f57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016121279190613c98565b60206040518083038186803b15801561213f57600080fd5b505afa158015612153573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121779190613668565b73ffffffffffffffffffffffffffffffffffffffff16145b1561219e5760019150506121ac565b6121a88484612bce565b9150505b92915050565b6121ba6122a5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561222a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222190613dc5565b60405180910390fd5b61223381612772565b50565b600581565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122ad61236e565b73ffffffffffffffffffffffffffffffffffffffff166122cb61189a565b73ffffffffffffffffffffffffffffffffffffffff1614612321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231890613f85565b60405180910390fd5b565b61232c81612a01565b61236b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236290613fa5565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123e9836114f7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006124496008612c62565b612453600861242f565b905090565b612472828260405180602001604052806000815250612c78565b5050565b600080612482836114f7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806124c457506124c38185612098565b5b8061250257508373ffffffffffffffffffffffffffffffffffffffff166124ea84610c55565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661252b826114f7565b73ffffffffffffffffffffffffffffffffffffffff1614612581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257890613de5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e890613e65565b60405180910390fd5b6125fc838383612cd3565b612607600082612376565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126579190614240565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126ae919061415f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461276d838383612cd8565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289e90613e85565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129989190613d28565b60405180910390a3505050565b6129b084848461250b565b6129bc84848484612cdd565b6129fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f290613da5565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606000821415612ab5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bc9565b600082905060005b60008214612ae7578080612ad0906143b1565b915050600a82612ae091906141b5565b9150612abd565b60008167ffffffffffffffff811115612b0357612b026144e7565b5b6040519080825280601f01601f191660200182016040528015612b355781602001600182028036833780820191505090505b5090505b60008514612bc257600182612b4e9190614240565b9150600a85612b5d91906143fa565b6030612b69919061415f565b60f81b818381518110612b7f57612b7e6144b8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bbb91906141b5565b9450612b39565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6001816000016000828254019250508190555050565b612c828383612e74565b612c8f6000848484612cdd565b612cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc590613da5565b60405180910390fd5b505050565b505050565b505050565b6000612cfe8473ffffffffffffffffffffffffffffffffffffffff1661304e565b15612e67578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d2761236e565b8786866040518563ffffffff1660e01b8152600401612d499493929190613cb3565b602060405180830381600087803b158015612d6357600080fd5b505af1925050508015612d9457506040513d601f19601f82011682018060405250810190612d91919061360e565b60015b612e17573d8060008114612dc4576040519150601f19603f3d011682016040523d82523d6000602084013e612dc9565b606091505b50600081511415612e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0690613da5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e6c565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edb90613f65565b60405180910390fd5b612eed81612a01565b15612f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2490613e05565b60405180910390fd5b612f3960008383612cd3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f89919061415f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461304a60008383612cd8565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461307d9061434e565b90600052602060002090601f01602090048101928261309f57600085556130e6565b82601f106130b857805160ff19168380011785556130e6565b828001600101855582156130e6579182015b828111156130e55782518255916020019190600101906130ca565b5b5090506130f391906130f7565b5090565b5b808211156131105760008160009055506001016130f8565b5090565b6000613127613122846140a5565b614080565b90508281526020810184848401111561314357613142614525565b5b61314e84828561430c565b509392505050565b6000613169613164846140d6565b614080565b90508281526020810184848401111561318557613184614525565b5b61319084828561430c565b509392505050565b60006131ab6131a6846140d6565b614080565b9050828152602081018484840111156131c7576131c6614525565b5b6131d284828561431b565b509392505050565b6000813590506131e981614b5d565b92915050565b60008083601f8401126132055761320461451b565b5b8235905067ffffffffffffffff81111561322257613221614516565b5b60208301915083602082028301111561323e5761323d614520565b5b9250929050565b60008135905061325481614b74565b92915050565b60008151905061326981614b74565b92915050565b60008135905061327e81614b8b565b92915050565b60008151905061329381614b8b565b92915050565b600082601f8301126132ae576132ad61451b565b5b81356132be848260208601613114565b91505092915050565b6000813590506132d681614ba2565b92915050565b6000815190506132eb81614bb9565b92915050565b600082601f8301126133065761330561451b565b5b8135613316848260208601613156565b91505092915050565b600082601f8301126133345761333361451b565b5b8151613344848260208601613198565b91505092915050565b60008135905061335c81614bd0565b92915050565b60008151905061337181614bd0565b92915050565b60006020828403121561338d5761338c61452f565b5b600061339b848285016131da565b91505092915050565b600080604083850312156133bb576133ba61452f565b5b60006133c9858286016131da565b92505060206133da858286016131da565b9150509250929050565b6000806000606084860312156133fd576133fc61452f565b5b600061340b868287016131da565b935050602061341c868287016131da565b925050604061342d8682870161334d565b9150509250925092565b600080600080608085870312156134515761345061452f565b5b600061345f878288016131da565b9450506020613470878288016131da565b93505060406134818782880161334d565b925050606085013567ffffffffffffffff8111156134a2576134a161452a565b5b6134ae87828801613299565b91505092959194509250565b600080604083850312156134d1576134d061452f565b5b60006134df858286016131da565b92505060206134f085828601613245565b9150509250929050565b600080604083850312156135115761351061452f565b5b600061351f858286016131da565b92505060206135308582860161334d565b9150509250929050565b600080602083850312156135515761355061452f565b5b600083013567ffffffffffffffff81111561356f5761356e61452a565b5b61357b858286016131ef565b92509250509250929050565b60006020828403121561359d5761359c61452f565b5b60006135ab84828501613245565b91505092915050565b6000602082840312156135ca576135c961452f565b5b60006135d88482850161325a565b91505092915050565b6000602082840312156135f7576135f661452f565b5b60006136058482850161326f565b91505092915050565b6000602082840312156136245761362361452f565b5b600061363284828501613284565b91505092915050565b6000602082840312156136515761365061452f565b5b600061365f848285016132c7565b91505092915050565b60006020828403121561367e5761367d61452f565b5b600061368c848285016132dc565b91505092915050565b6000602082840312156136ab576136aa61452f565b5b600082013567ffffffffffffffff8111156136c9576136c861452a565b5b6136d5848285016132f1565b91505092915050565b6000602082840312156136f4576136f361452f565b5b600082015167ffffffffffffffff8111156137125761371161452a565b5b61371e8482850161331f565b91505092915050565b60006020828403121561373d5761373c61452f565b5b600061374b8482850161334d565b91505092915050565b60006020828403121561376a5761376961452f565b5b600061377884828501613362565b91505092915050565b61378a81614274565b82525050565b61379981614286565b82525050565b60006137aa8261411c565b6137b48185614132565b93506137c481856020860161431b565b6137cd81614534565b840191505092915050565b60006137e382614127565b6137ed8185614143565b93506137fd81856020860161431b565b61380681614534565b840191505092915050565b600061381c82614127565b6138268185614154565b935061383681856020860161431b565b80840191505092915050565b6000815461384f8161434e565b6138598186614154565b945060018216600081146138745760018114613885576138b8565b60ff198316865281860193506138b8565b61388e85614107565b60005b838110156138b057815481890152600182019150602081019050613891565b838801955050505b50505092915050565b60006138ce601f83614143565b91506138d982614545565b602082019050919050565b60006138f1602683614143565b91506138fc8261456e565b604082019050919050565b6000613914603283614143565b915061391f826145bd565b604082019050919050565b6000613937602683614143565b91506139428261460c565b604082019050919050565b600061395a602583614143565b91506139658261465b565b604082019050919050565b600061397d601c83614143565b9150613988826146aa565b602082019050919050565b60006139a0602b83614143565b91506139ab826146d3565b604082019050919050565b60006139c3602b83614143565b91506139ce82614722565b604082019050919050565b60006139e6602483614143565b91506139f182614771565b604082019050919050565b6000613a09601983614143565b9150613a14826147c0565b602082019050919050565b6000613a2c602483614143565b9150613a37826147e9565b604082019050919050565b6000613a4f601583614143565b9150613a5a82614838565b602082019050919050565b6000613a72602983614143565b9150613a7d82614861565b604082019050919050565b6000613a95601183614143565b9150613aa0826148b0565b602082019050919050565b6000613ab8602683614143565b9150613ac3826148d9565b604082019050919050565b6000613adb603e83614143565b9150613ae682614928565b604082019050919050565b6000613afe602083614143565b9150613b0982614977565b602082019050919050565b6000613b21600583614154565b9150613b2c826149a0565b600582019050919050565b6000613b44602083614143565b9150613b4f826149c9565b602082019050919050565b6000613b67601883614143565b9150613b72826149f2565b602082019050919050565b6000613b8a602183614143565b9150613b9582614a1b565b604082019050919050565b6000613bad601883614143565b9150613bb882614a6a565b602082019050919050565b6000613bd0602e83614143565b9150613bdb82614a93565b604082019050919050565b6000613bf3601f83614143565b9150613bfe82614ae2565b602082019050919050565b6000613c16601783614143565b9150613c2182614b0b565b602082019050919050565b6000613c39600183614154565b9150613c4482614b34565b600182019050919050565b613c5881614302565b82525050565b6000613c6a8285613842565b9150613c7582613c2c565b9150613c818284613811565b9150613c8c82613b14565b91508190509392505050565b6000602082019050613cad6000830184613781565b92915050565b6000608082019050613cc86000830187613781565b613cd56020830186613781565b613ce26040830185613c4f565b8181036060830152613cf4818461379f565b905095945050505050565b6000604082019050613d146000830185613781565b613d216020830184613c4f565b9392505050565b6000602082019050613d3d6000830184613790565b92915050565b60006020820190508181036000830152613d5d81846137d8565b905092915050565b60006020820190508181036000830152613d7e816138c1565b9050919050565b60006020820190508181036000830152613d9e816138e4565b9050919050565b60006020820190508181036000830152613dbe81613907565b9050919050565b60006020820190508181036000830152613dde8161392a565b9050919050565b60006020820190508181036000830152613dfe8161394d565b9050919050565b60006020820190508181036000830152613e1e81613970565b9050919050565b60006020820190508181036000830152613e3e81613993565b9050919050565b60006020820190508181036000830152613e5e816139b6565b9050919050565b60006020820190508181036000830152613e7e816139d9565b9050919050565b60006020820190508181036000830152613e9e816139fc565b9050919050565b60006020820190508181036000830152613ebe81613a1f565b9050919050565b60006020820190508181036000830152613ede81613a42565b9050919050565b60006020820190508181036000830152613efe81613a65565b9050919050565b60006020820190508181036000830152613f1e81613a88565b9050919050565b60006020820190508181036000830152613f3e81613aab565b9050919050565b60006020820190508181036000830152613f5e81613ace565b9050919050565b60006020820190508181036000830152613f7e81613af1565b9050919050565b60006020820190508181036000830152613f9e81613b37565b9050919050565b60006020820190508181036000830152613fbe81613b5a565b9050919050565b60006020820190508181036000830152613fde81613b7d565b9050919050565b60006020820190508181036000830152613ffe81613ba0565b9050919050565b6000602082019050818103600083015261401e81613bc3565b9050919050565b6000602082019050818103600083015261403e81613be6565b9050919050565b6000602082019050818103600083015261405e81613c09565b9050919050565b600060208201905061407a6000830184613c4f565b92915050565b600061408a61409b565b90506140968282614380565b919050565b6000604051905090565b600067ffffffffffffffff8211156140c0576140bf6144e7565b5b6140c982614534565b9050602081019050919050565b600067ffffffffffffffff8211156140f1576140f06144e7565b5b6140fa82614534565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061416a82614302565b915061417583614302565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141aa576141a961442b565b5b828201905092915050565b60006141c082614302565b91506141cb83614302565b9250826141db576141da61445a565b5b828204905092915050565b60006141f182614302565b91506141fc83614302565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142355761423461442b565b5b828202905092915050565b600061424b82614302565b915061425683614302565b9250828210156142695761426861442b565b5b828203905092915050565b600061427f826142e2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006142c982614274565b9050919050565b60006142db82614274565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561433957808201518184015260208101905061431e565b83811115614348576000848401525b50505050565b6000600282049050600182168061436657607f821691505b6020821081141561437a57614379614489565b5b50919050565b61438982614534565b810181811067ffffffffffffffff821117156143a8576143a76144e7565b5b80604052505050565b60006143bc82614302565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143ef576143ee61442b565b5b600182019050919050565b600061440582614302565b915061441083614302565b9250826144205761441f61445a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163742e00600082015250565b7f4e6f7420656e6f75676820737472786e676572732072656d61696e696e67207460008201527f6f20676966740000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f537472786e67657220616c72656164792066726565206d696e7465642062792060008201527f746869732077616c6c6574000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820737472786e676572732072656d61696e696e67207460008201527f6f2066726565206d696e74000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43616e206f6e6c79206d696e74203520737472786e676572732070726520776160008201527f6c6c657400000000000000000000000000000000000000000000000000000000602082015250565b7f46726565204d696e74206973206e6f74206f70656e0000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820737472786e676572732072656d61696e696e67207460008201527f6f206d696e740000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b614b6681614274565b8114614b7157600080fd5b50565b614b7d81614286565b8114614b8857600080fd5b50565b614b9481614292565b8114614b9f57600080fd5b50565b614bab816142be565b8114614bb657600080fd5b50565b614bc2816142d0565b8114614bcd57600080fd5b50565b614bd981614302565b8114614be457600080fd5b5056fea26469706673582212205c38a4430e8a1b0bc7a1e1d2d7fdaa400c9b636e6781d6ad4ffcc87748f2cca164736f6c63430008070033000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Deployed Bytecode
0x6080604052600436106102885760003560e01c806370a082311161015a578063aa3a8b01116100c1578063d8fa02d01161007a578063d8fa02d014610985578063e355e2aa146109b0578063e43082f7146109db578063e985e9c514610a04578063f2fde38b14610a41578063f419117114610a6a57610288565b8063aa3a8b0114610875578063ae0f830c146108a0578063b88d4fde146108cb578063c87b56dd146108f4578063c9f3829114610931578063cf1365111461095c57610288565b80638da5cb5b116101135780638da5cb5b14610772578063950820ee1461079d57806395d89b41146107da578063a0712d6814610805578063a22cb46514610821578063a8c6a8851461084a57610288565b806370a082311461066057806370e119a41461069d578063714c5398146106da578063715018a6146107055780637a5b85c11461071c57806383c4c00d1461074757610288565b806328cad13d116101fe5780634ded0942116101b75780634ded09421461056657806355f804b3146105915780635b70ea9f146105ba57806361cf301c146105d15780636352211e146105fa5780636c3a9b4a1461063757610288565b806328cad13d146104805780633075244f146104a95780633ccfd60b146104d45780633e29d7fd146104eb57806342842e0e1461051457806349df728c1461053d57610288565b80630e4f888c116102505780630e4f888c1461038457806310969523146103ad57806318160ddd146103d65780631e84c4131461040157806322c7d2351461042c57806323b872dd1461045757610288565b806301ffc9a71461028d57806303f80f46146102ca57806306fdde03146102f3578063081812fc1461031e578063095ea7b31461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906135e1565b610a95565b6040516102c19190613d28565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190613377565b610b77565b005b3480156102ff57600080fd5b50610308610bc3565b6040516103159190613d43565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190613727565b610c55565b6040516103529190613c98565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d91906134fa565b610c9b565b005b34801561039057600080fd5b506103ab60048036038101906103a691906134fa565b610db3565b005b3480156103b957600080fd5b506103d460048036038101906103cf9190613695565b610f0b565b005b3480156103e257600080fd5b506103eb610f2d565b6040516103f89190614065565b60405180910390f35b34801561040d57600080fd5b50610416610f3e565b6040516104239190613d28565b60405180910390f35b34801561043857600080fd5b50610441610f51565b60405161044e9190614065565b60405180910390f35b34801561046357600080fd5b5061047e600480360381019061047991906133e4565b610f57565b005b34801561048c57600080fd5b506104a760048036038101906104a29190613587565b610fb7565b005b3480156104b557600080fd5b506104be610fdc565b6040516104cb9190613d43565b60405180910390f35b3480156104e057600080fd5b506104e961106a565b005b3480156104f757600080fd5b50610512600480360381019061050d9190613587565b6110c1565b005b34801561052057600080fd5b5061053b600480360381019061053691906133e4565b6110e6565b005b34801561054957600080fd5b50610564600480360381019061055f919061363b565b611106565b005b34801561057257600080fd5b5061057b61122d565b6040516105889190614065565b60405180910390f35b34801561059d57600080fd5b506105b860048036038101906105b39190613695565b611233565b005b3480156105c657600080fd5b506105cf611255565b005b3480156105dd57600080fd5b506105f860048036038101906105f39190613587565b6114d2565b005b34801561060657600080fd5b50610621600480360381019061061c9190613727565b6114f7565b60405161062e9190613c98565b60405180910390f35b34801561064357600080fd5b5061065e60048036038101906106599190613727565b6115a9565b005b34801561066c57600080fd5b5061068760048036038101906106829190613377565b611700565b6040516106949190614065565b60405180910390f35b3480156106a957600080fd5b506106c460048036038101906106bf9190613377565b6117b8565b6040516106d19190614065565b60405180910390f35b3480156106e657600080fd5b506106ef6117d0565b6040516106fc9190613d43565b60405180910390f35b34801561071157600080fd5b5061071a611862565b005b34801561072857600080fd5b50610731611876565b60405161073e9190613d28565b60405180910390f35b34801561075357600080fd5b5061075c611889565b6040516107699190614065565b60405180910390f35b34801561077e57600080fd5b5061078761189a565b6040516107949190613c98565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf9190613377565b6118c4565b6040516107d19190613d28565b60405180910390f35b3480156107e657600080fd5b506107ef6118e4565b6040516107fc9190613d43565b60405180910390f35b61081f600480360381019061081a9190613727565b611976565b005b34801561082d57600080fd5b50610848600480360381019061084391906134ba565b611cd9565b005b34801561085657600080fd5b5061085f611cef565b60405161086c9190614065565b60405180910390f35b34801561088157600080fd5b5061088a611cf5565b6040516108979190613c98565b60405180910390f35b3480156108ac57600080fd5b506108b5611d1b565b6040516108c29190614065565b60405180910390f35b3480156108d757600080fd5b506108f260048036038101906108ed9190613437565b611d21565b005b34801561090057600080fd5b5061091b60048036038101906109169190613727565b611d83565b6040516109289190613d43565b60405180910390f35b34801561093d57600080fd5b50610946611ec9565b6040516109539190613d28565b60405180910390f35b34801561096857600080fd5b50610983600480360381019061097e919061353a565b611edc565b005b34801561099157600080fd5b5061099a612067565b6040516109a79190614065565b60405180910390f35b3480156109bc57600080fd5b506109c561206d565b6040516109d29190614065565b60405180910390f35b3480156109e757600080fd5b50610a0260048036038101906109fd9190613587565b612073565b005b348015610a1057600080fd5b50610a2b6004803603810190610a2691906133a4565b612098565b604051610a389190613d28565b60405180910390f35b348015610a4d57600080fd5b50610a686004803603810190610a639190613377565b6121b2565b005b348015610a7657600080fd5b50610a7f612236565b604051610a8c9190614065565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b705750610b6f8261223b565b5b9050919050565b610b7f6122a5565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008054610bd29061434e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfe9061434e565b8015610c4b5780601f10610c2057610100808354040283529160200191610c4b565b820191906000526020600020905b815481529060010190602001808311610c2e57829003601f168201915b5050505050905090565b6000610c6082612323565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ca6826114f7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e90613fc5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d3661236e565b73ffffffffffffffffffffffffffffffffffffffff161480610d655750610d6481610d5f61236e565b612098565b5b610da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b90613f45565b60405180910390fd5b610dae8383612376565b505050565b60026007541415610df9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df090614025565b60405180910390fd5b6002600781905550610e096122a5565b8061019081600e54610e1b919061415f565b1115610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5390613d85565b60405180910390fd5b611a0a81610e6a600861242f565b610e74919061415f565b1115610eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eac90613d85565b60405180910390fd5b81600e6000828254610ec7919061415f565b9250508190555060005b82811015610efd57610eea84610ee561243d565b612458565b8080610ef5906143b1565b915050610ed1565b505060016007819055505050565b610f136122a5565b8060099080519060200190610f29929190613071565b5050565b6000610f39600861242f565b905090565b600b60159054906101000a900460ff1681565b600e5481565b610f68610f6261236e565b82612476565b610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e90614005565b60405180910390fd5b610fb283838361250b565b505050565b610fbf6122a5565b80600b60156101000a81548160ff02191690831515021790555050565b60098054610fe99061434e565b80601f01602080910402602001604051908101604052809291908181526020018280546110159061434e565b80156110625780601f1061103757610100808354040283529160200191611062565b820191906000526020600020905b81548152906001019060200180831161104557829003601f168201915b505050505081565b6110726122a5565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156110bd573d6000803e3d6000fd5b5050565b6110c96122a5565b80600b60176101000a81548160ff02191690831515021790555050565b61110183838360405180602001604052806000815250611d21565b505050565b61110e6122a5565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111499190613c98565b60206040518083038186803b15801561116157600080fd5b505afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111999190613754565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016111d6929190613cff565b602060405180830381600087803b1580156111f057600080fd5b505af1158015611204573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122891906135b4565b505050565b6101b181565b61123b6122a5565b80600a9080519060200190611251929190613071565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90613d65565b60405180910390fd5b600b60169054906101000a900460ff16611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990613ec5565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139890613e25565b60405180910390fd5b6101b181600f546113b2919061415f565b11156113f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ea90613e45565b60405180910390fd5b611a0a81611401600861242f565b61140b919061415f565b111561144c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144390613f25565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60008282546114b7919061415f565b925050819055506114cf336114ca61243d565b612458565b50565b6114da6122a5565b80600b60166101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159790613fa5565b60405180910390fd5b80915050919050565b600260075414156115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e690614025565b60405180910390fd5b60026007819055506115ff6122a5565b8061019081600e54611611919061415f565b1115611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164990613d85565b60405180910390fd5b611a0a81611660600861242f565b61166a919061415f565b11156116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a290613d85565b60405180910390fd5b81600e60008282546116bd919061415f565b9250508190555060005b828110156116f3576116e0336116db61243d565b612458565b80806116eb906143b1565b9150506116c7565b5050600160078190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176890613ee5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60116020528060005260406000206000915090505481565b6060600a80546117df9061434e565b80601f016020809104026020016040519081016040528092919081815260200182805461180b9061434e565b80156118585780601f1061182d57610100808354040283529160200191611858565b820191906000526020600020905b81548152906001019060200180831161183b57829003601f168201915b5050505050905090565b61186a6122a5565b6118746000612772565b565b600b60169054906101000a900460ff1681565b6000611895600861242f565b905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60106020528060005260406000206000915054906101000a900460ff1681565b6060600180546118f39061434e565b80601f016020809104026020016040519081016040528092919081815260200182805461191f9061434e565b801561196c5780601f106119415761010080835404028352916020019161196c565b820191906000526020600020905b81548152906001019060200180831161194f57829003601f168201915b5050505050905090565b600260075414156119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b390614025565b60405180910390fd5b60026007819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2990613d65565b60405180910390fd5b806000662386f26fc1000090506109c482600d54611a50919061415f565b1115611a615766470de4df82000090505b348282611a6e91906141e6565b14611aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa590613fe5565b60405180910390fd5b600b60159054906101000a900460ff16611afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af490614045565b60405180910390fd5b82611a0a81611b0c600861242f565b611b16919061415f565b1115611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e90613f25565b60405180910390fd5b836000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060058282611baa919061415f565b1115611beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be290613ea5565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508681611c3b919061415f565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b87811015611cc7576001600d6000828254611c9c919061415f565b92505081905550611cb433611caf61243d565b612458565b8080611cbf906143b1565b915050611c81565b50505050505050600160078190555050565b611ceb611ce461236e565b8383612838565b5050565b61019081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a0a81565b611d32611d2c61236e565b83612476565b611d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6890614005565b60405180910390fd5b611d7d848484846129a5565b50505050565b6060611d8e82612a01565b611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490613f05565b60405180910390fd5b600b60179054906101000a900460ff16611e1157600a611dec83612a6d565b604051602001611dfd929190613c5e565b604051602081830303815290604052611ec2565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b8152600401611e6c9190614065565b60006040518083038186803b158015611e8457600080fd5b505afa158015611e98573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ec191906136de565b5b9050919050565b600b60179054906101000a900460ff1681565b60026007541415611f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1990614025565b60405180910390fd5b6002600781905550611f326122a5565b8181905061019081600e54611f47919061415f565b1115611f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7f90613d85565b60405180910390fd5b611a0a81611f96600861242f565b611fa0919061415f565b1115611fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd890613d85565b60405180910390fd5b600083839050905080600e6000828254611ffb919061415f565b9250508190555060005b8181101561205857612045858583818110612023576120226144b8565b5b90506020020160208101906120389190613377565b61204061243d565b612458565b8080612050906143b1565b915050612005565b50505060016007819055505050565b600d5481565b600f5481565b61207b6122a5565b80600b60146101000a81548160ff02191690831515021790555050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600b60149054906101000a900460ff16801561218f57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016121279190613c98565b60206040518083038186803b15801561213f57600080fd5b505afa158015612153573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121779190613668565b73ffffffffffffffffffffffffffffffffffffffff16145b1561219e5760019150506121ac565b6121a88484612bce565b9150505b92915050565b6121ba6122a5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561222a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222190613dc5565b60405180910390fd5b61223381612772565b50565b600581565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122ad61236e565b73ffffffffffffffffffffffffffffffffffffffff166122cb61189a565b73ffffffffffffffffffffffffffffffffffffffff1614612321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231890613f85565b60405180910390fd5b565b61232c81612a01565b61236b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236290613fa5565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123e9836114f7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006124496008612c62565b612453600861242f565b905090565b612472828260405180602001604052806000815250612c78565b5050565b600080612482836114f7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806124c457506124c38185612098565b5b8061250257508373ffffffffffffffffffffffffffffffffffffffff166124ea84610c55565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661252b826114f7565b73ffffffffffffffffffffffffffffffffffffffff1614612581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257890613de5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e890613e65565b60405180910390fd5b6125fc838383612cd3565b612607600082612376565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126579190614240565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126ae919061415f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461276d838383612cd8565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289e90613e85565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129989190613d28565b60405180910390a3505050565b6129b084848461250b565b6129bc84848484612cdd565b6129fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f290613da5565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606000821415612ab5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bc9565b600082905060005b60008214612ae7578080612ad0906143b1565b915050600a82612ae091906141b5565b9150612abd565b60008167ffffffffffffffff811115612b0357612b026144e7565b5b6040519080825280601f01601f191660200182016040528015612b355781602001600182028036833780820191505090505b5090505b60008514612bc257600182612b4e9190614240565b9150600a85612b5d91906143fa565b6030612b69919061415f565b60f81b818381518110612b7f57612b7e6144b8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bbb91906141b5565b9450612b39565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6001816000016000828254019250508190555050565b612c828383612e74565b612c8f6000848484612cdd565b612cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc590613da5565b60405180910390fd5b505050565b505050565b505050565b6000612cfe8473ffffffffffffffffffffffffffffffffffffffff1661304e565b15612e67578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d2761236e565b8786866040518563ffffffff1660e01b8152600401612d499493929190613cb3565b602060405180830381600087803b158015612d6357600080fd5b505af1925050508015612d9457506040513d601f19601f82011682018060405250810190612d91919061360e565b60015b612e17573d8060008114612dc4576040519150601f19603f3d011682016040523d82523d6000602084013e612dc9565b606091505b50600081511415612e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0690613da5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e6c565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edb90613f65565b60405180910390fd5b612eed81612a01565b15612f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2490613e05565b60405180910390fd5b612f3960008383612cd3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f89919061415f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461304a60008383612cd8565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461307d9061434e565b90600052602060002090601f01602090048101928261309f57600085556130e6565b82601f106130b857805160ff19168380011785556130e6565b828001600101855582156130e6579182015b828111156130e55782518255916020019190600101906130ca565b5b5090506130f391906130f7565b5090565b5b808211156131105760008160009055506001016130f8565b5090565b6000613127613122846140a5565b614080565b90508281526020810184848401111561314357613142614525565b5b61314e84828561430c565b509392505050565b6000613169613164846140d6565b614080565b90508281526020810184848401111561318557613184614525565b5b61319084828561430c565b509392505050565b60006131ab6131a6846140d6565b614080565b9050828152602081018484840111156131c7576131c6614525565b5b6131d284828561431b565b509392505050565b6000813590506131e981614b5d565b92915050565b60008083601f8401126132055761320461451b565b5b8235905067ffffffffffffffff81111561322257613221614516565b5b60208301915083602082028301111561323e5761323d614520565b5b9250929050565b60008135905061325481614b74565b92915050565b60008151905061326981614b74565b92915050565b60008135905061327e81614b8b565b92915050565b60008151905061329381614b8b565b92915050565b600082601f8301126132ae576132ad61451b565b5b81356132be848260208601613114565b91505092915050565b6000813590506132d681614ba2565b92915050565b6000815190506132eb81614bb9565b92915050565b600082601f8301126133065761330561451b565b5b8135613316848260208601613156565b91505092915050565b600082601f8301126133345761333361451b565b5b8151613344848260208601613198565b91505092915050565b60008135905061335c81614bd0565b92915050565b60008151905061337181614bd0565b92915050565b60006020828403121561338d5761338c61452f565b5b600061339b848285016131da565b91505092915050565b600080604083850312156133bb576133ba61452f565b5b60006133c9858286016131da565b92505060206133da858286016131da565b9150509250929050565b6000806000606084860312156133fd576133fc61452f565b5b600061340b868287016131da565b935050602061341c868287016131da565b925050604061342d8682870161334d565b9150509250925092565b600080600080608085870312156134515761345061452f565b5b600061345f878288016131da565b9450506020613470878288016131da565b93505060406134818782880161334d565b925050606085013567ffffffffffffffff8111156134a2576134a161452a565b5b6134ae87828801613299565b91505092959194509250565b600080604083850312156134d1576134d061452f565b5b60006134df858286016131da565b92505060206134f085828601613245565b9150509250929050565b600080604083850312156135115761351061452f565b5b600061351f858286016131da565b92505060206135308582860161334d565b9150509250929050565b600080602083850312156135515761355061452f565b5b600083013567ffffffffffffffff81111561356f5761356e61452a565b5b61357b858286016131ef565b92509250509250929050565b60006020828403121561359d5761359c61452f565b5b60006135ab84828501613245565b91505092915050565b6000602082840312156135ca576135c961452f565b5b60006135d88482850161325a565b91505092915050565b6000602082840312156135f7576135f661452f565b5b60006136058482850161326f565b91505092915050565b6000602082840312156136245761362361452f565b5b600061363284828501613284565b91505092915050565b6000602082840312156136515761365061452f565b5b600061365f848285016132c7565b91505092915050565b60006020828403121561367e5761367d61452f565b5b600061368c848285016132dc565b91505092915050565b6000602082840312156136ab576136aa61452f565b5b600082013567ffffffffffffffff8111156136c9576136c861452a565b5b6136d5848285016132f1565b91505092915050565b6000602082840312156136f4576136f361452f565b5b600082015167ffffffffffffffff8111156137125761371161452a565b5b61371e8482850161331f565b91505092915050565b60006020828403121561373d5761373c61452f565b5b600061374b8482850161334d565b91505092915050565b60006020828403121561376a5761376961452f565b5b600061377884828501613362565b91505092915050565b61378a81614274565b82525050565b61379981614286565b82525050565b60006137aa8261411c565b6137b48185614132565b93506137c481856020860161431b565b6137cd81614534565b840191505092915050565b60006137e382614127565b6137ed8185614143565b93506137fd81856020860161431b565b61380681614534565b840191505092915050565b600061381c82614127565b6138268185614154565b935061383681856020860161431b565b80840191505092915050565b6000815461384f8161434e565b6138598186614154565b945060018216600081146138745760018114613885576138b8565b60ff198316865281860193506138b8565b61388e85614107565b60005b838110156138b057815481890152600182019150602081019050613891565b838801955050505b50505092915050565b60006138ce601f83614143565b91506138d982614545565b602082019050919050565b60006138f1602683614143565b91506138fc8261456e565b604082019050919050565b6000613914603283614143565b915061391f826145bd565b604082019050919050565b6000613937602683614143565b91506139428261460c565b604082019050919050565b600061395a602583614143565b91506139658261465b565b604082019050919050565b600061397d601c83614143565b9150613988826146aa565b602082019050919050565b60006139a0602b83614143565b91506139ab826146d3565b604082019050919050565b60006139c3602b83614143565b91506139ce82614722565b604082019050919050565b60006139e6602483614143565b91506139f182614771565b604082019050919050565b6000613a09601983614143565b9150613a14826147c0565b602082019050919050565b6000613a2c602483614143565b9150613a37826147e9565b604082019050919050565b6000613a4f601583614143565b9150613a5a82614838565b602082019050919050565b6000613a72602983614143565b9150613a7d82614861565b604082019050919050565b6000613a95601183614143565b9150613aa0826148b0565b602082019050919050565b6000613ab8602683614143565b9150613ac3826148d9565b604082019050919050565b6000613adb603e83614143565b9150613ae682614928565b604082019050919050565b6000613afe602083614143565b9150613b0982614977565b602082019050919050565b6000613b21600583614154565b9150613b2c826149a0565b600582019050919050565b6000613b44602083614143565b9150613b4f826149c9565b602082019050919050565b6000613b67601883614143565b9150613b72826149f2565b602082019050919050565b6000613b8a602183614143565b9150613b9582614a1b565b604082019050919050565b6000613bad601883614143565b9150613bb882614a6a565b602082019050919050565b6000613bd0602e83614143565b9150613bdb82614a93565b604082019050919050565b6000613bf3601f83614143565b9150613bfe82614ae2565b602082019050919050565b6000613c16601783614143565b9150613c2182614b0b565b602082019050919050565b6000613c39600183614154565b9150613c4482614b34565b600182019050919050565b613c5881614302565b82525050565b6000613c6a8285613842565b9150613c7582613c2c565b9150613c818284613811565b9150613c8c82613b14565b91508190509392505050565b6000602082019050613cad6000830184613781565b92915050565b6000608082019050613cc86000830187613781565b613cd56020830186613781565b613ce26040830185613c4f565b8181036060830152613cf4818461379f565b905095945050505050565b6000604082019050613d146000830185613781565b613d216020830184613c4f565b9392505050565b6000602082019050613d3d6000830184613790565b92915050565b60006020820190508181036000830152613d5d81846137d8565b905092915050565b60006020820190508181036000830152613d7e816138c1565b9050919050565b60006020820190508181036000830152613d9e816138e4565b9050919050565b60006020820190508181036000830152613dbe81613907565b9050919050565b60006020820190508181036000830152613dde8161392a565b9050919050565b60006020820190508181036000830152613dfe8161394d565b9050919050565b60006020820190508181036000830152613e1e81613970565b9050919050565b60006020820190508181036000830152613e3e81613993565b9050919050565b60006020820190508181036000830152613e5e816139b6565b9050919050565b60006020820190508181036000830152613e7e816139d9565b9050919050565b60006020820190508181036000830152613e9e816139fc565b9050919050565b60006020820190508181036000830152613ebe81613a1f565b9050919050565b60006020820190508181036000830152613ede81613a42565b9050919050565b60006020820190508181036000830152613efe81613a65565b9050919050565b60006020820190508181036000830152613f1e81613a88565b9050919050565b60006020820190508181036000830152613f3e81613aab565b9050919050565b60006020820190508181036000830152613f5e81613ace565b9050919050565b60006020820190508181036000830152613f7e81613af1565b9050919050565b60006020820190508181036000830152613f9e81613b37565b9050919050565b60006020820190508181036000830152613fbe81613b5a565b9050919050565b60006020820190508181036000830152613fde81613b7d565b9050919050565b60006020820190508181036000830152613ffe81613ba0565b9050919050565b6000602082019050818103600083015261401e81613bc3565b9050919050565b6000602082019050818103600083015261403e81613be6565b9050919050565b6000602082019050818103600083015261405e81613c09565b9050919050565b600060208201905061407a6000830184613c4f565b92915050565b600061408a61409b565b90506140968282614380565b919050565b6000604051905090565b600067ffffffffffffffff8211156140c0576140bf6144e7565b5b6140c982614534565b9050602081019050919050565b600067ffffffffffffffff8211156140f1576140f06144e7565b5b6140fa82614534565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061416a82614302565b915061417583614302565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141aa576141a961442b565b5b828201905092915050565b60006141c082614302565b91506141cb83614302565b9250826141db576141da61445a565b5b828204905092915050565b60006141f182614302565b91506141fc83614302565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142355761423461442b565b5b828202905092915050565b600061424b82614302565b915061425683614302565b9250828210156142695761426861442b565b5b828203905092915050565b600061427f826142e2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006142c982614274565b9050919050565b60006142db82614274565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561433957808201518184015260208101905061431e565b83811115614348576000848401525b50505050565b6000600282049050600182168061436657607f821691505b6020821081141561437a57614379614489565b5b50919050565b61438982614534565b810181811067ffffffffffffffff821117156143a8576143a76144e7565b5b80604052505050565b60006143bc82614302565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143ef576143ee61442b565b5b600182019050919050565b600061440582614302565b915061441083614302565b9250826144205761441f61445a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163742e00600082015250565b7f4e6f7420656e6f75676820737472786e676572732072656d61696e696e67207460008201527f6f20676966740000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f537472786e67657220616c72656164792066726565206d696e7465642062792060008201527f746869732077616c6c6574000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820737472786e676572732072656d61696e696e67207460008201527f6f2066726565206d696e74000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43616e206f6e6c79206d696e74203520737472786e676572732070726520776160008201527f6c6c657400000000000000000000000000000000000000000000000000000000602082015250565b7f46726565204d696e74206973206e6f74206f70656e0000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820737472786e676572732072656d61696e696e67207460008201527f6f206d696e740000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b614b6681614274565b8114614b7157600080fd5b50565b614b7d81614286565b8114614b8857600080fd5b50565b614b9481614292565b8114614b9f57600080fd5b50565b614bab816142be565b8114614bb657600080fd5b50565b614bc2816142d0565b8114614bcd57600080fd5b50565b614bd981614302565b8114614be457600080fd5b5056fea26469706673582212205c38a4430e8a1b0bc7a1e1d2d7fdaa400c9b636e6781d6ad4ffcc87748f2cca164736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
-----Decoded View---------------
Arg [0] : _openSeaProxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Deployed Bytecode Sourcemap
4971:8811:16:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1570:300:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10678:124:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2470:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3935:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3467:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11290:324:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9971:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9643:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5711:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5938:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4612:327:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10388:153:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5149:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11989:140;;;;;;;;;;;;;:::i;:::-;;10808:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5005:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12135:165:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5567:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9811:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9116:253;;;;;;;;;;;;;:::i;:::-;;10547:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2190:218:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10971:313:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1929:204:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6077:49:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9436:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;5748:28:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9533:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1201:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6022:48:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2632:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8547:563:16;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4169:153:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5656:48:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5861:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5383:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5250:315:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13339:440:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5799:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11620:363;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5898:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5978:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10221:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12675:598;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2081:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5470:58:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1570:300:4;1672:4;1722:25;1707:40;;;:11;:40;;;;:104;;;;1778:33;1763:48;;;:11;:48;;;;1707:104;:156;;;;1827:36;1851:11;1827:23;:36::i;:::-;1707:156;1688:175;;1570:300;;;:::o;10678:124:16:-;1094:13:0;:11;:13::i;:::-;10779:16:16::1;10761:15;;:34;;;;;;;;;;;;;;;;;;10678:124:::0;:::o;2470:98:4:-;2524:13;2556:5;2549:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2470:98;:::o;3935:167::-;4011:7;4030:23;4045:7;4030:14;:23::i;:::-;4071:15;:24;4087:7;4071:24;;;;;;;;;;;;;;;;;;;;;4064:31;;3935:167;;;:::o;3467:407::-;3547:13;3563:23;3578:7;3563:14;:23::i;:::-;3547:39;;3610:5;3604:11;;:2;:11;;;;3596:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3701:5;3685:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3710:37;3727:5;3734:12;:10;:12::i;:::-;3710:16;:37::i;:::-;3685:62;3664:171;;;;;;;;;;;;:::i;:::-;;;;;;;;;3846:21;3855:2;3859:7;3846:8;:21::i;:::-;3537:337;3467:407;;:::o;11290:324:16:-;1744:1:2;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1094:13:0::1;:11;:13::i;:::-;11439:9:16::2;5701:3;7586:14;7565:18;;:35;;;;:::i;:::-;:57;;7544:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;5423:4;7742:14;7717:22;:12;:20;:22::i;:::-;:39;;;;:::i;:::-;:56;;7696:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;11486:9:::3;11464:18;;:31;;;;;;;:::i;:::-;;;;;;;;11511:9;11506:102;11530:9;11526:1;:13;11506:102;;;11560:37;11570:11;11583:13;:11;:13::i;:::-;11560:9;:37::i;:::-;11541:3;;;;;:::i;:::-;;;;11506:102;;;;1117:1:0::2;1701::2::0;2628:7;:22;;;;11290:324:16;;:::o;9971:130::-;1094:13:0;:11;:13::i;:::-;10079:15:16::1;10056:20;:38;;;;;;;;;;;;:::i;:::-;;9971:130:::0;:::o;9643:101::-;9689:7;9715:22;:12;:20;:22::i;:::-;9708:29;;9643:101;:::o;5711:30::-;;;;;;;;;;;;;:::o;5938:33::-;;;;:::o;4612:327:4:-;4801:41;4820:12;:10;:12::i;:::-;4834:7;4801:18;:41::i;:::-;4793:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;4904:28;4914:4;4920:2;4924:7;4904:9;:28::i;:::-;4612:327;;;:::o;10388:153:16:-;1094:13:0;:11;:13::i;:::-;10515:19:16::1;10494:18;;:40;;;;;;;;;;;;;;;;;;10388:153:::0;:::o;5149:39::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11989:140::-;1094:13:0;:11;:13::i;:::-;12036:15:16::1;12054:21;12036:39;;12093:10;12085:28;;:37;12114:7;12085:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;12026:103;11989:140::o:0;10808:157::-;1094:13:0;:11;:13::i;:::-;10938:20:16::1;10916:19;;:42;;;;;;;;;;;;;;;;;;10808:157:::0;:::o;5005:179:4:-;5138:39;5155:4;5161:2;5165:7;5138:39;;;;;;;;;;;;:16;:39::i;:::-;5005:179;;;:::o;12135:165:16:-;1094:13:0;:11;:13::i;:::-;12200:15:16::1;12218:5;:15;;;12242:4;12218:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12200:48;;12258:5;:14;;;12273:10;12285:7;12258:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12190:110;12135:165:::0;:::o;5567:56::-;5620:3;5567:56;:::o;9811:98::-;1094:13:0;:11;:13::i;:::-;9894:8:16::1;9884:7;:18;;;;;;;;;;;;:::i;:::-;;9811:98:::0;:::o;9116:253::-;8244:10;8231:23;;:9;:23;;;8223:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;6352:16:::1;;;;;;;;;;;6344:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;9226:1:::2;7027:16;:28;7044:10;7027:28;;;;;;;;;;;;;;;;;;;;;;;;;7026:29;7005:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;5620:3;7180:14;7155:22;;:39;;;;:::i;:::-;:85;;7134:175;;;;;;;;;;;;:::i;:::-;;;;;;;;;5423:4;7365:14;7340:22;:12;:20;:22::i;:::-;:39;;;;:::i;:::-;:56;;7319:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;9274:4:::3;9243:16;:28;9260:10;9243:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;9314:1;9288:22;;:27;;;;;;;:::i;:::-;;;;;;;;9326:36;9336:10;9348:13;:11;:13::i;:::-;9326:9;:36::i;:::-;6404:1:::2;9116:253::o:0;10547:125::-;1094:13:0;:11;:13::i;:::-;10648:17:16::1;10629:16;;:36;;;;;;;;;;;;;;;;;;10547:125:::0;:::o;2190:218:4:-;2262:7;2281:13;2297:7;:16;2305:7;2297:16;;;;;;;;;;;;;;;;;;;;;2281:32;;2348:1;2331:19;;:5;:19;;;;2323:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2396:5;2389:12;;;2190:218;;;:::o;10971:313:16:-;1744:1:2;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1094:13:0::1;:11;:13::i;:::-;11101:12:16::2;5701:3;7586:14;7565:18;;:35;;;;:::i;:::-;:57;;7544:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;5423:4;7742:14;7717:22;:12;:20;:22::i;:::-;:39;;;;:::i;:::-;:56;;7696:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;11151:12:::3;11129:18;;:34;;;;;;;:::i;:::-;;;;;;;;11179:9;11174:104;11198:12;11194:1;:16;11174:104;;;11231:36;11241:10;11253:13;:11;:13::i;:::-;11231:9;:36::i;:::-;11212:3;;;;;:::i;:::-;;;;11174:104;;;;1117:1:0::2;1701::2::0;2628:7;:22;;;;10971:313:16;:::o;1929:204:4:-;2001:7;2045:1;2028:19;;:5;:19;;;;2020:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2110:9;:16;2120:5;2110:16;;;;;;;;;;;;;;;;2103:23;;1929:204;;;:::o;6077:49:16:-;;;;;;;;;;;;;;;;;:::o;9436:91::-;9481:13;9513:7;9506:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9436:91;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;5748:28:16:-;;;;;;;;;;;;;:::o;9533:104::-;9582:7;9608:22;:12;:20;:22::i;:::-;9601:29;;9533:104;:::o;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;6022:48:16:-;;;;;;;;;;;;;;;;;;;;;;:::o;2632:102:4:-;2688:13;2720:7;2713:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2632:102;:::o;8547:563:16:-;1744:1:2;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;8244:10:16::1;8231:23;;:9;:23;;;8223:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;8685:14:::2;7921:13;7937:10;7921:26;;8000:4;7983:14;7962:18;;:35;;;;:::i;:::-;:42;7958:91;;;8028:10;8020:18;;7958:91;8106:9;8088:14;8080:5;:22;;;;:::i;:::-;:35;8059:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;6238:18:::3;;;;;;;;;;;6230:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;8751:14:::4;5423:4;6822:14;6797:22;:12;:20;:22::i;:::-;:39;;;;:::i;:::-;:56;;6776:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;8797:14:::5;6483:22;6508:14;:26;6523:10;6508:26;;;;;;;;;;;;;;;;6483:51;;5527:1;6582:14;6565;:31;;;;:::i;:::-;:65;;6544:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;8827:22:::6;8852:14;:26;8867:10;8852:26;;;;;;;;;;;;;;;;8827:51;;8935:14;8918;:31;;;;:::i;:::-;8888:14;:26;8903:10;8888:26;;;;;;;;;;;;;;;:62;;;;8966:9;8961:143;8985:14;8981:1;:18;8961:143;;;9042:1;9020:18;;:23;;;;;;;:::i;:::-;;;;;;;;9057:36;9067:10;9079:13;:11;:13::i;:::-;9057:9;:36::i;:::-;9001:3;;;;;:::i;:::-;;;;8961:143;;;;8817:293;6473:237:::5;6927:1;6294::::4;7911:272:::2;8300:1;1701::2::0;2628:7;:22;;;;8547:563:16;:::o;4169:153:4:-;4263:52;4282:12;:10;:12::i;:::-;4296:8;4306;4263:18;:52::i;:::-;4169:153;;:::o;5656:48:16:-;5701:3;5656:48;:::o;5861:30::-;;;;;;;;;;;;;:::o;5383:44::-;5423:4;5383:44;:::o;5250:315:4:-;5418:41;5437:12;:10;:12::i;:::-;5451:7;5418:18;:41::i;:::-;5410:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;5520:38;5534:4;5540:2;5544:7;5553:4;5520:13;:38::i;:::-;5250:315;;;;:::o;13339:440:16:-;13452:13;13489:16;13497:7;13489;:16::i;:::-;13481:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;13557:19;;;;;;;;;;;:215;;13712:7;13726:18;:7;:16;:18::i;:::-;13695:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13557:215;;;13614:15;;;;;;;;;;;13595:44;;;13640:7;13595:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13557:215;13538:234;;13339:440;;;:::o;5799:39::-;;;;;;;;;;;;;:::o;11620:363::-;1744:1:2;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1094:13:0::1;:11;:13::i;:::-;11754:9:16::2;;:16;;5701:3;7586:14;7565:18;;:35;;;;:::i;:::-;:57;;7544:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;5423:4;7742:14;7717:22;:12;:20;:22::i;:::-;:39;;;;:::i;:::-;:56;;7696:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;11786:17:::3;11806:9;;:16;;11786:36;;11854:9;11832:18;;:31;;;;;;;:::i;:::-;;;;;;;;11879:9;11874:103;11898:9;11894:1;:13;11874:103;;;11928:38;11938:9;;11948:1;11938:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;11952:13;:11;:13::i;:::-;11928:9;:38::i;:::-;11909:3;;;;;:::i;:::-;;;;11874:103;;;;11776:207;1117:1:0::2;1701::2::0;2628:7;:22;;;;11620:363:16;;:::o;5898:33::-;;;;:::o;5978:37::-;;;;:::o;10221:161::-;1094:13:0;:11;:13::i;:::-;10354:21:16::1;10331:20;;:44;;;;;;;;;;;;;;;;;;10221:161:::0;:::o;12675:598::-;12796:4;12957:27;13014;;;;;;;;;;;12957:94;;13078:20;;;;;;;;;;;:85;;;;;13155:8;13114:49;;13122:13;:21;;;13144:5;13122:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13114:49;;;13078:85;13061:149;;;13195:4;13188:11;;;;;13061:149;13227:39;13250:5;13257:8;13227:22;:39::i;:::-;13220:46;;;12675:598;;;;;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;;;2161:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;5470:58:16:-;5527:1;5470:58;:::o;829:155:13:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;11657:133:4:-;11738:16;11746:7;11738;:16::i;:::-;11730:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;11657:133;:::o;640:96:9:-;693:7;719:10;712:17;;640:96;:::o;10959:171:4:-;11060:2;11033:15;:24;11049:7;11033:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11115:7;11111:2;11077:46;;11086:23;11101:7;11086:14;:23::i;:::-;11077:46;;;;;;;;;;;;10959:171;;:::o;827:112:10:-;892:7;918;:14;;;911:21;;827:112;;;:::o;12361:129:16:-;12401:7;12420:24;:12;:22;:24::i;:::-;12461:22;:12;:20;:22::i;:::-;12454:29;;12361:129;:::o;7908:108:4:-;7983:26;7993:2;7997:7;7983:26;;;;;;;;;;;;:9;:26::i;:::-;7908:108;;:::o;7317:261::-;7410:4;7426:13;7442:23;7457:7;7442:14;:23::i;:::-;7426:39;;7494:5;7483:16;;:7;:16;;;:52;;;;7503:32;7520:5;7527:7;7503:16;:32::i;:::-;7483:52;:87;;;;7563:7;7539:31;;:20;7551:7;7539:11;:20::i;:::-;:31;;;7483:87;7475:96;;;7317:261;;;;:::o;10242:605::-;10396:4;10369:31;;:23;10384:7;10369:14;:23::i;:::-;:31;;;10361:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10474:1;10460:16;;:2;:16;;;;10452:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10528:39;10549:4;10555:2;10559:7;10528:20;:39::i;:::-;10629:29;10646:1;10650:7;10629:8;:29::i;:::-;10688:1;10669:9;:15;10679:4;10669:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10716:1;10699:9;:13;10709:2;10699:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10746:2;10727:7;:16;10735:7;10727:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10783:7;10779:2;10764:27;;10773:4;10764:27;;;;;;;;;;;;10802:38;10822:4;10828:2;10832:7;10802:19;:38::i;:::-;10242:605;;;:::o;2433:187:0:-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;11266:307:4:-;11416:8;11407:17;;:5;:17;;;;11399:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11502:8;11464:18;:25;11483:5;11464:25;;;;;;;;;;;;;;;:35;11490:8;11464:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11547:8;11525:41;;11540:5;11525:41;;;11557:8;11525:41;;;;;;:::i;:::-;;;;;;;;11266:307;;;:::o;6426:305::-;6576:28;6586:4;6592:2;6596:7;6576:9;:28::i;:::-;6622:47;6645:4;6651:2;6655:7;6664:4;6622:22;:47::i;:::-;6614:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;6426:305;;;;:::o;7034:125::-;7099:4;7150:1;7122:30;;:7;:16;7130:7;7122:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7115:37;;7034:125;;;:::o;392:703:11:-;448:13;674:1;665:5;:10;661:51;;;691:10;;;;;;;;;;;;;;;;;;;;;661:51;721:12;736:5;721:20;;751:14;775:75;790:1;782:4;:9;775:75;;807:8;;;;;:::i;:::-;;;;837:2;829:10;;;;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;908:150;924:1;915:5;:10;908:150;;951:1;941:11;;;;;:::i;:::-;;;1017:2;1009:5;:10;;;;:::i;:::-;996:2;:24;;;;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1045:2;1036:11;;;;;:::i;:::-;;;908:150;;;1081:6;1067:21;;;;;392:703;;;;:::o;4388:162:4:-;4485:4;4508:18;:25;4527:5;4508:25;;;;;;;;;;;;;;;:35;4534:8;4508:35;;;;;;;;;;;;;;;;;;;;;;;;;4501:42;;4388:162;;;;:::o;945:123:10:-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;8237:309:4:-;8361:18;8367:2;8371:7;8361:5;:18::i;:::-;8410:53;8441:1;8445:2;8449:7;8458:4;8410:22;:53::i;:::-;8389:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;8237:309;;;:::o;13729:122::-;;;;:::o;14223:121::-;;;;:::o;12342:831::-;12491:4;12511:15;:2;:13;;;:15::i;:::-;12507:660;;;12562:2;12546:36;;;12583:12;:10;:12::i;:::-;12597:4;12603:7;12612:4;12546:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12542:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12801:1;12784:6;:13;:18;12780:321;;;12826:60;;;;;;;;;;:::i;:::-;;;;;;;;12780:321;13053:6;13047:13;13038:6;13034:2;13030:15;13023:38;12542:573;12677:41;;;12667:51;;;:6;:51;;;;12660:58;;;;;12507:660;13152:4;13145:11;;12342:831;;;;;;;:::o;8868:427::-;8961:1;8947:16;;:2;:16;;;;8939:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9019:16;9027:7;9019;:16::i;:::-;9018:17;9010:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9079:45;9108:1;9112:2;9116:7;9079:20;:45::i;:::-;9152:1;9135:9;:13;9145:2;9135:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9182:2;9163:7;:16;9171:7;9163:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9225:7;9221:2;9200:33;;9217:1;9200:33;;;;;;;;;;;;9244:44;9272:1;9276:2;9280:7;9244:19;:44::i;:::-;8868:427;;:::o;1175:320:8:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:18:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:421::-;930:5;955:66;971:49;1013:6;971:49;:::i;:::-;955:66;:::i;:::-;946:75;;1044:6;1037:5;1030:21;1082:4;1075:5;1071:16;1120:3;1111:6;1106:3;1102:16;1099:25;1096:112;;;1127:79;;:::i;:::-;1096:112;1217:39;1249:6;1244:3;1239;1217:39;:::i;:::-;936:326;841:421;;;;;:::o;1268:139::-;1314:5;1352:6;1339:20;1330:29;;1368:33;1395:5;1368:33;:::i;:::-;1268:139;;;;:::o;1430:568::-;1503:8;1513:6;1563:3;1556:4;1548:6;1544:17;1540:27;1530:122;;1571:79;;:::i;:::-;1530:122;1684:6;1671:20;1661:30;;1714:18;1706:6;1703:30;1700:117;;;1736:79;;:::i;:::-;1700:117;1850:4;1842:6;1838:17;1826:29;;1904:3;1896:4;1888:6;1884:17;1874:8;1870:32;1867:41;1864:128;;;1911:79;;:::i;:::-;1864:128;1430:568;;;;;:::o;2004:133::-;2047:5;2085:6;2072:20;2063:29;;2101:30;2125:5;2101:30;:::i;:::-;2004:133;;;;:::o;2143:137::-;2197:5;2228:6;2222:13;2213:22;;2244:30;2268:5;2244:30;:::i;:::-;2143:137;;;;:::o;2286:::-;2331:5;2369:6;2356:20;2347:29;;2385:32;2411:5;2385:32;:::i;:::-;2286:137;;;;:::o;2429:141::-;2485:5;2516:6;2510:13;2501:22;;2532:32;2558:5;2532:32;:::i;:::-;2429:141;;;;:::o;2589:338::-;2644:5;2693:3;2686:4;2678:6;2674:17;2670:27;2660:122;;2701:79;;:::i;:::-;2660:122;2818:6;2805:20;2843:78;2917:3;2909:6;2902:4;2894:6;2890:17;2843:78;:::i;:::-;2834:87;;2650:277;2589:338;;;;:::o;2933:167::-;2993:5;3031:6;3018:20;3009:29;;3047:47;3088:5;3047:47;:::i;:::-;2933:167;;;;:::o;3106:201::-;3192:5;3223:6;3217:13;3208:22;;3239:62;3295:5;3239:62;:::i;:::-;3106:201;;;;:::o;3327:340::-;3383:5;3432:3;3425:4;3417:6;3413:17;3409:27;3399:122;;3440:79;;:::i;:::-;3399:122;3557:6;3544:20;3582:79;3657:3;3649:6;3642:4;3634:6;3630:17;3582:79;:::i;:::-;3573:88;;3389:278;3327:340;;;;:::o;3687:355::-;3754:5;3803:3;3796:4;3788:6;3784:17;3780:27;3770:122;;3811:79;;:::i;:::-;3770:122;3921:6;3915:13;3946:90;4032:3;4024:6;4017:4;4009:6;4005:17;3946:90;:::i;:::-;3937:99;;3760:282;3687:355;;;;:::o;4048:139::-;4094:5;4132:6;4119:20;4110:29;;4148:33;4175:5;4148:33;:::i;:::-;4048:139;;;;:::o;4193:143::-;4250:5;4281:6;4275:13;4266:22;;4297:33;4324:5;4297:33;:::i;:::-;4193:143;;;;:::o;4342:329::-;4401:6;4450:2;4438:9;4429:7;4425:23;4421:32;4418:119;;;4456:79;;:::i;:::-;4418:119;4576:1;4601:53;4646:7;4637:6;4626:9;4622:22;4601:53;:::i;:::-;4591:63;;4547:117;4342:329;;;;:::o;4677:474::-;4745:6;4753;4802:2;4790:9;4781:7;4777:23;4773:32;4770:119;;;4808:79;;:::i;:::-;4770:119;4928:1;4953:53;4998:7;4989:6;4978:9;4974:22;4953:53;:::i;:::-;4943:63;;4899:117;5055:2;5081:53;5126:7;5117:6;5106:9;5102:22;5081:53;:::i;:::-;5071:63;;5026:118;4677:474;;;;;:::o;5157:619::-;5234:6;5242;5250;5299:2;5287:9;5278:7;5274:23;5270:32;5267:119;;;5305:79;;:::i;:::-;5267:119;5425:1;5450:53;5495:7;5486:6;5475:9;5471:22;5450:53;:::i;:::-;5440:63;;5396:117;5552:2;5578:53;5623:7;5614:6;5603:9;5599:22;5578:53;:::i;:::-;5568:63;;5523:118;5680:2;5706:53;5751:7;5742:6;5731:9;5727:22;5706:53;:::i;:::-;5696:63;;5651:118;5157:619;;;;;:::o;5782:943::-;5877:6;5885;5893;5901;5950:3;5938:9;5929:7;5925:23;5921:33;5918:120;;;5957:79;;:::i;:::-;5918:120;6077:1;6102:53;6147:7;6138:6;6127:9;6123:22;6102:53;:::i;:::-;6092:63;;6048:117;6204:2;6230:53;6275:7;6266:6;6255:9;6251:22;6230:53;:::i;:::-;6220:63;;6175:118;6332:2;6358:53;6403:7;6394:6;6383:9;6379:22;6358:53;:::i;:::-;6348:63;;6303:118;6488:2;6477:9;6473:18;6460:32;6519:18;6511:6;6508:30;6505:117;;;6541:79;;:::i;:::-;6505:117;6646:62;6700:7;6691:6;6680:9;6676:22;6646:62;:::i;:::-;6636:72;;6431:287;5782:943;;;;;;;:::o;6731:468::-;6796:6;6804;6853:2;6841:9;6832:7;6828:23;6824:32;6821:119;;;6859:79;;:::i;:::-;6821:119;6979:1;7004:53;7049:7;7040:6;7029:9;7025:22;7004:53;:::i;:::-;6994:63;;6950:117;7106:2;7132:50;7174:7;7165:6;7154:9;7150:22;7132:50;:::i;:::-;7122:60;;7077:115;6731:468;;;;;:::o;7205:474::-;7273:6;7281;7330:2;7318:9;7309:7;7305:23;7301:32;7298:119;;;7336:79;;:::i;:::-;7298:119;7456:1;7481:53;7526:7;7517:6;7506:9;7502:22;7481:53;:::i;:::-;7471:63;;7427:117;7583:2;7609:53;7654:7;7645:6;7634:9;7630:22;7609:53;:::i;:::-;7599:63;;7554:118;7205:474;;;;;:::o;7685:559::-;7771:6;7779;7828:2;7816:9;7807:7;7803:23;7799:32;7796:119;;;7834:79;;:::i;:::-;7796:119;7982:1;7971:9;7967:17;7954:31;8012:18;8004:6;8001:30;7998:117;;;8034:79;;:::i;:::-;7998:117;8147:80;8219:7;8210:6;8199:9;8195:22;8147:80;:::i;:::-;8129:98;;;;7925:312;7685:559;;;;;:::o;8250:323::-;8306:6;8355:2;8343:9;8334:7;8330:23;8326:32;8323:119;;;8361:79;;:::i;:::-;8323:119;8481:1;8506:50;8548:7;8539:6;8528:9;8524:22;8506:50;:::i;:::-;8496:60;;8452:114;8250:323;;;;:::o;8579:345::-;8646:6;8695:2;8683:9;8674:7;8670:23;8666:32;8663:119;;;8701:79;;:::i;:::-;8663:119;8821:1;8846:61;8899:7;8890:6;8879:9;8875:22;8846:61;:::i;:::-;8836:71;;8792:125;8579:345;;;;:::o;8930:327::-;8988:6;9037:2;9025:9;9016:7;9012:23;9008:32;9005:119;;;9043:79;;:::i;:::-;9005:119;9163:1;9188:52;9232:7;9223:6;9212:9;9208:22;9188:52;:::i;:::-;9178:62;;9134:116;8930:327;;;;:::o;9263:349::-;9332:6;9381:2;9369:9;9360:7;9356:23;9352:32;9349:119;;;9387:79;;:::i;:::-;9349:119;9507:1;9532:63;9587:7;9578:6;9567:9;9563:22;9532:63;:::i;:::-;9522:73;;9478:127;9263:349;;;;:::o;9618:357::-;9691:6;9740:2;9728:9;9719:7;9715:23;9711:32;9708:119;;;9746:79;;:::i;:::-;9708:119;9866:1;9891:67;9950:7;9941:6;9930:9;9926:22;9891:67;:::i;:::-;9881:77;;9837:131;9618:357;;;;:::o;9981:409::-;10080:6;10129:2;10117:9;10108:7;10104:23;10100:32;10097:119;;;10135:79;;:::i;:::-;10097:119;10255:1;10280:93;10365:7;10356:6;10345:9;10341:22;10280:93;:::i;:::-;10270:103;;10226:157;9981:409;;;;:::o;10396:509::-;10465:6;10514:2;10502:9;10493:7;10489:23;10485:32;10482:119;;;10520:79;;:::i;:::-;10482:119;10668:1;10657:9;10653:17;10640:31;10698:18;10690:6;10687:30;10684:117;;;10720:79;;:::i;:::-;10684:117;10825:63;10880:7;10871:6;10860:9;10856:22;10825:63;:::i;:::-;10815:73;;10611:287;10396:509;;;;:::o;10911:524::-;10991:6;11040:2;11028:9;11019:7;11015:23;11011:32;11008:119;;;11046:79;;:::i;:::-;11008:119;11187:1;11176:9;11172:17;11166:24;11217:18;11209:6;11206:30;11203:117;;;11239:79;;:::i;:::-;11203:117;11344:74;11410:7;11401:6;11390:9;11386:22;11344:74;:::i;:::-;11334:84;;11137:291;10911:524;;;;:::o;11441:329::-;11500:6;11549:2;11537:9;11528:7;11524:23;11520:32;11517:119;;;11555:79;;:::i;:::-;11517:119;11675:1;11700:53;11745:7;11736:6;11725:9;11721:22;11700:53;:::i;:::-;11690:63;;11646:117;11441:329;;;;:::o;11776:351::-;11846:6;11895:2;11883:9;11874:7;11870:23;11866:32;11863:119;;;11901:79;;:::i;:::-;11863:119;12021:1;12046:64;12102:7;12093:6;12082:9;12078:22;12046:64;:::i;:::-;12036:74;;11992:128;11776:351;;;;:::o;12133:118::-;12220:24;12238:5;12220:24;:::i;:::-;12215:3;12208:37;12133:118;;:::o;12257:109::-;12338:21;12353:5;12338:21;:::i;:::-;12333:3;12326:34;12257:109;;:::o;12372:360::-;12458:3;12486:38;12518:5;12486:38;:::i;:::-;12540:70;12603:6;12598:3;12540:70;:::i;:::-;12533:77;;12619:52;12664:6;12659:3;12652:4;12645:5;12641:16;12619:52;:::i;:::-;12696:29;12718:6;12696:29;:::i;:::-;12691:3;12687:39;12680:46;;12462:270;12372:360;;;;:::o;12738:364::-;12826:3;12854:39;12887:5;12854:39;:::i;:::-;12909:71;12973:6;12968:3;12909:71;:::i;:::-;12902:78;;12989:52;13034:6;13029:3;13022:4;13015:5;13011:16;12989:52;:::i;:::-;13066:29;13088:6;13066:29;:::i;:::-;13061:3;13057:39;13050:46;;12830:272;12738:364;;;;:::o;13108:377::-;13214:3;13242:39;13275:5;13242:39;:::i;:::-;13297:89;13379:6;13374:3;13297:89;:::i;:::-;13290:96;;13395:52;13440:6;13435:3;13428:4;13421:5;13417:16;13395:52;:::i;:::-;13472:6;13467:3;13463:16;13456:23;;13218:267;13108:377;;;;:::o;13515:845::-;13618:3;13655:5;13649:12;13684:36;13710:9;13684:36;:::i;:::-;13736:89;13818:6;13813:3;13736:89;:::i;:::-;13729:96;;13856:1;13845:9;13841:17;13872:1;13867:137;;;;14018:1;14013:341;;;;13834:520;;13867:137;13951:4;13947:9;13936;13932:25;13927:3;13920:38;13987:6;13982:3;13978:16;13971:23;;13867:137;;14013:341;14080:38;14112:5;14080:38;:::i;:::-;14140:1;14154:154;14168:6;14165:1;14162:13;14154:154;;;14242:7;14236:14;14232:1;14227:3;14223:11;14216:35;14292:1;14283:7;14279:15;14268:26;;14190:4;14187:1;14183:12;14178:17;;14154:154;;;14337:6;14332:3;14328:16;14321:23;;14020:334;;13834:520;;13622:738;;13515:845;;;;:::o;14366:366::-;14508:3;14529:67;14593:2;14588:3;14529:67;:::i;:::-;14522:74;;14605:93;14694:3;14605:93;:::i;:::-;14723:2;14718:3;14714:12;14707:19;;14366:366;;;:::o;14738:::-;14880:3;14901:67;14965:2;14960:3;14901:67;:::i;:::-;14894:74;;14977:93;15066:3;14977:93;:::i;:::-;15095:2;15090:3;15086:12;15079:19;;14738:366;;;:::o;15110:::-;15252:3;15273:67;15337:2;15332:3;15273:67;:::i;:::-;15266:74;;15349:93;15438:3;15349:93;:::i;:::-;15467:2;15462:3;15458:12;15451:19;;15110:366;;;:::o;15482:::-;15624:3;15645:67;15709:2;15704:3;15645:67;:::i;:::-;15638:74;;15721:93;15810:3;15721:93;:::i;:::-;15839:2;15834:3;15830:12;15823:19;;15482:366;;;:::o;15854:::-;15996:3;16017:67;16081:2;16076:3;16017:67;:::i;:::-;16010:74;;16093:93;16182:3;16093:93;:::i;:::-;16211:2;16206:3;16202:12;16195:19;;15854:366;;;:::o;16226:::-;16368:3;16389:67;16453:2;16448:3;16389:67;:::i;:::-;16382:74;;16465:93;16554:3;16465:93;:::i;:::-;16583:2;16578:3;16574:12;16567:19;;16226:366;;;:::o;16598:::-;16740:3;16761:67;16825:2;16820:3;16761:67;:::i;:::-;16754:74;;16837:93;16926:3;16837:93;:::i;:::-;16955:2;16950:3;16946:12;16939:19;;16598:366;;;:::o;16970:::-;17112:3;17133:67;17197:2;17192:3;17133:67;:::i;:::-;17126:74;;17209:93;17298:3;17209:93;:::i;:::-;17327:2;17322:3;17318:12;17311:19;;16970:366;;;:::o;17342:::-;17484:3;17505:67;17569:2;17564:3;17505:67;:::i;:::-;17498:74;;17581:93;17670:3;17581:93;:::i;:::-;17699:2;17694:3;17690:12;17683:19;;17342:366;;;:::o;17714:::-;17856:3;17877:67;17941:2;17936:3;17877:67;:::i;:::-;17870:74;;17953:93;18042:3;17953:93;:::i;:::-;18071:2;18066:3;18062:12;18055:19;;17714:366;;;:::o;18086:::-;18228:3;18249:67;18313:2;18308:3;18249:67;:::i;:::-;18242:74;;18325:93;18414:3;18325:93;:::i;:::-;18443:2;18438:3;18434:12;18427:19;;18086:366;;;:::o;18458:::-;18600:3;18621:67;18685:2;18680:3;18621:67;:::i;:::-;18614:74;;18697:93;18786:3;18697:93;:::i;:::-;18815:2;18810:3;18806:12;18799:19;;18458:366;;;:::o;18830:::-;18972:3;18993:67;19057:2;19052:3;18993:67;:::i;:::-;18986:74;;19069:93;19158:3;19069:93;:::i;:::-;19187:2;19182:3;19178:12;19171:19;;18830:366;;;:::o;19202:::-;19344:3;19365:67;19429:2;19424:3;19365:67;:::i;:::-;19358:74;;19441:93;19530:3;19441:93;:::i;:::-;19559:2;19554:3;19550:12;19543:19;;19202:366;;;:::o;19574:::-;19716:3;19737:67;19801:2;19796:3;19737:67;:::i;:::-;19730:74;;19813:93;19902:3;19813:93;:::i;:::-;19931:2;19926:3;19922:12;19915:19;;19574:366;;;:::o;19946:::-;20088:3;20109:67;20173:2;20168:3;20109:67;:::i;:::-;20102:74;;20185:93;20274:3;20185:93;:::i;:::-;20303:2;20298:3;20294:12;20287:19;;19946:366;;;:::o;20318:::-;20460:3;20481:67;20545:2;20540:3;20481:67;:::i;:::-;20474:74;;20557:93;20646:3;20557:93;:::i;:::-;20675:2;20670:3;20666:12;20659:19;;20318:366;;;:::o;20690:400::-;20850:3;20871:84;20953:1;20948:3;20871:84;:::i;:::-;20864:91;;20964:93;21053:3;20964:93;:::i;:::-;21082:1;21077:3;21073:11;21066:18;;20690:400;;;:::o;21096:366::-;21238:3;21259:67;21323:2;21318:3;21259:67;:::i;:::-;21252:74;;21335:93;21424:3;21335:93;:::i;:::-;21453:2;21448:3;21444:12;21437:19;;21096:366;;;:::o;21468:::-;21610:3;21631:67;21695:2;21690:3;21631:67;:::i;:::-;21624:74;;21707:93;21796:3;21707:93;:::i;:::-;21825:2;21820:3;21816:12;21809:19;;21468:366;;;:::o;21840:::-;21982:3;22003:67;22067:2;22062:3;22003:67;:::i;:::-;21996:74;;22079:93;22168:3;22079:93;:::i;:::-;22197:2;22192:3;22188:12;22181:19;;21840:366;;;:::o;22212:::-;22354:3;22375:67;22439:2;22434:3;22375:67;:::i;:::-;22368:74;;22451:93;22540:3;22451:93;:::i;:::-;22569:2;22564:3;22560:12;22553:19;;22212:366;;;:::o;22584:::-;22726:3;22747:67;22811:2;22806:3;22747:67;:::i;:::-;22740:74;;22823:93;22912:3;22823:93;:::i;:::-;22941:2;22936:3;22932:12;22925:19;;22584:366;;;:::o;22956:::-;23098:3;23119:67;23183:2;23178:3;23119:67;:::i;:::-;23112:74;;23195:93;23284:3;23195:93;:::i;:::-;23313:2;23308:3;23304:12;23297:19;;22956:366;;;:::o;23328:::-;23470:3;23491:67;23555:2;23550:3;23491:67;:::i;:::-;23484:74;;23567:93;23656:3;23567:93;:::i;:::-;23685:2;23680:3;23676:12;23669:19;;23328:366;;;:::o;23700:400::-;23860:3;23881:84;23963:1;23958:3;23881:84;:::i;:::-;23874:91;;23974:93;24063:3;23974:93;:::i;:::-;24092:1;24087:3;24083:11;24076:18;;23700:400;;;:::o;24106:118::-;24193:24;24211:5;24193:24;:::i;:::-;24188:3;24181:37;24106:118;;:::o;24230:961::-;24609:3;24631:92;24719:3;24710:6;24631:92;:::i;:::-;24624:99;;24740:148;24884:3;24740:148;:::i;:::-;24733:155;;24905:95;24996:3;24987:6;24905:95;:::i;:::-;24898:102;;25017:148;25161:3;25017:148;:::i;:::-;25010:155;;25182:3;25175:10;;24230:961;;;;;:::o;25197:222::-;25290:4;25328:2;25317:9;25313:18;25305:26;;25341:71;25409:1;25398:9;25394:17;25385:6;25341:71;:::i;:::-;25197:222;;;;:::o;25425:640::-;25620:4;25658:3;25647:9;25643:19;25635:27;;25672:71;25740:1;25729:9;25725:17;25716:6;25672:71;:::i;:::-;25753:72;25821:2;25810:9;25806:18;25797:6;25753:72;:::i;:::-;25835;25903:2;25892:9;25888:18;25879:6;25835:72;:::i;:::-;25954:9;25948:4;25944:20;25939:2;25928:9;25924:18;25917:48;25982:76;26053:4;26044:6;25982:76;:::i;:::-;25974:84;;25425:640;;;;;;;:::o;26071:332::-;26192:4;26230:2;26219:9;26215:18;26207:26;;26243:71;26311:1;26300:9;26296:17;26287:6;26243:71;:::i;:::-;26324:72;26392:2;26381:9;26377:18;26368:6;26324:72;:::i;:::-;26071:332;;;;;:::o;26409:210::-;26496:4;26534:2;26523:9;26519:18;26511:26;;26547:65;26609:1;26598:9;26594:17;26585:6;26547:65;:::i;:::-;26409:210;;;;:::o;26625:313::-;26738:4;26776:2;26765:9;26761:18;26753:26;;26825:9;26819:4;26815:20;26811:1;26800:9;26796:17;26789:47;26853:78;26926:4;26917:6;26853:78;:::i;:::-;26845:86;;26625:313;;;;:::o;26944:419::-;27110:4;27148:2;27137:9;27133:18;27125:26;;27197:9;27191:4;27187:20;27183:1;27172:9;27168:17;27161:47;27225:131;27351:4;27225:131;:::i;:::-;27217:139;;26944:419;;;:::o;27369:::-;27535:4;27573:2;27562:9;27558:18;27550:26;;27622:9;27616:4;27612:20;27608:1;27597:9;27593:17;27586:47;27650:131;27776:4;27650:131;:::i;:::-;27642:139;;27369:419;;;:::o;27794:::-;27960:4;27998:2;27987:9;27983:18;27975:26;;28047:9;28041:4;28037:20;28033:1;28022:9;28018:17;28011:47;28075:131;28201:4;28075:131;:::i;:::-;28067:139;;27794:419;;;:::o;28219:::-;28385:4;28423:2;28412:9;28408:18;28400:26;;28472:9;28466:4;28462:20;28458:1;28447:9;28443:17;28436:47;28500:131;28626:4;28500:131;:::i;:::-;28492:139;;28219:419;;;:::o;28644:::-;28810:4;28848:2;28837:9;28833:18;28825:26;;28897:9;28891:4;28887:20;28883:1;28872:9;28868:17;28861:47;28925:131;29051:4;28925:131;:::i;:::-;28917:139;;28644:419;;;:::o;29069:::-;29235:4;29273:2;29262:9;29258:18;29250:26;;29322:9;29316:4;29312:20;29308:1;29297:9;29293:17;29286:47;29350:131;29476:4;29350:131;:::i;:::-;29342:139;;29069:419;;;:::o;29494:::-;29660:4;29698:2;29687:9;29683:18;29675:26;;29747:9;29741:4;29737:20;29733:1;29722:9;29718:17;29711:47;29775:131;29901:4;29775:131;:::i;:::-;29767:139;;29494:419;;;:::o;29919:::-;30085:4;30123:2;30112:9;30108:18;30100:26;;30172:9;30166:4;30162:20;30158:1;30147:9;30143:17;30136:47;30200:131;30326:4;30200:131;:::i;:::-;30192:139;;29919:419;;;:::o;30344:::-;30510:4;30548:2;30537:9;30533:18;30525:26;;30597:9;30591:4;30587:20;30583:1;30572:9;30568:17;30561:47;30625:131;30751:4;30625:131;:::i;:::-;30617:139;;30344:419;;;:::o;30769:::-;30935:4;30973:2;30962:9;30958:18;30950:26;;31022:9;31016:4;31012:20;31008:1;30997:9;30993:17;30986:47;31050:131;31176:4;31050:131;:::i;:::-;31042:139;;30769:419;;;:::o;31194:::-;31360:4;31398:2;31387:9;31383:18;31375:26;;31447:9;31441:4;31437:20;31433:1;31422:9;31418:17;31411:47;31475:131;31601:4;31475:131;:::i;:::-;31467:139;;31194:419;;;:::o;31619:::-;31785:4;31823:2;31812:9;31808:18;31800:26;;31872:9;31866:4;31862:20;31858:1;31847:9;31843:17;31836:47;31900:131;32026:4;31900:131;:::i;:::-;31892:139;;31619:419;;;:::o;32044:::-;32210:4;32248:2;32237:9;32233:18;32225:26;;32297:9;32291:4;32287:20;32283:1;32272:9;32268:17;32261:47;32325:131;32451:4;32325:131;:::i;:::-;32317:139;;32044:419;;;:::o;32469:::-;32635:4;32673:2;32662:9;32658:18;32650:26;;32722:9;32716:4;32712:20;32708:1;32697:9;32693:17;32686:47;32750:131;32876:4;32750:131;:::i;:::-;32742:139;;32469:419;;;:::o;32894:::-;33060:4;33098:2;33087:9;33083:18;33075:26;;33147:9;33141:4;33137:20;33133:1;33122:9;33118:17;33111:47;33175:131;33301:4;33175:131;:::i;:::-;33167:139;;32894:419;;;:::o;33319:::-;33485:4;33523:2;33512:9;33508:18;33500:26;;33572:9;33566:4;33562:20;33558:1;33547:9;33543:17;33536:47;33600:131;33726:4;33600:131;:::i;:::-;33592:139;;33319:419;;;:::o;33744:::-;33910:4;33948:2;33937:9;33933:18;33925:26;;33997:9;33991:4;33987:20;33983:1;33972:9;33968:17;33961:47;34025:131;34151:4;34025:131;:::i;:::-;34017:139;;33744:419;;;:::o;34169:::-;34335:4;34373:2;34362:9;34358:18;34350:26;;34422:9;34416:4;34412:20;34408:1;34397:9;34393:17;34386:47;34450:131;34576:4;34450:131;:::i;:::-;34442:139;;34169:419;;;:::o;34594:::-;34760:4;34798:2;34787:9;34783:18;34775:26;;34847:9;34841:4;34837:20;34833:1;34822:9;34818:17;34811:47;34875:131;35001:4;34875:131;:::i;:::-;34867:139;;34594:419;;;:::o;35019:::-;35185:4;35223:2;35212:9;35208:18;35200:26;;35272:9;35266:4;35262:20;35258:1;35247:9;35243:17;35236:47;35300:131;35426:4;35300:131;:::i;:::-;35292:139;;35019:419;;;:::o;35444:::-;35610:4;35648:2;35637:9;35633:18;35625:26;;35697:9;35691:4;35687:20;35683:1;35672:9;35668:17;35661:47;35725:131;35851:4;35725:131;:::i;:::-;35717:139;;35444:419;;;:::o;35869:::-;36035:4;36073:2;36062:9;36058:18;36050:26;;36122:9;36116:4;36112:20;36108:1;36097:9;36093:17;36086:47;36150:131;36276:4;36150:131;:::i;:::-;36142:139;;35869:419;;;:::o;36294:::-;36460:4;36498:2;36487:9;36483:18;36475:26;;36547:9;36541:4;36537:20;36533:1;36522:9;36518:17;36511:47;36575:131;36701:4;36575:131;:::i;:::-;36567:139;;36294:419;;;:::o;36719:::-;36885:4;36923:2;36912:9;36908:18;36900:26;;36972:9;36966:4;36962:20;36958:1;36947:9;36943:17;36936:47;37000:131;37126:4;37000:131;:::i;:::-;36992:139;;36719:419;;;:::o;37144:222::-;37237:4;37275:2;37264:9;37260:18;37252:26;;37288:71;37356:1;37345:9;37341:17;37332:6;37288:71;:::i;:::-;37144:222;;;;:::o;37372:129::-;37406:6;37433:20;;:::i;:::-;37423:30;;37462:33;37490:4;37482:6;37462:33;:::i;:::-;37372:129;;;:::o;37507:75::-;37540:6;37573:2;37567:9;37557:19;;37507:75;:::o;37588:307::-;37649:4;37739:18;37731:6;37728:30;37725:56;;;37761:18;;:::i;:::-;37725:56;37799:29;37821:6;37799:29;:::i;:::-;37791:37;;37883:4;37877;37873:15;37865:23;;37588:307;;;:::o;37901:308::-;37963:4;38053:18;38045:6;38042:30;38039:56;;;38075:18;;:::i;:::-;38039:56;38113:29;38135:6;38113:29;:::i;:::-;38105:37;;38197:4;38191;38187:15;38179:23;;37901:308;;;:::o;38215:141::-;38264:4;38287:3;38279:11;;38310:3;38307:1;38300:14;38344:4;38341:1;38331:18;38323:26;;38215:141;;;:::o;38362:98::-;38413:6;38447:5;38441:12;38431:22;;38362:98;;;:::o;38466:99::-;38518:6;38552:5;38546:12;38536:22;;38466:99;;;:::o;38571:168::-;38654:11;38688:6;38683:3;38676:19;38728:4;38723:3;38719:14;38704:29;;38571:168;;;;:::o;38745:169::-;38829:11;38863:6;38858:3;38851:19;38903:4;38898:3;38894:14;38879:29;;38745:169;;;;:::o;38920:148::-;39022:11;39059:3;39044:18;;38920:148;;;;:::o;39074:305::-;39114:3;39133:20;39151:1;39133:20;:::i;:::-;39128:25;;39167:20;39185:1;39167:20;:::i;:::-;39162:25;;39321:1;39253:66;39249:74;39246:1;39243:81;39240:107;;;39327:18;;:::i;:::-;39240:107;39371:1;39368;39364:9;39357:16;;39074:305;;;;:::o;39385:185::-;39425:1;39442:20;39460:1;39442:20;:::i;:::-;39437:25;;39476:20;39494:1;39476:20;:::i;:::-;39471:25;;39515:1;39505:35;;39520:18;;:::i;:::-;39505:35;39562:1;39559;39555:9;39550:14;;39385:185;;;;:::o;39576:348::-;39616:7;39639:20;39657:1;39639:20;:::i;:::-;39634:25;;39673:20;39691:1;39673:20;:::i;:::-;39668:25;;39861:1;39793:66;39789:74;39786:1;39783:81;39778:1;39771:9;39764:17;39760:105;39757:131;;;39868:18;;:::i;:::-;39757:131;39916:1;39913;39909:9;39898:20;;39576:348;;;;:::o;39930:191::-;39970:4;39990:20;40008:1;39990:20;:::i;:::-;39985:25;;40024:20;40042:1;40024:20;:::i;:::-;40019:25;;40063:1;40060;40057:8;40054:34;;;40068:18;;:::i;:::-;40054:34;40113:1;40110;40106:9;40098:17;;39930:191;;;;:::o;40127:96::-;40164:7;40193:24;40211:5;40193:24;:::i;:::-;40182:35;;40127:96;;;:::o;40229:90::-;40263:7;40306:5;40299:13;40292:21;40281:32;;40229:90;;;:::o;40325:149::-;40361:7;40401:66;40394:5;40390:78;40379:89;;40325:149;;;:::o;40480:110::-;40531:7;40560:24;40578:5;40560:24;:::i;:::-;40549:35;;40480:110;;;:::o;40596:125::-;40662:7;40691:24;40709:5;40691:24;:::i;:::-;40680:35;;40596:125;;;:::o;40727:126::-;40764:7;40804:42;40797:5;40793:54;40782:65;;40727:126;;;:::o;40859:77::-;40896:7;40925:5;40914:16;;40859:77;;;:::o;40942:154::-;41026:6;41021:3;41016;41003:30;41088:1;41079:6;41074:3;41070:16;41063:27;40942:154;;;:::o;41102:307::-;41170:1;41180:113;41194:6;41191:1;41188:13;41180:113;;;41279:1;41274:3;41270:11;41264:18;41260:1;41255:3;41251:11;41244:39;41216:2;41213:1;41209:10;41204:15;;41180:113;;;41311:6;41308:1;41305:13;41302:101;;;41391:1;41382:6;41377:3;41373:16;41366:27;41302:101;41151:258;41102:307;;;:::o;41415:320::-;41459:6;41496:1;41490:4;41486:12;41476:22;;41543:1;41537:4;41533:12;41564:18;41554:81;;41620:4;41612:6;41608:17;41598:27;;41554:81;41682:2;41674:6;41671:14;41651:18;41648:38;41645:84;;;41701:18;;:::i;:::-;41645:84;41466:269;41415:320;;;:::o;41741:281::-;41824:27;41846:4;41824:27;:::i;:::-;41816:6;41812:40;41954:6;41942:10;41939:22;41918:18;41906:10;41903:34;41900:62;41897:88;;;41965:18;;:::i;:::-;41897:88;42005:10;42001:2;41994:22;41784:238;41741:281;;:::o;42028:233::-;42067:3;42090:24;42108:5;42090:24;:::i;:::-;42081:33;;42136:66;42129:5;42126:77;42123:103;;;42206:18;;:::i;:::-;42123:103;42253:1;42246:5;42242:13;42235:20;;42028:233;;;:::o;42267:176::-;42299:1;42316:20;42334:1;42316:20;:::i;:::-;42311:25;;42350:20;42368:1;42350:20;:::i;:::-;42345:25;;42389:1;42379:35;;42394:18;;:::i;:::-;42379:35;42435:1;42432;42428:9;42423:14;;42267:176;;;;:::o;42449:180::-;42497:77;42494:1;42487:88;42594:4;42591:1;42584:15;42618:4;42615:1;42608:15;42635:180;42683:77;42680:1;42673:88;42780:4;42777:1;42770:15;42804:4;42801:1;42794:15;42821:180;42869:77;42866:1;42859:88;42966:4;42963:1;42956:15;42990:4;42987:1;42980:15;43007:180;43055:77;43052:1;43045:88;43152:4;43149:1;43142:15;43176:4;43173:1;43166:15;43193:180;43241:77;43238:1;43231:88;43338:4;43335:1;43328:15;43362:4;43359:1;43352:15;43379:117;43488:1;43485;43478:12;43502:117;43611:1;43608;43601:12;43625:117;43734:1;43731;43724:12;43748:117;43857:1;43854;43847:12;43871:117;43980:1;43977;43970:12;43994:117;44103:1;44100;44093:12;44117:102;44158:6;44209:2;44205:7;44200:2;44193:5;44189:14;44185:28;44175:38;;44117:102;;;:::o;44225:181::-;44365:33;44361:1;44353:6;44349:14;44342:57;44225:181;:::o;44412:225::-;44552:34;44548:1;44540:6;44536:14;44529:58;44621:8;44616:2;44608:6;44604:15;44597:33;44412:225;:::o;44643:237::-;44783:34;44779:1;44771:6;44767:14;44760:58;44852:20;44847:2;44839:6;44835:15;44828:45;44643:237;:::o;44886:225::-;45026:34;45022:1;45014:6;45010:14;45003:58;45095:8;45090:2;45082:6;45078:15;45071:33;44886:225;:::o;45117:224::-;45257:34;45253:1;45245:6;45241:14;45234:58;45326:7;45321:2;45313:6;45309:15;45302:32;45117:224;:::o;45347:178::-;45487:30;45483:1;45475:6;45471:14;45464:54;45347:178;:::o;45531:230::-;45671:34;45667:1;45659:6;45655:14;45648:58;45740:13;45735:2;45727:6;45723:15;45716:38;45531:230;:::o;45767:::-;45907:34;45903:1;45895:6;45891:14;45884:58;45976:13;45971:2;45963:6;45959:15;45952:38;45767:230;:::o;46003:223::-;46143:34;46139:1;46131:6;46127:14;46120:58;46212:6;46207:2;46199:6;46195:15;46188:31;46003:223;:::o;46232:175::-;46372:27;46368:1;46360:6;46356:14;46349:51;46232:175;:::o;46413:223::-;46553:34;46549:1;46541:6;46537:14;46530:58;46622:6;46617:2;46609:6;46605:15;46598:31;46413:223;:::o;46642:171::-;46782:23;46778:1;46770:6;46766:14;46759:47;46642:171;:::o;46819:228::-;46959:34;46955:1;46947:6;46943:14;46936:58;47028:11;47023:2;47015:6;47011:15;47004:36;46819:228;:::o;47053:167::-;47193:19;47189:1;47181:6;47177:14;47170:43;47053:167;:::o;47226:225::-;47366:34;47362:1;47354:6;47350:14;47343:58;47435:8;47430:2;47422:6;47418:15;47411:33;47226:225;:::o;47457:249::-;47597:34;47593:1;47585:6;47581:14;47574:58;47666:32;47661:2;47653:6;47649:15;47642:57;47457:249;:::o;47712:182::-;47852:34;47848:1;47840:6;47836:14;47829:58;47712:182;:::o;47900:155::-;48040:7;48036:1;48028:6;48024:14;48017:31;47900:155;:::o;48061:182::-;48201:34;48197:1;48189:6;48185:14;48178:58;48061:182;:::o;48249:174::-;48389:26;48385:1;48377:6;48373:14;48366:50;48249:174;:::o;48429:220::-;48569:34;48565:1;48557:6;48553:14;48546:58;48638:3;48633:2;48625:6;48621:15;48614:28;48429:220;:::o;48655:174::-;48795:26;48791:1;48783:6;48779:14;48772:50;48655:174;:::o;48835:233::-;48975:34;48971:1;48963:6;48959:14;48952:58;49044:16;49039:2;49031:6;49027:15;49020:41;48835:233;:::o;49074:181::-;49214:33;49210:1;49202:6;49198:14;49191:57;49074:181;:::o;49261:173::-;49401:25;49397:1;49389:6;49385:14;49378:49;49261:173;:::o;49440:151::-;49580:3;49576:1;49568:6;49564:14;49557:27;49440:151;:::o;49597:122::-;49670:24;49688:5;49670:24;:::i;:::-;49663:5;49660:35;49650:63;;49709:1;49706;49699:12;49650:63;49597:122;:::o;49725:116::-;49795:21;49810:5;49795:21;:::i;:::-;49788:5;49785:32;49775:60;;49831:1;49828;49821:12;49775:60;49725:116;:::o;49847:120::-;49919:23;49936:5;49919:23;:::i;:::-;49912:5;49909:34;49899:62;;49957:1;49954;49947:12;49899:62;49847:120;:::o;49973:150::-;50060:38;50092:5;50060:38;:::i;:::-;50053:5;50050:49;50040:77;;50113:1;50110;50103:12;50040:77;49973:150;:::o;50129:180::-;50231:53;50278:5;50231:53;:::i;:::-;50224:5;50221:64;50211:92;;50299:1;50296;50289:12;50211:92;50129:180;:::o;50315:122::-;50388:24;50406:5;50388:24;:::i;:::-;50381:5;50378:35;50368:63;;50427:1;50424;50417:12;50368:63;50315:122;:::o
Swarm Source
ipfs://5c38a4430e8a1b0bc7a1e1d2d7fdaa400c9b636e6781d6ad4ffcc87748f2cca1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.