Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
6,969 fmfers
Holders
1,427
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 fmfersLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
fmfers
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-12 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // 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; } } // File: @openzeppelin/contracts/utils/Context.sol // 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; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: contracts/fmfers.sol pragma solidity ^0.8.0; contract fmfers is ERC721A, Ownable, ReentrancyGuard { string public baseURI; string public endPoint = ".json"; string public hiddenMetadataUri = "ipfs://Qmf1PfN8dfEJcH7PjkugsC48KK51ZY6MoNP5V4KXyrt6Mg/hidden.json"; bool public revealed = false; uint256 public price = 0 ether; uint256 public maxPerTx = 5; uint256 public maxPerWallet = 5; uint256 public maxSupply = 6969; constructor() ERC721A("fmfers", "fmfers") {} function toggleRevealed() external onlyOwner { revealed = !revealed; } function setBaseURI(string calldata baseURI_) external onlyOwner { baseURI = baseURI_; } function mint(uint256 amount) external payable { require(msg.sender == tx.origin, "You can't mint from a contract."); require(msg.value == amount * price, "Please send the exact amount in order to mint."); require(totalSupply() + amount <= maxSupply, "Sold out."); require(numberMinted(msg.sender) + amount <= maxPerWallet, "You have exceeded the mint limit per wallet."); require(amount <= maxPerTx, "You have exceeded the mint limit per transaction."); _safeMint(msg.sender, amount); } function ownerMint(uint256 amount) external onlyOwner { require(totalSupply() + amount <= maxSupply, "Can't mint"); _safeMint(msg.sender, amount); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); if (revealed == false) { return hiddenMetadataUri; } return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId), endPoint)) : ''; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function setmaxSupply(uint256 maxSupply_) external onlyOwner { maxSupply = maxSupply_; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function withdraw() external onlyOwner nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endPoint","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply_","type":"uint256"}],"name":"setmaxSupply","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":[],"name":"toggleRevealed","outputs":[],"stateMutability":"nonpayable","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b9080519060200190620000519291906200027d565b506040518060800160405280604181526020016200377460419139600c9080519060200190620000839291906200027d565b506000600d60006101000a81548160ff0219169083151502179055506000600e556005600f556005601055611b39601155348015620000c157600080fd5b506040518060400160405280600681526020017f666d6665727300000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f666d6665727300000000000000000000000000000000000000000000000000008152508160029080519060200190620001469291906200027d565b5080600390805190602001906200015f9291906200027d565b5062000170620001a660201b60201c565b6000819055505050620001986200018c620001af60201b60201c565b620001b760201b60201c565b600160098190555062000392565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200028b906200032d565b90600052602060002090601f016020900481019282620002af5760008555620002fb565b82601f10620002ca57805160ff1916838001178555620002fb565b82800160010185558215620002fb579182015b82811115620002fa578251825591602001919060010190620002dd565b5b5090506200030a91906200030e565b5090565b5b80821115620003295760008160009055506001016200030f565b5090565b600060028204905060018216806200034657607f821691505b602082108114156200035d576200035c62000363565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6133d280620003a26000396000f3fe6080604052600436106101e35760003560e01c8063715018a611610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c5146106af578063f19e75d4146106ec578063f2fde38b14610715578063f968adbe1461073e576101e3565b8063b88d4fde146105e1578063c87b56dd1461060a578063d5abeb0114610647578063dc33e68114610672576101e3565b8063a035b1fe116100d1578063a035b1fe14610546578063a0712d6814610571578063a22cb4651461058d578063a45ba8e7146105b6576101e3565b8063715018a6146104ae5780638da5cb5b146104c557806395d89b41146104f057806399e51e1c1461051b576101e3565b806342842e0e1161017a5780635bc020bc116101495780635bc020bc146103f25780636352211e146104095780636c0360eb1461044657806370a0823114610471576101e3565b806342842e0e1461034a578063453c231014610373578063518302271461039e57806355f804b3146103c9576101e3565b806318160ddd116101b657806318160ddd146102b6578063228025e8146102e157806323b872dd1461030a5780633ccfd60b14610333576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906127e4565b610769565b60405161021c9190612c35565b60405180910390f35b34801561023157600080fd5b5061023a6107fb565b6040516102479190612c50565b60405180910390f35b34801561025c57600080fd5b506102776004803603810190610272919061288b565b61088d565b6040516102849190612bce565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af91906127a4565b610909565b005b3480156102c257600080fd5b506102cb610ab0565b6040516102d89190612db2565b60405180910390f35b3480156102ed57600080fd5b506103086004803603810190610303919061288b565b610ac7565b005b34801561031657600080fd5b50610331600480360381019061032c919061268e565b610b4d565b005b34801561033f57600080fd5b50610348610b5d565b005b34801561035657600080fd5b50610371600480360381019061036c919061268e565b610cde565b005b34801561037f57600080fd5b50610388610cfe565b6040516103959190612db2565b60405180910390f35b3480156103aa57600080fd5b506103b3610d04565b6040516103c09190612c35565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb919061283e565b610d17565b005b3480156103fe57600080fd5b50610407610da9565b005b34801561041557600080fd5b50610430600480360381019061042b919061288b565b610e51565b60405161043d9190612bce565b60405180910390f35b34801561045257600080fd5b5061045b610e63565b6040516104689190612c50565b60405180910390f35b34801561047d57600080fd5b5061049860048036038101906104939190612621565b610ef1565b6040516104a59190612db2565b60405180910390f35b3480156104ba57600080fd5b506104c3610faa565b005b3480156104d157600080fd5b506104da611032565b6040516104e79190612bce565b60405180910390f35b3480156104fc57600080fd5b5061050561105c565b6040516105129190612c50565b60405180910390f35b34801561052757600080fd5b506105306110ee565b60405161053d9190612c50565b60405180910390f35b34801561055257600080fd5b5061055b61117c565b6040516105689190612db2565b60405180910390f35b61058b6004803603810190610586919061288b565b611182565b005b34801561059957600080fd5b506105b460048036038101906105af9190612764565b611340565b005b3480156105c257600080fd5b506105cb6114b8565b6040516105d89190612c50565b60405180910390f35b3480156105ed57600080fd5b50610608600480360381019061060391906126e1565b611546565b005b34801561061657600080fd5b50610631600480360381019061062c919061288b565b6115b9565b60405161063e9190612c50565b60405180910390f35b34801561065357600080fd5b5061065c61170b565b6040516106699190612db2565b60405180910390f35b34801561067e57600080fd5b5061069960048036038101906106949190612621565b611711565b6040516106a69190612db2565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d1919061264e565b611723565b6040516106e39190612c35565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e919061288b565b6117b7565b005b34801561072157600080fd5b5061073c60048036038101906107379190612621565b611897565b005b34801561074a57600080fd5b5061075361198f565b6040516107609190612db2565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107c457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107f45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461080a90612fec565b80601f016020809104026020016040519081016040528092919081815260200182805461083690612fec565b80156108835780601f1061085857610100808354040283529160200191610883565b820191906000526020600020905b81548152906001019060200180831161086657829003601f168201915b5050505050905090565b600061089882611995565b6108ce576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610914826119f4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561097c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661099b611ac2565b73ffffffffffffffffffffffffffffffffffffffff16146109fe576109c7816109c2611ac2565b611723565b6109fd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610aba611aca565b6001546000540303905090565b610acf611ad3565b73ffffffffffffffffffffffffffffffffffffffff16610aed611032565b73ffffffffffffffffffffffffffffffffffffffff1614610b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3a90612cd2565b60405180910390fd5b8060118190555050565b610b58838383611adb565b505050565b610b65611ad3565b73ffffffffffffffffffffffffffffffffffffffff16610b83611032565b73ffffffffffffffffffffffffffffffffffffffff1614610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090612cd2565b60405180910390fd5b60026009541415610c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1690612d72565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610c4d90612bb9565b60006040518083038185875af1925050503d8060008114610c8a576040519150601f19603f3d011682016040523d82523d6000602084013e610c8f565b606091505b5050905080610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca90612d12565b60405180910390fd5b506001600981905550565b610cf983838360405180602001604052806000815250611546565b505050565b60105481565b600d60009054906101000a900460ff1681565b610d1f611ad3565b73ffffffffffffffffffffffffffffffffffffffff16610d3d611032565b73ffffffffffffffffffffffffffffffffffffffff1614610d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a90612cd2565b60405180910390fd5b8181600a9190610da492919061244f565b505050565b610db1611ad3565b73ffffffffffffffffffffffffffffffffffffffff16610dcf611032565b73ffffffffffffffffffffffffffffffffffffffff1614610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c90612cd2565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6000610e5c826119f4565b9050919050565b600a8054610e7090612fec565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9c90612fec565b8015610ee95780601f10610ebe57610100808354040283529160200191610ee9565b820191906000526020600020905b815481529060010190602001808311610ecc57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f59576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610fb2611ad3565b73ffffffffffffffffffffffffffffffffffffffff16610fd0611032565b73ffffffffffffffffffffffffffffffffffffffff1614611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d90612cd2565b60405180910390fd5b6110306000611e85565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461106b90612fec565b80601f016020809104026020016040519081016040528092919081815260200182805461109790612fec565b80156110e45780601f106110b9576101008083540402835291602001916110e4565b820191906000526020600020905b8154815290600101906020018083116110c757829003601f168201915b5050505050905090565b600b80546110fb90612fec565b80601f016020809104026020016040519081016040528092919081815260200182805461112790612fec565b80156111745780601f1061114957610100808354040283529160200191611174565b820191906000526020600020905b81548152906001019060200180831161115757829003601f168201915b505050505081565b600e5481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790612d52565b60405180910390fd5b600e54816111fe9190612edc565b341461123f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123690612cb2565b60405180910390fd5b6011548161124b610ab0565b6112559190612e86565b1115611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90612d32565b60405180910390fd5b601054816112a333611711565b6112ad9190612e86565b11156112ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e590612cf2565b60405180910390fd5b600f54811115611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a90612d92565b60405180910390fd5b61133d3382611f4b565b50565b611348611ac2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113ad576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006113ba611ac2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611467611ac2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114ac9190612c35565b60405180910390a35050565b600c80546114c590612fec565b80601f01602080910402602001604051908101604052809291908181526020018280546114f190612fec565b801561153e5780601f106115135761010080835404028352916020019161153e565b820191906000526020600020905b81548152906001019060200180831161152157829003601f168201915b505050505081565b611551848484611adb565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115b35761157c84848484611f69565b6115b2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606115c482611995565b6115fa576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600d60009054906101000a900460ff16151514156116a857600c805461162390612fec565b80601f016020809104026020016040519081016040528092919081815260200182805461164f90612fec565b801561169c5780601f106116715761010080835404028352916020019161169c565b820191906000526020600020905b81548152906001019060200180831161167f57829003601f168201915b50505050509050611706565b6000600a80546116b790612fec565b905014156116d45760405180602001604052806000815250611703565b600a6116df836120c9565b600b6040516020016116f393929190612b88565b6040516020818303038152906040525b90505b919050565b60115481565b600061171c82612123565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117bf611ad3565b73ffffffffffffffffffffffffffffffffffffffff166117dd611032565b73ffffffffffffffffffffffffffffffffffffffff1614611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182a90612cd2565b60405180910390fd5b6011548161183f610ab0565b6118499190612e86565b111561188a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188190612c72565b60405180910390fd5b6118943382611f4b565b50565b61189f611ad3565b73ffffffffffffffffffffffffffffffffffffffff166118bd611032565b73ffffffffffffffffffffffffffffffffffffffff1614611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a90612cd2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a90612c92565b60405180910390fd5b61198c81611e85565b50565b600f5481565b6000816119a0611aca565b111580156119af575060005482105b80156119ed575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611a03611aca565b11611a8b57600054811015611a8a5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611a88575b6000811415611a7e576004600083600190039350838152602001908152602001600020549050611a53565b8092505050611abd565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b600033905090565b6000611ae6826119f4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b4d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611b6e611ac2565b73ffffffffffffffffffffffffffffffffffffffff161480611b9d5750611b9c85611b97611ac2565b611723565b5b80611be25750611bab611ac2565b73ffffffffffffffffffffffffffffffffffffffff16611bca8461088d565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611c1b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611c82576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c8f858585600161217a565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611d8c86612180565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611e16576000600184019050600060046000838152602001908152602001600020541415611e14576000548114611e13578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e7e858585600161218a565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f65828260405180602001604052806000815250612190565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f8f611ac2565b8786866040518563ffffffff1660e01b8152600401611fb19493929190612be9565b602060405180830381600087803b158015611fcb57600080fd5b505af1925050508015611ffc57506040513d601f19601f82011682018060405250810190611ff99190612811565b60015b612076573d806000811461202c576040519150601f19603f3d011682016040523d82523d6000602084013e612031565b606091505b5060008151141561206e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561210f57600183039250600a81066030018353600a810490506120ef565b508181036020830392508083525050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121fd576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612238576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612245600085838661217a565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16122aa60018514612445565b901b60a042901b6122ba86612180565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146123be575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461236e6000878480600101955087611f69565b6123a4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106122ff5782600054146123b957600080fd5b612429565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106123bf575b81600081905550505061243f600085838661218a565b50505050565b6000819050919050565b82805461245b90612fec565b90600052602060002090601f01602090048101928261247d57600085556124c4565b82601f1061249657803560ff19168380011785556124c4565b828001600101855582156124c4579182015b828111156124c35782358255916020019190600101906124a8565b5b5090506124d191906124d5565b5090565b5b808211156124ee5760008160009055506001016124d6565b5090565b600061250561250084612df2565b612dcd565b905082815260208101848484011115612521576125206130eb565b5b61252c848285612faa565b509392505050565b60008135905061254381613340565b92915050565b60008135905061255881613357565b92915050565b60008135905061256d8161336e565b92915050565b6000815190506125828161336e565b92915050565b600082601f83011261259d5761259c6130e1565b5b81356125ad8482602086016124f2565b91505092915050565b60008083601f8401126125cc576125cb6130e1565b5b8235905067ffffffffffffffff8111156125e9576125e86130dc565b5b602083019150836001820283011115612605576126046130e6565b5b9250929050565b60008135905061261b81613385565b92915050565b600060208284031215612637576126366130f5565b5b600061264584828501612534565b91505092915050565b60008060408385031215612665576126646130f5565b5b600061267385828601612534565b925050602061268485828601612534565b9150509250929050565b6000806000606084860312156126a7576126a66130f5565b5b60006126b586828701612534565b93505060206126c686828701612534565b92505060406126d78682870161260c565b9150509250925092565b600080600080608085870312156126fb576126fa6130f5565b5b600061270987828801612534565b945050602061271a87828801612534565b935050604061272b8782880161260c565b925050606085013567ffffffffffffffff81111561274c5761274b6130f0565b5b61275887828801612588565b91505092959194509250565b6000806040838503121561277b5761277a6130f5565b5b600061278985828601612534565b925050602061279a85828601612549565b9150509250929050565b600080604083850312156127bb576127ba6130f5565b5b60006127c985828601612534565b92505060206127da8582860161260c565b9150509250929050565b6000602082840312156127fa576127f96130f5565b5b60006128088482850161255e565b91505092915050565b600060208284031215612827576128266130f5565b5b600061283584828501612573565b91505092915050565b60008060208385031215612855576128546130f5565b5b600083013567ffffffffffffffff811115612873576128726130f0565b5b61287f858286016125b6565b92509250509250929050565b6000602082840312156128a1576128a06130f5565b5b60006128af8482850161260c565b91505092915050565b6128c181612f36565b82525050565b6128d081612f48565b82525050565b60006128e182612e38565b6128eb8185612e4e565b93506128fb818560208601612fb9565b612904816130fa565b840191505092915050565b600061291a82612e43565b6129248185612e6a565b9350612934818560208601612fb9565b61293d816130fa565b840191505092915050565b600061295382612e43565b61295d8185612e7b565b935061296d818560208601612fb9565b80840191505092915050565b6000815461298681612fec565b6129908186612e7b565b945060018216600081146129ab57600181146129bc576129ef565b60ff198316865281860193506129ef565b6129c585612e23565b60005b838110156129e7578154818901526001820191506020810190506129c8565b838801955050505b50505092915050565b6000612a05600a83612e6a565b9150612a108261310b565b602082019050919050565b6000612a28602683612e6a565b9150612a3382613134565b604082019050919050565b6000612a4b602e83612e6a565b9150612a5682613183565b604082019050919050565b6000612a6e602083612e6a565b9150612a79826131d2565b602082019050919050565b6000612a91602c83612e6a565b9150612a9c826131fb565b604082019050919050565b6000612ab4600083612e5f565b9150612abf8261324a565b600082019050919050565b6000612ad7601083612e6a565b9150612ae28261324d565b602082019050919050565b6000612afa600983612e6a565b9150612b0582613276565b602082019050919050565b6000612b1d601f83612e6a565b9150612b288261329f565b602082019050919050565b6000612b40601f83612e6a565b9150612b4b826132c8565b602082019050919050565b6000612b63603183612e6a565b9150612b6e826132f1565b604082019050919050565b612b8281612fa0565b82525050565b6000612b948286612979565b9150612ba08285612948565b9150612bac8284612979565b9150819050949350505050565b6000612bc482612aa7565b9150819050919050565b6000602082019050612be360008301846128b8565b92915050565b6000608082019050612bfe60008301876128b8565b612c0b60208301866128b8565b612c186040830185612b79565b8181036060830152612c2a81846128d6565b905095945050505050565b6000602082019050612c4a60008301846128c7565b92915050565b60006020820190508181036000830152612c6a818461290f565b905092915050565b60006020820190508181036000830152612c8b816129f8565b9050919050565b60006020820190508181036000830152612cab81612a1b565b9050919050565b60006020820190508181036000830152612ccb81612a3e565b9050919050565b60006020820190508181036000830152612ceb81612a61565b9050919050565b60006020820190508181036000830152612d0b81612a84565b9050919050565b60006020820190508181036000830152612d2b81612aca565b9050919050565b60006020820190508181036000830152612d4b81612aed565b9050919050565b60006020820190508181036000830152612d6b81612b10565b9050919050565b60006020820190508181036000830152612d8b81612b33565b9050919050565b60006020820190508181036000830152612dab81612b56565b9050919050565b6000602082019050612dc76000830184612b79565b92915050565b6000612dd7612de8565b9050612de3828261301e565b919050565b6000604051905090565b600067ffffffffffffffff821115612e0d57612e0c6130ad565b5b612e16826130fa565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612e9182612fa0565b9150612e9c83612fa0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ed157612ed061304f565b5b828201905092915050565b6000612ee782612fa0565b9150612ef283612fa0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f2b57612f2a61304f565b5b828202905092915050565b6000612f4182612f80565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612fd7578082015181840152602081019050612fbc565b83811115612fe6576000848401525b50505050565b6000600282049050600182168061300457607f821691505b602082108114156130185761301761307e565b5b50919050565b613027826130fa565b810181811067ffffffffffffffff82111715613046576130456130ad565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f43616e2774206d696e7400000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f506c656173652073656e642074686520657861637420616d6f756e7420696e2060008201527f6f7264657220746f206d696e742e000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f596f75206861766520657863656564656420746865206d696e74206c696d697460008201527f207065722077616c6c65742e0000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f536f6c64206f75742e0000000000000000000000000000000000000000000000600082015250565b7f596f752063616e2774206d696e742066726f6d206120636f6e74726163742e00600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f596f75206861766520657863656564656420746865206d696e74206c696d697460008201527f20706572207472616e73616374696f6e2e000000000000000000000000000000602082015250565b61334981612f36565b811461335457600080fd5b50565b61336081612f48565b811461336b57600080fd5b50565b61337781612f54565b811461338257600080fd5b50565b61338e81612fa0565b811461339957600080fd5b5056fea26469706673582212202a2ff68baf0cc05ef4e7b3fab25fe2992c89fa592913a1ecc3156f0c043efea564736f6c63430008070033697066733a2f2f516d663150664e386466454a634837506a6b7567734334384b4b35315a59364d6f4e503556344b58797274364d672f68696464656e2e6a736f6e
Deployed Bytecode
0x6080604052600436106101e35760003560e01c8063715018a611610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c5146106af578063f19e75d4146106ec578063f2fde38b14610715578063f968adbe1461073e576101e3565b8063b88d4fde146105e1578063c87b56dd1461060a578063d5abeb0114610647578063dc33e68114610672576101e3565b8063a035b1fe116100d1578063a035b1fe14610546578063a0712d6814610571578063a22cb4651461058d578063a45ba8e7146105b6576101e3565b8063715018a6146104ae5780638da5cb5b146104c557806395d89b41146104f057806399e51e1c1461051b576101e3565b806342842e0e1161017a5780635bc020bc116101495780635bc020bc146103f25780636352211e146104095780636c0360eb1461044657806370a0823114610471576101e3565b806342842e0e1461034a578063453c231014610373578063518302271461039e57806355f804b3146103c9576101e3565b806318160ddd116101b657806318160ddd146102b6578063228025e8146102e157806323b872dd1461030a5780633ccfd60b14610333576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906127e4565b610769565b60405161021c9190612c35565b60405180910390f35b34801561023157600080fd5b5061023a6107fb565b6040516102479190612c50565b60405180910390f35b34801561025c57600080fd5b506102776004803603810190610272919061288b565b61088d565b6040516102849190612bce565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af91906127a4565b610909565b005b3480156102c257600080fd5b506102cb610ab0565b6040516102d89190612db2565b60405180910390f35b3480156102ed57600080fd5b506103086004803603810190610303919061288b565b610ac7565b005b34801561031657600080fd5b50610331600480360381019061032c919061268e565b610b4d565b005b34801561033f57600080fd5b50610348610b5d565b005b34801561035657600080fd5b50610371600480360381019061036c919061268e565b610cde565b005b34801561037f57600080fd5b50610388610cfe565b6040516103959190612db2565b60405180910390f35b3480156103aa57600080fd5b506103b3610d04565b6040516103c09190612c35565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb919061283e565b610d17565b005b3480156103fe57600080fd5b50610407610da9565b005b34801561041557600080fd5b50610430600480360381019061042b919061288b565b610e51565b60405161043d9190612bce565b60405180910390f35b34801561045257600080fd5b5061045b610e63565b6040516104689190612c50565b60405180910390f35b34801561047d57600080fd5b5061049860048036038101906104939190612621565b610ef1565b6040516104a59190612db2565b60405180910390f35b3480156104ba57600080fd5b506104c3610faa565b005b3480156104d157600080fd5b506104da611032565b6040516104e79190612bce565b60405180910390f35b3480156104fc57600080fd5b5061050561105c565b6040516105129190612c50565b60405180910390f35b34801561052757600080fd5b506105306110ee565b60405161053d9190612c50565b60405180910390f35b34801561055257600080fd5b5061055b61117c565b6040516105689190612db2565b60405180910390f35b61058b6004803603810190610586919061288b565b611182565b005b34801561059957600080fd5b506105b460048036038101906105af9190612764565b611340565b005b3480156105c257600080fd5b506105cb6114b8565b6040516105d89190612c50565b60405180910390f35b3480156105ed57600080fd5b50610608600480360381019061060391906126e1565b611546565b005b34801561061657600080fd5b50610631600480360381019061062c919061288b565b6115b9565b60405161063e9190612c50565b60405180910390f35b34801561065357600080fd5b5061065c61170b565b6040516106699190612db2565b60405180910390f35b34801561067e57600080fd5b5061069960048036038101906106949190612621565b611711565b6040516106a69190612db2565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d1919061264e565b611723565b6040516106e39190612c35565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e919061288b565b6117b7565b005b34801561072157600080fd5b5061073c60048036038101906107379190612621565b611897565b005b34801561074a57600080fd5b5061075361198f565b6040516107609190612db2565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107c457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107f45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461080a90612fec565b80601f016020809104026020016040519081016040528092919081815260200182805461083690612fec565b80156108835780601f1061085857610100808354040283529160200191610883565b820191906000526020600020905b81548152906001019060200180831161086657829003601f168201915b5050505050905090565b600061089882611995565b6108ce576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610914826119f4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561097c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661099b611ac2565b73ffffffffffffffffffffffffffffffffffffffff16146109fe576109c7816109c2611ac2565b611723565b6109fd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610aba611aca565b6001546000540303905090565b610acf611ad3565b73ffffffffffffffffffffffffffffffffffffffff16610aed611032565b73ffffffffffffffffffffffffffffffffffffffff1614610b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3a90612cd2565b60405180910390fd5b8060118190555050565b610b58838383611adb565b505050565b610b65611ad3565b73ffffffffffffffffffffffffffffffffffffffff16610b83611032565b73ffffffffffffffffffffffffffffffffffffffff1614610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090612cd2565b60405180910390fd5b60026009541415610c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1690612d72565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610c4d90612bb9565b60006040518083038185875af1925050503d8060008114610c8a576040519150601f19603f3d011682016040523d82523d6000602084013e610c8f565b606091505b5050905080610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca90612d12565b60405180910390fd5b506001600981905550565b610cf983838360405180602001604052806000815250611546565b505050565b60105481565b600d60009054906101000a900460ff1681565b610d1f611ad3565b73ffffffffffffffffffffffffffffffffffffffff16610d3d611032565b73ffffffffffffffffffffffffffffffffffffffff1614610d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a90612cd2565b60405180910390fd5b8181600a9190610da492919061244f565b505050565b610db1611ad3565b73ffffffffffffffffffffffffffffffffffffffff16610dcf611032565b73ffffffffffffffffffffffffffffffffffffffff1614610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c90612cd2565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6000610e5c826119f4565b9050919050565b600a8054610e7090612fec565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9c90612fec565b8015610ee95780601f10610ebe57610100808354040283529160200191610ee9565b820191906000526020600020905b815481529060010190602001808311610ecc57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f59576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610fb2611ad3565b73ffffffffffffffffffffffffffffffffffffffff16610fd0611032565b73ffffffffffffffffffffffffffffffffffffffff1614611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d90612cd2565b60405180910390fd5b6110306000611e85565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461106b90612fec565b80601f016020809104026020016040519081016040528092919081815260200182805461109790612fec565b80156110e45780601f106110b9576101008083540402835291602001916110e4565b820191906000526020600020905b8154815290600101906020018083116110c757829003601f168201915b5050505050905090565b600b80546110fb90612fec565b80601f016020809104026020016040519081016040528092919081815260200182805461112790612fec565b80156111745780601f1061114957610100808354040283529160200191611174565b820191906000526020600020905b81548152906001019060200180831161115757829003601f168201915b505050505081565b600e5481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790612d52565b60405180910390fd5b600e54816111fe9190612edc565b341461123f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123690612cb2565b60405180910390fd5b6011548161124b610ab0565b6112559190612e86565b1115611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90612d32565b60405180910390fd5b601054816112a333611711565b6112ad9190612e86565b11156112ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e590612cf2565b60405180910390fd5b600f54811115611333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132a90612d92565b60405180910390fd5b61133d3382611f4b565b50565b611348611ac2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113ad576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006113ba611ac2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611467611ac2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114ac9190612c35565b60405180910390a35050565b600c80546114c590612fec565b80601f01602080910402602001604051908101604052809291908181526020018280546114f190612fec565b801561153e5780601f106115135761010080835404028352916020019161153e565b820191906000526020600020905b81548152906001019060200180831161152157829003601f168201915b505050505081565b611551848484611adb565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115b35761157c84848484611f69565b6115b2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606115c482611995565b6115fa576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600d60009054906101000a900460ff16151514156116a857600c805461162390612fec565b80601f016020809104026020016040519081016040528092919081815260200182805461164f90612fec565b801561169c5780601f106116715761010080835404028352916020019161169c565b820191906000526020600020905b81548152906001019060200180831161167f57829003601f168201915b50505050509050611706565b6000600a80546116b790612fec565b905014156116d45760405180602001604052806000815250611703565b600a6116df836120c9565b600b6040516020016116f393929190612b88565b6040516020818303038152906040525b90505b919050565b60115481565b600061171c82612123565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117bf611ad3565b73ffffffffffffffffffffffffffffffffffffffff166117dd611032565b73ffffffffffffffffffffffffffffffffffffffff1614611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182a90612cd2565b60405180910390fd5b6011548161183f610ab0565b6118499190612e86565b111561188a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188190612c72565b60405180910390fd5b6118943382611f4b565b50565b61189f611ad3565b73ffffffffffffffffffffffffffffffffffffffff166118bd611032565b73ffffffffffffffffffffffffffffffffffffffff1614611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a90612cd2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a90612c92565b60405180910390fd5b61198c81611e85565b50565b600f5481565b6000816119a0611aca565b111580156119af575060005482105b80156119ed575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611a03611aca565b11611a8b57600054811015611a8a5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611a88575b6000811415611a7e576004600083600190039350838152602001908152602001600020549050611a53565b8092505050611abd565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b600033905090565b6000611ae6826119f4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b4d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611b6e611ac2565b73ffffffffffffffffffffffffffffffffffffffff161480611b9d5750611b9c85611b97611ac2565b611723565b5b80611be25750611bab611ac2565b73ffffffffffffffffffffffffffffffffffffffff16611bca8461088d565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611c1b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611c82576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c8f858585600161217a565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611d8c86612180565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611e16576000600184019050600060046000838152602001908152602001600020541415611e14576000548114611e13578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e7e858585600161218a565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f65828260405180602001604052806000815250612190565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f8f611ac2565b8786866040518563ffffffff1660e01b8152600401611fb19493929190612be9565b602060405180830381600087803b158015611fcb57600080fd5b505af1925050508015611ffc57506040513d601f19601f82011682018060405250810190611ff99190612811565b60015b612076573d806000811461202c576040519150601f19603f3d011682016040523d82523d6000602084013e612031565b606091505b5060008151141561206e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561210f57600183039250600a81066030018353600a810490506120ef565b508181036020830392508083525050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121fd576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612238576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612245600085838661217a565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16122aa60018514612445565b901b60a042901b6122ba86612180565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146123be575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461236e6000878480600101955087611f69565b6123a4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106122ff5782600054146123b957600080fd5b612429565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106123bf575b81600081905550505061243f600085838661218a565b50505050565b6000819050919050565b82805461245b90612fec565b90600052602060002090601f01602090048101928261247d57600085556124c4565b82601f1061249657803560ff19168380011785556124c4565b828001600101855582156124c4579182015b828111156124c35782358255916020019190600101906124a8565b5b5090506124d191906124d5565b5090565b5b808211156124ee5760008160009055506001016124d6565b5090565b600061250561250084612df2565b612dcd565b905082815260208101848484011115612521576125206130eb565b5b61252c848285612faa565b509392505050565b60008135905061254381613340565b92915050565b60008135905061255881613357565b92915050565b60008135905061256d8161336e565b92915050565b6000815190506125828161336e565b92915050565b600082601f83011261259d5761259c6130e1565b5b81356125ad8482602086016124f2565b91505092915050565b60008083601f8401126125cc576125cb6130e1565b5b8235905067ffffffffffffffff8111156125e9576125e86130dc565b5b602083019150836001820283011115612605576126046130e6565b5b9250929050565b60008135905061261b81613385565b92915050565b600060208284031215612637576126366130f5565b5b600061264584828501612534565b91505092915050565b60008060408385031215612665576126646130f5565b5b600061267385828601612534565b925050602061268485828601612534565b9150509250929050565b6000806000606084860312156126a7576126a66130f5565b5b60006126b586828701612534565b93505060206126c686828701612534565b92505060406126d78682870161260c565b9150509250925092565b600080600080608085870312156126fb576126fa6130f5565b5b600061270987828801612534565b945050602061271a87828801612534565b935050604061272b8782880161260c565b925050606085013567ffffffffffffffff81111561274c5761274b6130f0565b5b61275887828801612588565b91505092959194509250565b6000806040838503121561277b5761277a6130f5565b5b600061278985828601612534565b925050602061279a85828601612549565b9150509250929050565b600080604083850312156127bb576127ba6130f5565b5b60006127c985828601612534565b92505060206127da8582860161260c565b9150509250929050565b6000602082840312156127fa576127f96130f5565b5b60006128088482850161255e565b91505092915050565b600060208284031215612827576128266130f5565b5b600061283584828501612573565b91505092915050565b60008060208385031215612855576128546130f5565b5b600083013567ffffffffffffffff811115612873576128726130f0565b5b61287f858286016125b6565b92509250509250929050565b6000602082840312156128a1576128a06130f5565b5b60006128af8482850161260c565b91505092915050565b6128c181612f36565b82525050565b6128d081612f48565b82525050565b60006128e182612e38565b6128eb8185612e4e565b93506128fb818560208601612fb9565b612904816130fa565b840191505092915050565b600061291a82612e43565b6129248185612e6a565b9350612934818560208601612fb9565b61293d816130fa565b840191505092915050565b600061295382612e43565b61295d8185612e7b565b935061296d818560208601612fb9565b80840191505092915050565b6000815461298681612fec565b6129908186612e7b565b945060018216600081146129ab57600181146129bc576129ef565b60ff198316865281860193506129ef565b6129c585612e23565b60005b838110156129e7578154818901526001820191506020810190506129c8565b838801955050505b50505092915050565b6000612a05600a83612e6a565b9150612a108261310b565b602082019050919050565b6000612a28602683612e6a565b9150612a3382613134565b604082019050919050565b6000612a4b602e83612e6a565b9150612a5682613183565b604082019050919050565b6000612a6e602083612e6a565b9150612a79826131d2565b602082019050919050565b6000612a91602c83612e6a565b9150612a9c826131fb565b604082019050919050565b6000612ab4600083612e5f565b9150612abf8261324a565b600082019050919050565b6000612ad7601083612e6a565b9150612ae28261324d565b602082019050919050565b6000612afa600983612e6a565b9150612b0582613276565b602082019050919050565b6000612b1d601f83612e6a565b9150612b288261329f565b602082019050919050565b6000612b40601f83612e6a565b9150612b4b826132c8565b602082019050919050565b6000612b63603183612e6a565b9150612b6e826132f1565b604082019050919050565b612b8281612fa0565b82525050565b6000612b948286612979565b9150612ba08285612948565b9150612bac8284612979565b9150819050949350505050565b6000612bc482612aa7565b9150819050919050565b6000602082019050612be360008301846128b8565b92915050565b6000608082019050612bfe60008301876128b8565b612c0b60208301866128b8565b612c186040830185612b79565b8181036060830152612c2a81846128d6565b905095945050505050565b6000602082019050612c4a60008301846128c7565b92915050565b60006020820190508181036000830152612c6a818461290f565b905092915050565b60006020820190508181036000830152612c8b816129f8565b9050919050565b60006020820190508181036000830152612cab81612a1b565b9050919050565b60006020820190508181036000830152612ccb81612a3e565b9050919050565b60006020820190508181036000830152612ceb81612a61565b9050919050565b60006020820190508181036000830152612d0b81612a84565b9050919050565b60006020820190508181036000830152612d2b81612aca565b9050919050565b60006020820190508181036000830152612d4b81612aed565b9050919050565b60006020820190508181036000830152612d6b81612b10565b9050919050565b60006020820190508181036000830152612d8b81612b33565b9050919050565b60006020820190508181036000830152612dab81612b56565b9050919050565b6000602082019050612dc76000830184612b79565b92915050565b6000612dd7612de8565b9050612de3828261301e565b919050565b6000604051905090565b600067ffffffffffffffff821115612e0d57612e0c6130ad565b5b612e16826130fa565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612e9182612fa0565b9150612e9c83612fa0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ed157612ed061304f565b5b828201905092915050565b6000612ee782612fa0565b9150612ef283612fa0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f2b57612f2a61304f565b5b828202905092915050565b6000612f4182612f80565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612fd7578082015181840152602081019050612fbc565b83811115612fe6576000848401525b50505050565b6000600282049050600182168061300457607f821691505b602082108114156130185761301761307e565b5b50919050565b613027826130fa565b810181811067ffffffffffffffff82111715613046576130456130ad565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f43616e2774206d696e7400000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f506c656173652073656e642074686520657861637420616d6f756e7420696e2060008201527f6f7264657220746f206d696e742e000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f596f75206861766520657863656564656420746865206d696e74206c696d697460008201527f207065722077616c6c65742e0000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f536f6c64206f75742e0000000000000000000000000000000000000000000000600082015250565b7f596f752063616e2774206d696e742066726f6d206120636f6e74726163742e00600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f596f75206861766520657863656564656420746865206d696e74206c696d697460008201527f20706572207472616e73616374696f6e2e000000000000000000000000000000602082015250565b61334981612f36565b811461335457600080fd5b50565b61336081612f48565b811461336b57600080fd5b50565b61337781612f54565b811461338257600080fd5b50565b61338e81612fa0565b811461339957600080fd5b5056fea26469706673582212202a2ff68baf0cc05ef4e7b3fab25fe2992c89fa592913a1ecc3156f0c043efea564736f6c63430008070033
Deployed Bytecode Sourcemap
44628:2439:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19290:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24303:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26371:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25831:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18344:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46658:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27257:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46878:186;;;;;;;;;;;;;:::i;:::-;;27498:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44971:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44863:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45204:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45108:84;;;;;;;;;;;;;:::i;:::-;;24092:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44688:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19969:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5400:103;;;;;;;;;;;;;:::i;:::-;;4749:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24472:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44716:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44900:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45314:550;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26647:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44755:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27754:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46057:363;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45009:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46537:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27026:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45872:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5658:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44937:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19290:615;19375:4;19690:10;19675:25;;:11;:25;;;;:102;;;;19767:10;19752:25;;:11;:25;;;;19675:102;:179;;;;19844:10;19829:25;;:11;:25;;;;19675:179;19655:199;;19290:615;;;:::o;24303:100::-;24357:13;24390:5;24383:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24303:100;:::o;26371:204::-;26439:7;26464:16;26472:7;26464;:16::i;:::-;26459:64;;26489:34;;;;;;;;;;;;;;26459:64;26543:15;:24;26559:7;26543:24;;;;;;;;;;;;;;;;;;;;;26536:31;;26371:204;;;:::o;25831:474::-;25904:13;25936:27;25955:7;25936:18;:27::i;:::-;25904:61;;25986:5;25980:11;;:2;:11;;;25976:48;;;26000:24;;;;;;;;;;;;;;25976:48;26064:5;26041:28;;:19;:17;:19::i;:::-;:28;;;26037:175;;26089:44;26106:5;26113:19;:17;:19::i;:::-;26089:16;:44::i;:::-;26084:128;;26161:35;;;;;;;;;;;;;;26084:128;26037:175;26251:2;26224:15;:24;26240:7;26224:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;26289:7;26285:2;26269:28;;26278:5;26269:28;;;;;;;;;;;;25893:412;25831:474;;:::o;18344:315::-;18397:7;18625:15;:13;:15::i;:::-;18610:12;;18594:13;;:28;:46;18587:53;;18344:315;:::o;46658:100::-;4980:12;:10;:12::i;:::-;4969:23;;:7;:5;:7::i;:::-;:23;;;4961:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46740:10:::1;46728:9;:22;;;;46658:100:::0;:::o;27257:170::-;27391:28;27401:4;27407:2;27411:7;27391:9;:28::i;:::-;27257:170;;;:::o;46878:186::-;4980:12;:10;:12::i;:::-;4969:23;;:7;:5;:7::i;:::-;:23;;;4961:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1847:1:::1;2445:7;;:19;;2437:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1847:1;2578:7;:18;;;;46942:12:::2;46960:10;:15;;46983:21;46960:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46941:68;;;47028:7;47020:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;46930:134;1803:1:::1;2757:7;:22;;;;46878:186::o:0;27498:185::-;27636:39;27653:4;27659:2;27663:7;27636:39;;;;;;;;;;;;:16;:39::i;:::-;27498:185;;;:::o;44971:31::-;;;;:::o;44863:28::-;;;;;;;;;;;;;:::o;45204:102::-;4980:12;:10;:12::i;:::-;4969:23;;:7;:5;:7::i;:::-;:23;;;4961:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45290:8:::1;;45280:7;:18;;;;;;;:::i;:::-;;45204:102:::0;;:::o;45108:84::-;4980:12;:10;:12::i;:::-;4969:23;;:7;:5;:7::i;:::-;:23;;;4961:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45176:8:::1;;;;;;;;;;;45175:9;45164:8;;:20;;;;;;;;;;;;;;;;;;45108:84::o:0;24092:144::-;24156:7;24199:27;24218:7;24199:18;:27::i;:::-;24176:52;;24092:144;;;:::o;44688:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19969:224::-;20033:7;20074:1;20057:19;;:5;:19;;;20053:60;;;20085:28;;;;;;;;;;;;;;20053:60;15308:13;20131:18;:25;20150:5;20131:25;;;;;;;;;;;;;;;;:54;20124:61;;19969:224;;;:::o;5400:103::-;4980:12;:10;:12::i;:::-;4969:23;;:7;:5;:7::i;:::-;:23;;;4961:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5465:30:::1;5492:1;5465:18;:30::i;:::-;5400:103::o:0;4749:87::-;4795:7;4822:6;;;;;;;;;;;4815:13;;4749:87;:::o;24472:104::-;24528:13;24561:7;24554:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24472:104;:::o;44716:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44900:30::-;;;;:::o;45314:550::-;45396:9;45382:23;;:10;:23;;;45374:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45482:5;;45473:6;:14;;;;:::i;:::-;45460:9;:27;45452:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;45583:9;;45573:6;45557:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;45549:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;45662:12;;45652:6;45625:24;45638:10;45625:12;:24::i;:::-;:33;;;;:::i;:::-;:49;;45617:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;45752:8;;45742:6;:18;;45734:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;45827:29;45837:10;45849:6;45827:9;:29::i;:::-;45314:550;:::o;26647:308::-;26758:19;:17;:19::i;:::-;26746:31;;:8;:31;;;26742:61;;;26786:17;;;;;;;;;;;;;;26742:61;26868:8;26816:18;:39;26835:19;:17;:19::i;:::-;26816:39;;;;;;;;;;;;;;;:49;26856:8;26816:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26928:8;26892:55;;26907:19;:17;:19::i;:::-;26892:55;;;26938:8;26892:55;;;;;;:::i;:::-;;;;;;;;26647:308;;:::o;44755:101::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27754:396::-;27921:28;27931:4;27937:2;27941:7;27921:9;:28::i;:::-;27982:1;27964:2;:14;;;:19;27960:183;;28003:56;28034:4;28040:2;28044:7;28053:5;28003:30;:56::i;:::-;27998:145;;28087:40;;;;;;;;;;;;;;27998:145;27960:183;27754:396;;;;:::o;46057:363::-;46130:13;46161:16;46169:7;46161;:16::i;:::-;46156:59;;46186:29;;;;;;;;;;;;;;46156:59;46242:5;46230:17;;:8;;;;;;;;;;;:17;;;46226:70;;;46267:17;46260:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46226:70;46340:1;46321:7;46315:21;;;;;:::i;:::-;;;:26;;:97;;;;;;;;;;;;;;;;;46368:7;46377:18;46387:7;46377:9;:18::i;:::-;46397:8;46351:55;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46315:97;46308:104;;46057:363;;;;:::o;45009:31::-;;;;:::o;46537:113::-;46595:7;46622:20;46636:5;46622:13;:20::i;:::-;46615:27;;46537:113;;;:::o;27026:164::-;27123:4;27147:18;:25;27166:5;27147:25;;;;;;;;;;;;;;;:35;27173:8;27147:35;;;;;;;;;;;;;;;;;;;;;;;;;27140:42;;27026:164;;;;:::o;45872:173::-;4980:12;:10;:12::i;:::-;4969:23;;:7;:5;:7::i;:::-;:23;;;4961:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45971:9:::1;;45961:6;45945:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;45937:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46008:29;46018:10;46030:6;46008:9;:29::i;:::-;45872:173:::0;:::o;5658:201::-;4980:12;:10;:12::i;:::-;4969:23;;:7;:5;:7::i;:::-;:23;;;4961:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5767:1:::1;5747:22;;:8;:22;;;;5739:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5823:28;5842:8;5823:18;:28::i;:::-;5658:201:::0;:::o;44937:27::-;;;;:::o;28405:273::-;28462:4;28518:7;28499:15;:13;:15::i;:::-;:26;;:66;;;;;28552:13;;28542:7;:23;28499:66;:152;;;;;28650:1;16078:8;28603:17;:26;28621:7;28603:26;;;;;;;;;;;;:43;:48;28499:152;28479:172;;28405:273;;;:::o;21607:1129::-;21674:7;21694:12;21709:7;21694:22;;21777:4;21758:15;:13;:15::i;:::-;:23;21754:915;;21811:13;;21804:4;:20;21800:869;;;21849:14;21866:17;:23;21884:4;21866:23;;;;;;;;;;;;21849:40;;21982:1;16078:8;21955:6;:23;:28;21951:699;;;22474:113;22491:1;22481:6;:11;22474:113;;;22534:17;:25;22552:6;;;;;;;22534:25;;;;;;;;;;;;22525:34;;22474:113;;;22620:6;22613:13;;;;;;21951:699;21826:843;21800:869;21754:915;22697:31;;;;;;;;;;;;;;21607:1129;;;;:::o;42387:105::-;42447:7;42474:10;42467:17;;42387:105;:::o;46428:101::-;46493:7;46520:1;46513:8;;46428:101;:::o;3473:98::-;3526:7;3553:10;3546:17;;3473:98;:::o;33644:2515::-;33759:27;33789;33808:7;33789:18;:27::i;:::-;33759:57;;33874:4;33833:45;;33849:19;33833:45;;;33829:86;;33887:28;;;;;;;;;;;;;;33829:86;33928:22;33977:4;33954:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;33998:43;34015:4;34021:19;:17;:19::i;:::-;33998:16;:43::i;:::-;33954:87;:147;;;;34082:19;:17;:19::i;:::-;34058:43;;:20;34070:7;34058:11;:20::i;:::-;:43;;;33954:147;33928:174;;34120:17;34115:66;;34146:35;;;;;;;;;;;;;;34115:66;34210:1;34196:16;;:2;:16;;;34192:52;;;34221:23;;;;;;;;;;;;;;34192:52;34257:43;34279:4;34285:2;34289:7;34298:1;34257:21;:43::i;:::-;34373:15;:24;34389:7;34373:24;;;;;;;;;;;;34366:31;;;;;;;;;;;34765:18;:24;34784:4;34765:24;;;;;;;;;;;;;;;;34763:26;;;;;;;;;;;;34834:18;:22;34853:2;34834:22;;;;;;;;;;;;;;;;34832:24;;;;;;;;;;;16360:8;15962:3;35215:15;:41;;35173:21;35191:2;35173:17;:21::i;:::-;:84;:128;35127:17;:26;35145:7;35127:26;;;;;;;;;;;:174;;;;35471:1;16360:8;35421:19;:46;:51;35417:626;;;35493:19;35525:1;35515:7;:11;35493:33;;35682:1;35648:17;:30;35666:11;35648:30;;;;;;;;;;;;:35;35644:384;;;35786:13;;35771:11;:28;35767:242;;35966:19;35933:17;:30;35951:11;35933:30;;;;;;;;;;;:52;;;;35767:242;35644:384;35474:569;35417:626;36090:7;36086:2;36071:27;;36080:4;36071:27;;;;;;;;;;;;36109:42;36130:4;36136:2;36140:7;36149:1;36109:20;:42::i;:::-;33748:2411;;33644:2515;;;:::o;6019:191::-;6093:16;6112:6;;;;;;;;;;;6093:25;;6138:8;6129:6;;:17;;;;;;;;;;;;;;;;;;6193:8;6162:40;;6183:8;6162:40;;;;;;;;;;;;6082:128;6019:191;:::o;28762:104::-;28831:27;28841:2;28845:8;28831:27;;;;;;;;;;;;:9;:27::i;:::-;28762:104;;:::o;39856:716::-;40019:4;40065:2;40040:45;;;40086:19;:17;:19::i;:::-;40107:4;40113:7;40122:5;40040:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40036:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40340:1;40323:6;:13;:18;40319:235;;;40369:40;;;;;;;;;;;;;;40319:235;40512:6;40506:13;40497:6;40493:2;40489:15;40482:38;40036:529;40209:54;;;40199:64;;;:6;:64;;;;40192:71;;;39856:716;;;;;;:::o;42598:1959::-;42655:17;43076:3;43069:4;43063:11;43059:21;43052:28;;43167:3;43161:4;43154:17;43273:3;43730:5;43860:1;43855:3;43851:11;43844:18;;43997:2;43991:4;43987:13;43983:2;43979:22;43974:3;43966:36;44038:2;44032:4;44028:13;44020:21;;43621:682;44057:4;43621:682;;;44232:1;44227:3;44223:11;44216:18;;44283:2;44277:4;44273:13;44269:2;44265:22;44260:3;44252:36;44153:2;44147:4;44143:13;44135:21;;43621:682;;;43625:431;44354:3;44349;44345:13;44469:2;44464:3;44460:12;44453:19;;44532:6;44527:3;44520:19;42694:1856;;42598:1959;;;:::o;20275:176::-;20336:7;15308:13;15445:2;20364:18;:25;20383:5;20364:25;;;;;;;;;;;;;;;;:49;;20363:80;20356:87;;20275:176;;;:::o;41220:159::-;;;;;:::o;25392:148::-;25456:14;25517:5;25507:15;;25392:148;;;:::o;42038:158::-;;;;;:::o;29239:2236::-;29362:20;29385:13;;29362:36;;29427:1;29413:16;;:2;:16;;;29409:48;;;29438:19;;;;;;;;;;;;;;29409:48;29484:1;29472:8;:13;29468:44;;;29494:18;;;;;;;;;;;;;;29468:44;29525:61;29555:1;29559:2;29563:12;29577:8;29525:21;:61::i;:::-;30129:1;15445:2;30100:1;:25;;30099:31;30087:8;:44;30061:18;:22;30080:2;30061:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;16225:3;30530:29;30557:1;30545:8;:13;30530:14;:29::i;:::-;:56;;15962:3;30467:15;:41;;30425:21;30443:2;30425:17;:21::i;:::-;:84;:162;30374:17;:31;30392:12;30374:31;;;;;;;;;;;:213;;;;30604:20;30627:12;30604:35;;30654:11;30683:8;30668:12;:23;30654:37;;30730:1;30712:2;:14;;;:19;30708:635;;30752:313;30808:12;30804:2;30783:38;;30800:1;30783:38;;;;;;;;;;;;30849:69;30888:1;30892:2;30896:14;;;;;;30912:5;30849:30;:69::i;:::-;30844:174;;30954:40;;;;;;;;;;;;;;30844:174;31060:3;31045:12;:18;30752:313;;31146:12;31129:13;;:29;31125:43;;31160:8;;;31125:43;30708:635;;;31209:119;31265:14;;;;;;31261:2;31240:40;;31257:1;31240:40;;;;;;;;;;;;31323:3;31308:12;:18;31209:119;;30708:635;31373:12;31357:13;:28;;;;29838:1559;;31407:60;31436:1;31440:2;31444:12;31458:8;31407:20;:60::i;:::-;29351:2124;29239:2236;;;:::o;25627:142::-;25685:14;25746:5;25736:15;;25627:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;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:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:327::-;5473:6;5522:2;5510:9;5501:7;5497:23;5493:32;5490:119;;;5528:79;;:::i;:::-;5490:119;5648:1;5673:52;5717:7;5708:6;5697:9;5693:22;5673:52;:::i;:::-;5663:62;;5619:116;5415:327;;;;:::o;5748:349::-;5817:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:63;6072:7;6063:6;6052:9;6048:22;6017:63;:::i;:::-;6007:73;;5963:127;5748:349;;;;:::o;6103:529::-;6174:6;6182;6231:2;6219:9;6210:7;6206:23;6202:32;6199:119;;;6237:79;;:::i;:::-;6199:119;6385:1;6374:9;6370:17;6357:31;6415:18;6407:6;6404:30;6401:117;;;6437:79;;:::i;:::-;6401:117;6550:65;6607:7;6598:6;6587:9;6583:22;6550:65;:::i;:::-;6532:83;;;;6328:297;6103:529;;;;;:::o;6638:329::-;6697:6;6746:2;6734:9;6725:7;6721:23;6717:32;6714:119;;;6752:79;;:::i;:::-;6714:119;6872:1;6897:53;6942:7;6933:6;6922:9;6918:22;6897:53;:::i;:::-;6887:63;;6843:117;6638:329;;;;:::o;6973:118::-;7060:24;7078:5;7060:24;:::i;:::-;7055:3;7048:37;6973:118;;:::o;7097:109::-;7178:21;7193:5;7178:21;:::i;:::-;7173:3;7166:34;7097:109;;:::o;7212:360::-;7298:3;7326:38;7358:5;7326:38;:::i;:::-;7380:70;7443:6;7438:3;7380:70;:::i;:::-;7373:77;;7459:52;7504:6;7499:3;7492:4;7485:5;7481:16;7459:52;:::i;:::-;7536:29;7558:6;7536:29;:::i;:::-;7531:3;7527:39;7520:46;;7302:270;7212:360;;;;:::o;7578:364::-;7666:3;7694:39;7727:5;7694:39;:::i;:::-;7749:71;7813:6;7808:3;7749:71;:::i;:::-;7742:78;;7829:52;7874:6;7869:3;7862:4;7855:5;7851:16;7829:52;:::i;:::-;7906:29;7928:6;7906:29;:::i;:::-;7901:3;7897:39;7890:46;;7670:272;7578:364;;;;:::o;7948:377::-;8054:3;8082:39;8115:5;8082:39;:::i;:::-;8137:89;8219:6;8214:3;8137:89;:::i;:::-;8130:96;;8235:52;8280:6;8275:3;8268:4;8261:5;8257:16;8235:52;:::i;:::-;8312:6;8307:3;8303:16;8296:23;;8058:267;7948:377;;;;:::o;8355:845::-;8458:3;8495:5;8489:12;8524:36;8550:9;8524:36;:::i;:::-;8576:89;8658:6;8653:3;8576:89;:::i;:::-;8569:96;;8696:1;8685:9;8681:17;8712:1;8707:137;;;;8858:1;8853:341;;;;8674:520;;8707:137;8791:4;8787:9;8776;8772:25;8767:3;8760:38;8827:6;8822:3;8818:16;8811:23;;8707:137;;8853:341;8920:38;8952:5;8920:38;:::i;:::-;8980:1;8994:154;9008:6;9005:1;9002:13;8994:154;;;9082:7;9076:14;9072:1;9067:3;9063:11;9056:35;9132:1;9123:7;9119:15;9108:26;;9030:4;9027:1;9023:12;9018:17;;8994:154;;;9177:6;9172:3;9168:16;9161:23;;8860:334;;8674:520;;8462:738;;8355:845;;;;:::o;9206:366::-;9348:3;9369:67;9433:2;9428:3;9369:67;:::i;:::-;9362:74;;9445:93;9534:3;9445:93;:::i;:::-;9563:2;9558:3;9554:12;9547:19;;9206:366;;;:::o;9578:::-;9720:3;9741:67;9805:2;9800:3;9741:67;:::i;:::-;9734:74;;9817:93;9906:3;9817:93;:::i;:::-;9935:2;9930:3;9926:12;9919:19;;9578:366;;;:::o;9950:::-;10092:3;10113:67;10177:2;10172:3;10113:67;:::i;:::-;10106:74;;10189:93;10278:3;10189:93;:::i;:::-;10307:2;10302:3;10298:12;10291:19;;9950:366;;;:::o;10322:::-;10464:3;10485:67;10549:2;10544:3;10485:67;:::i;:::-;10478:74;;10561:93;10650:3;10561:93;:::i;:::-;10679:2;10674:3;10670:12;10663:19;;10322:366;;;:::o;10694:::-;10836:3;10857:67;10921:2;10916:3;10857:67;:::i;:::-;10850:74;;10933:93;11022:3;10933:93;:::i;:::-;11051:2;11046:3;11042:12;11035:19;;10694:366;;;:::o;11066:398::-;11225:3;11246:83;11327:1;11322:3;11246:83;:::i;:::-;11239:90;;11338:93;11427:3;11338:93;:::i;:::-;11456:1;11451:3;11447:11;11440:18;;11066:398;;;:::o;11470:366::-;11612:3;11633:67;11697:2;11692:3;11633:67;:::i;:::-;11626:74;;11709:93;11798:3;11709:93;:::i;:::-;11827:2;11822:3;11818:12;11811:19;;11470:366;;;:::o;11842:365::-;11984:3;12005:66;12069:1;12064:3;12005:66;:::i;:::-;11998:73;;12080:93;12169:3;12080:93;:::i;:::-;12198:2;12193:3;12189:12;12182:19;;11842:365;;;:::o;12213:366::-;12355:3;12376:67;12440:2;12435:3;12376:67;:::i;:::-;12369:74;;12452:93;12541:3;12452:93;:::i;:::-;12570:2;12565:3;12561:12;12554:19;;12213:366;;;:::o;12585:::-;12727:3;12748:67;12812:2;12807:3;12748:67;:::i;:::-;12741:74;;12824:93;12913:3;12824:93;:::i;:::-;12942:2;12937:3;12933:12;12926:19;;12585:366;;;:::o;12957:::-;13099:3;13120:67;13184:2;13179:3;13120:67;:::i;:::-;13113:74;;13196:93;13285:3;13196:93;:::i;:::-;13314:2;13309:3;13305:12;13298:19;;12957:366;;;:::o;13329:118::-;13416:24;13434:5;13416:24;:::i;:::-;13411:3;13404:37;13329:118;;:::o;13453:583::-;13675:3;13697:92;13785:3;13776:6;13697:92;:::i;:::-;13690:99;;13806:95;13897:3;13888:6;13806:95;:::i;:::-;13799:102;;13918:92;14006:3;13997:6;13918:92;:::i;:::-;13911:99;;14027:3;14020:10;;13453:583;;;;;;:::o;14042:379::-;14226:3;14248:147;14391:3;14248:147;:::i;:::-;14241:154;;14412:3;14405:10;;14042:379;;;:::o;14427:222::-;14520:4;14558:2;14547:9;14543:18;14535:26;;14571:71;14639:1;14628:9;14624:17;14615:6;14571:71;:::i;:::-;14427:222;;;;:::o;14655:640::-;14850:4;14888:3;14877:9;14873:19;14865:27;;14902:71;14970:1;14959:9;14955:17;14946:6;14902:71;:::i;:::-;14983:72;15051:2;15040:9;15036:18;15027:6;14983:72;:::i;:::-;15065;15133:2;15122:9;15118:18;15109:6;15065:72;:::i;:::-;15184:9;15178:4;15174:20;15169:2;15158:9;15154:18;15147:48;15212:76;15283:4;15274:6;15212:76;:::i;:::-;15204:84;;14655:640;;;;;;;:::o;15301:210::-;15388:4;15426:2;15415:9;15411:18;15403:26;;15439:65;15501:1;15490:9;15486:17;15477:6;15439:65;:::i;:::-;15301:210;;;;:::o;15517:313::-;15630:4;15668:2;15657:9;15653:18;15645:26;;15717:9;15711:4;15707:20;15703:1;15692:9;15688:17;15681:47;15745:78;15818:4;15809:6;15745:78;:::i;:::-;15737:86;;15517:313;;;;:::o;15836:419::-;16002:4;16040:2;16029:9;16025:18;16017:26;;16089:9;16083:4;16079:20;16075:1;16064:9;16060:17;16053:47;16117:131;16243:4;16117:131;:::i;:::-;16109:139;;15836:419;;;:::o;16261:::-;16427:4;16465:2;16454:9;16450:18;16442:26;;16514:9;16508:4;16504:20;16500:1;16489:9;16485:17;16478:47;16542:131;16668:4;16542:131;:::i;:::-;16534:139;;16261:419;;;:::o;16686:::-;16852:4;16890:2;16879:9;16875:18;16867:26;;16939:9;16933:4;16929:20;16925:1;16914:9;16910:17;16903:47;16967:131;17093:4;16967:131;:::i;:::-;16959:139;;16686:419;;;:::o;17111:::-;17277:4;17315:2;17304:9;17300:18;17292:26;;17364:9;17358:4;17354:20;17350:1;17339:9;17335:17;17328:47;17392:131;17518:4;17392:131;:::i;:::-;17384:139;;17111:419;;;:::o;17536:::-;17702:4;17740:2;17729:9;17725:18;17717:26;;17789:9;17783:4;17779:20;17775:1;17764:9;17760:17;17753:47;17817:131;17943:4;17817:131;:::i;:::-;17809:139;;17536:419;;;:::o;17961:::-;18127:4;18165:2;18154:9;18150:18;18142:26;;18214:9;18208:4;18204:20;18200:1;18189:9;18185:17;18178:47;18242:131;18368:4;18242:131;:::i;:::-;18234:139;;17961:419;;;:::o;18386:::-;18552:4;18590:2;18579:9;18575:18;18567:26;;18639:9;18633:4;18629:20;18625:1;18614:9;18610:17;18603:47;18667:131;18793:4;18667:131;:::i;:::-;18659:139;;18386:419;;;:::o;18811:::-;18977:4;19015:2;19004:9;19000:18;18992:26;;19064:9;19058:4;19054:20;19050:1;19039:9;19035:17;19028:47;19092:131;19218:4;19092:131;:::i;:::-;19084:139;;18811:419;;;:::o;19236:::-;19402:4;19440:2;19429:9;19425:18;19417:26;;19489:9;19483:4;19479:20;19475:1;19464:9;19460:17;19453:47;19517:131;19643:4;19517:131;:::i;:::-;19509:139;;19236:419;;;:::o;19661:::-;19827:4;19865:2;19854:9;19850:18;19842:26;;19914:9;19908:4;19904:20;19900:1;19889:9;19885:17;19878:47;19942:131;20068:4;19942:131;:::i;:::-;19934:139;;19661:419;;;:::o;20086:222::-;20179:4;20217:2;20206:9;20202:18;20194:26;;20230:71;20298:1;20287:9;20283:17;20274:6;20230:71;:::i;:::-;20086:222;;;;:::o;20314:129::-;20348:6;20375:20;;:::i;:::-;20365:30;;20404:33;20432:4;20424:6;20404:33;:::i;:::-;20314:129;;;:::o;20449:75::-;20482:6;20515:2;20509:9;20499:19;;20449:75;:::o;20530:307::-;20591:4;20681:18;20673:6;20670:30;20667:56;;;20703:18;;:::i;:::-;20667:56;20741:29;20763:6;20741:29;:::i;:::-;20733:37;;20825:4;20819;20815:15;20807:23;;20530:307;;;:::o;20843:141::-;20892:4;20915:3;20907:11;;20938:3;20935:1;20928:14;20972:4;20969:1;20959:18;20951:26;;20843:141;;;:::o;20990:98::-;21041:6;21075:5;21069:12;21059:22;;20990:98;;;:::o;21094:99::-;21146:6;21180:5;21174:12;21164:22;;21094:99;;;:::o;21199:168::-;21282:11;21316:6;21311:3;21304:19;21356:4;21351:3;21347:14;21332:29;;21199:168;;;;:::o;21373:147::-;21474:11;21511:3;21496:18;;21373:147;;;;:::o;21526:169::-;21610:11;21644:6;21639:3;21632:19;21684:4;21679:3;21675:14;21660:29;;21526:169;;;;:::o;21701:148::-;21803:11;21840:3;21825:18;;21701:148;;;;:::o;21855:305::-;21895:3;21914:20;21932:1;21914:20;:::i;:::-;21909:25;;21948:20;21966:1;21948:20;:::i;:::-;21943:25;;22102:1;22034:66;22030:74;22027:1;22024:81;22021:107;;;22108:18;;:::i;:::-;22021:107;22152:1;22149;22145:9;22138:16;;21855:305;;;;:::o;22166:348::-;22206:7;22229:20;22247:1;22229:20;:::i;:::-;22224:25;;22263:20;22281:1;22263:20;:::i;:::-;22258:25;;22451:1;22383:66;22379:74;22376:1;22373:81;22368:1;22361:9;22354:17;22350:105;22347:131;;;22458:18;;:::i;:::-;22347:131;22506:1;22503;22499:9;22488:20;;22166:348;;;;:::o;22520:96::-;22557:7;22586:24;22604:5;22586:24;:::i;:::-;22575:35;;22520:96;;;:::o;22622:90::-;22656:7;22699:5;22692:13;22685:21;22674:32;;22622:90;;;:::o;22718:149::-;22754:7;22794:66;22787:5;22783:78;22772:89;;22718:149;;;:::o;22873:126::-;22910:7;22950:42;22943:5;22939:54;22928:65;;22873:126;;;:::o;23005:77::-;23042:7;23071:5;23060:16;;23005:77;;;:::o;23088:154::-;23172:6;23167:3;23162;23149:30;23234:1;23225:6;23220:3;23216:16;23209:27;23088:154;;;:::o;23248:307::-;23316:1;23326:113;23340:6;23337:1;23334:13;23326:113;;;23425:1;23420:3;23416:11;23410:18;23406:1;23401:3;23397:11;23390:39;23362:2;23359:1;23355:10;23350:15;;23326:113;;;23457:6;23454:1;23451:13;23448:101;;;23537:1;23528:6;23523:3;23519:16;23512:27;23448:101;23297:258;23248:307;;;:::o;23561:320::-;23605:6;23642:1;23636:4;23632:12;23622:22;;23689:1;23683:4;23679:12;23710:18;23700:81;;23766:4;23758:6;23754:17;23744:27;;23700:81;23828:2;23820:6;23817:14;23797:18;23794:38;23791:84;;;23847:18;;:::i;:::-;23791:84;23612:269;23561:320;;;:::o;23887:281::-;23970:27;23992:4;23970:27;:::i;:::-;23962:6;23958:40;24100:6;24088:10;24085:22;24064:18;24052:10;24049:34;24046:62;24043:88;;;24111:18;;:::i;:::-;24043:88;24151:10;24147:2;24140:22;23930:238;23887:281;;:::o;24174:180::-;24222:77;24219:1;24212:88;24319:4;24316:1;24309:15;24343:4;24340:1;24333:15;24360:180;24408:77;24405:1;24398:88;24505:4;24502:1;24495:15;24529:4;24526:1;24519:15;24546:180;24594:77;24591:1;24584:88;24691:4;24688:1;24681:15;24715:4;24712:1;24705:15;24732:117;24841:1;24838;24831:12;24855:117;24964:1;24961;24954:12;24978:117;25087:1;25084;25077:12;25101:117;25210:1;25207;25200:12;25224:117;25333:1;25330;25323:12;25347:117;25456:1;25453;25446:12;25470:102;25511:6;25562:2;25558:7;25553:2;25546:5;25542:14;25538:28;25528:38;;25470:102;;;:::o;25578:160::-;25718:12;25714:1;25706:6;25702:14;25695:36;25578:160;:::o;25744:225::-;25884:34;25880:1;25872:6;25868:14;25861:58;25953:8;25948:2;25940:6;25936:15;25929:33;25744:225;:::o;25975:233::-;26115:34;26111:1;26103:6;26099:14;26092:58;26184:16;26179:2;26171:6;26167:15;26160:41;25975:233;:::o;26214:182::-;26354:34;26350:1;26342:6;26338:14;26331:58;26214:182;:::o;26402:231::-;26542:34;26538:1;26530:6;26526:14;26519:58;26611:14;26606:2;26598:6;26594:15;26587:39;26402:231;:::o;26639:114::-;;:::o;26759:166::-;26899:18;26895:1;26887:6;26883:14;26876:42;26759:166;:::o;26931:159::-;27071:11;27067:1;27059:6;27055:14;27048:35;26931:159;:::o;27096:181::-;27236:33;27232:1;27224:6;27220:14;27213:57;27096:181;:::o;27283:::-;27423:33;27419:1;27411:6;27407:14;27400:57;27283:181;:::o;27470:236::-;27610:34;27606:1;27598:6;27594:14;27587:58;27679:19;27674:2;27666:6;27662:15;27655:44;27470:236;:::o;27712:122::-;27785:24;27803:5;27785:24;:::i;:::-;27778:5;27775:35;27765:63;;27824:1;27821;27814:12;27765:63;27712:122;:::o;27840:116::-;27910:21;27925:5;27910:21;:::i;:::-;27903:5;27900:32;27890:60;;27946:1;27943;27936:12;27890:60;27840:116;:::o;27962:120::-;28034:23;28051:5;28034:23;:::i;:::-;28027:5;28024:34;28014:62;;28072:1;28069;28062:12;28014:62;27962:120;:::o;28088:122::-;28161:24;28179:5;28161:24;:::i;:::-;28154:5;28151:35;28141:63;;28200:1;28197;28190:12;28141:63;28088:122;:::o
Swarm Source
ipfs://2a2ff68baf0cc05ef4e7b3fab25fe2992c89fa592913a1ecc3156f0c043efea5
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.