Overview
APE Balance
APE Value
$0.19 (@ $0.19/APE)More Info
Private Name Tags
ContractCreator
TokenTracker
Multichain Info
Latest 25 from a total of 59,442 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 32774106 | 50 mins ago | IN | 0 APE | 0.00474075 | ||||
| Set Approval For... | 32770693 | 2 hrs ago | IN | 0 APE | 0.00251268 | ||||
| Set Approval For... | 32739065 | 17 hrs ago | IN | 0 APE | 0.00474929 | ||||
| Set Approval For... | 32708737 | 36 hrs ago | IN | 0 APE | 0.00251268 | ||||
| Set Approval For... | 32704642 | 39 hrs ago | IN | 0 APE | 0.00474075 | ||||
| Set Approval For... | 32696961 | 43 hrs ago | IN | 0 APE | 0.00251268 | ||||
| Set Approval For... | 32682475 | 2 days ago | IN | 0 APE | 0.00251268 | ||||
| Set Approval For... | 32677094 | 2 days ago | IN | 0 APE | 0.00251268 | ||||
| Set Approval For... | 32676976 | 2 days ago | IN | 0 APE | 0.00251268 | ||||
| Set Approval For... | 32659275 | 2 days ago | IN | 0 APE | 0.00251268 | ||||
| Set Approval For... | 32656511 | 2 days ago | IN | 0 APE | 0.00251268 | ||||
| Set Approval For... | 32652769 | 2 days ago | IN | 0 APE | 0.00251268 | ||||
| Set Approval For... | 32649691 | 2 days ago | IN | 0 APE | 0.00251268 | ||||
| Set Approval For... | 32649577 | 2 days ago | IN | 0 APE | 0.00251268 | ||||
| Set Approval For... | 32649271 | 2 days ago | IN | 0 APE | 0.00251268 | ||||
| Set Approval For... | 32649261 | 2 days ago | IN | 0 APE | 0.00251268 | ||||
| Set Approval For... | 32648815 | 2 days ago | IN | 0 APE | 0.00251268 | ||||
| Set Approval For... | 32648298 | 2 days ago | IN | 0 APE | 0.00251268 | ||||
| Set Approval For... | 32647911 | 2 days ago | IN | 0 APE | 0.00251268 | ||||
| Set Approval For... | 32647143 | 3 days ago | IN | 0 APE | 0.00251268 | ||||
| Safe Transfer Fr... | 32622275 | 3 days ago | IN | 0 APE | 0.0042001 | ||||
| Safe Transfer Fr... | 32622263 | 3 days ago | IN | 0 APE | 0.00468818 | ||||
| Safe Transfer Fr... | 32621971 | 3 days ago | IN | 0 APE | 0.0042001 | ||||
| Safe Transfer Fr... | 32621938 | 3 days ago | IN | 0 APE | 0.00642696 | ||||
| Set Approval For... | 32620712 | 3 days ago | IN | 0 APE | 0.00474075 |
View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Contract Source Code (Solidity)
/**
*Submitted for verification at apescan.io on 2025-06-09
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.29;
/**
* @dev Interface of ERC721A.
*/
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();
/**
* 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();
/**
* The `quantity` minted with ERC2309 exceeds the safety limit.
*/
error MintERC2309QuantityExceedsLimit();
/**
* The `extraData` cannot be set on an unintialized ownership slot.
*/
error OwnershipNotInitializedForExtraData();
// =============================================================
// STRUCTS
// =============================================================
struct TokenOwnership {
// The address of the owner.
address addr;
// Stores the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
// Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
uint24 extraData;
}
// =============================================================
// TOKEN COUNTERS
// =============================================================
/**
* @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() external view returns (uint256);
// =============================================================
// IERC165
// =============================================================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
* to learn more about how these ids are created.
*
* This function call must use less than 30000 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`,
* 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,
bytes calldata data
) external;
/**
* @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` 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);
// =============================================================
// IERC2309
// =============================================================
/**
* @dev Emitted when tokens in `fromTokenId` to `toTokenId`
* (inclusive) is transferred from `from` to `to`, as defined in the
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
*
* See {_mintERC2309} for more details.
*/
event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
interface IERC2981 is IERC165 {
/// ERC165 bytes to add to interface array - set in parent contract
/// implementing this standard
///
/// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
/// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
/// _registerInterface(_INTERFACE_ID_ERC2981);
/// @notice Called with the sale price to determine how much royalty
// is owed and to whom.
/// @param _tokenId - the NFT asset queried for royalty information
/// @param _salePrice - the sale price of the NFT asset specified by _tokenId
/// @return receiver - address of who should be sent the royalty payment
/// @return royaltyAmount - the royalty payment amount for _salePrice
function royaltyInfo(
uint256 _tokenId,
uint256 _salePrice
) external view returns (
address receiver,
uint256 royaltyAmount
);
}
contract HorseClub is IERC721A {
using SafeMath for uint256;
address private _owner;
function owner() public view returns(address){
return _owner;
}
mapping(address=>uint256) minted;
uint256 public constant MAX_SUPPLY = 2222;
uint256 public constant MAX_PER_WALLET = 5;
uint256 public constant MAX_FREE_PER_WALLET = 0;
uint256 public constant MAX_FREE = 0;
uint256 public constant COST = 1 ether;
string private constant _name = "Horse Club";
string private constant _symbol = "HC";
string private _baseURI = "QmVfeNMxS8gCFRC4pVcjmGS5oXPY7YR9yc3WvuxbCa37kc";
uint256 public count_messages = 0;
mapping(uint256 => uint256) tokenId2mid;
mapping(uint256 => string) messages;
constructor() {
_owner = msg.sender;
}
function mint(uint256 amount) external payable{
address _caller = _msgSenderERC721A();
require(totalSupply() + amount <= MAX_SUPPLY, "Sold Out");
require(amount*COST <= msg.value, "Value to Low");
//minted[msg.sender] += amount;
_mint(_caller, amount);
}
function burn(uint256 tokenId, string memory message) public{
require(ownerOf(tokenId)==msg.sender, "you must own it");
tokenId2mid[tokenId] = count_messages;
messages[count_messages] = message;
count_messages+=1;
transferFrom(msg.sender, address(0), tokenId);
}
function getMessage(uint256 tokenId) public view returns(string memory){
uint256 mid = tokenId2mid[tokenId];
return messages[mid];
}
// Mask of an entry in packed address data.
uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
uint256 private constant BITPOS_NUMBER_MINTED = 64;
uint256 private constant BITPOS_NUMBER_BURNED = 128;
uint256 private constant BITPOS_AUX = 192;
uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
uint256 private constant BITPOS_START_TIMESTAMP = 160;
uint256 private constant BITMASK_BURNED = 1 << 224;
uint256 private constant BITPOS_NEXT_INITIALIZED = 225;
uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;
uint256 private _currentIndex = 0;
// 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;
function royaltyInfo(uint256, uint256 salePrice)
external
view
returns (address receiver, uint256 royaltyAmount)
{
receiver = _owner;
royaltyAmount = (salePrice * 500) / 10000; // Calculate royalty based on sale price
}
function setData(string memory _base) external onlyOwner{
_baseURI = _base;
}
/**
* @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 - _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 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 == 0x2a55205a || // ERC Royalties
interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view override returns (uint256) {
if (_addressToUint256(owner) == 0) revert BalanceQueryForZeroAddress();
return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens minted by `owner`.
*/
function _numberMinted(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the 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);
}
/**
* 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;
}
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("ipfs://", baseURI, "/", _toString(tokenId), ".json")) : "";
}
/**
* @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();
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);
}
/**
* @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;
}
/**
* @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 (_addressToUint256(to) == 0) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
// 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();
address approvedAddress = _tokenApprovals[tokenId];
bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
isApprovedForAll(from, _msgSenderERC721A()) ||
approvedAddress == _msgSenderERC721A());
if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
// Clear approvals from the previous owner.
if (_addressToUint256(approvedAddress) != 0) {
delete _tokenApprovals[tokenId];
}
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
unchecked {
// We can directly increment and decrement the balances.
--_packedAddressData[from]; // Updates: `balance -= 1`.
++_packedAddressData[to]; // Updates: `balance += 1`.
// Updates:
// - `address` to the next owner.
// - `startTimestamp` to the timestamp of transfering.
// - `burned` to `false`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] =
_addressToUint256(to) |
(block.timestamp << BITPOS_START_TIMESTAMP) |
BITMASK_NEXT_INITIALIZED;
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev 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)
}
}
function teamMint(uint256 amount) external onlyOwner{
require(totalSupply() + amount < MAX_SUPPLY, "Must be below Max Supply");
_mint(msg.sender, amount);
}
modifier onlyOwner() {
require(_owner==msg.sender, "not Owner");
_;
}
modifier nob() {
require(tx.origin==msg.sender, "no Script");
_;
}
function withdraw() external onlyOwner {
uint256 balance = address(this).balance;
address payable recipient = payable(msg.sender);
recipient.call{value:balance, gas:30000}("");
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"message","type":"string"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"count_messages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMessage","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":[{"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":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"_base","type":"string"}],"name":"setData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"teamMint","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526040518060600160405280602e8152602001612bcb602e91396002908161002b91906102c1565b505f6003555f60065534801561003f575f5ffd5b50335f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610390565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806100ff57607f821691505b602082108103610112576101116100bb565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026101747fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610139565b61017e8683610139565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6101c26101bd6101b884610196565b61019f565b610196565b9050919050565b5f819050919050565b6101db836101a8565b6101ef6101e7826101c9565b848454610145565b825550505050565b5f5f905090565b6102066101f7565b6102118184846101d2565b505050565b5b81811015610234576102295f826101fe565b600181019050610217565b5050565b601f8211156102795761024a81610118565b6102538461012a565b81016020851015610262578190505b61027661026e8561012a565b830182610216565b50505b505050565b5f82821c905092915050565b5f6102995f198460080261027e565b1980831691505092915050565b5f6102b1838361028a565b9150826002028217905092915050565b6102ca82610084565b67ffffffffffffffff8111156102e3576102e261008e565b5b6102ed82546100e8565b6102f8828285610238565b5f60209050601f831160018114610329575f8415610317578287015190505b61032185826102a6565b865550610388565b601f19841661033786610118565b5f5b8281101561035e57848901518255600182019150602085019450602081019050610339565b8683101561037b5784890151610377601f89168261028a565b8355505b6001600288020188555050505b505050505050565b61282e8061039d5f395ff3fe6080604052600436106101b6575f3560e01c80636352211e116100eb578063a0712d6811610089578063bf8fbbd211610063578063bf8fbbd2146105e5578063c87b56dd1461060f578063e985e9c51461064b578063ed6661c214610687576101b6565b8063a0712d6814610579578063a22cb46514610595578063b88d4fde146105bd576101b6565b806386f79edb116100c557806386f79edb146104bf5780638da5cb5b146104fb57806395d89b411461052557806398710d1e1461054f576101b6565b80636352211e1461041f57806370a082311461045b5780637641e6f314610497576101b6565b80632a55205a116101585780633ccfd60b116101325780633ccfd60b1461038f57806341db5e12146103a557806342842e0e146103cf57806347064d6a146103f7576101b6565b80632a55205a146103005780632fbba1151461033d57806332cb6b0c14610365576101b6565b8063095ea7b311610194578063095ea7b31461025c5780630f2cdd6c1461028457806318160ddd146102ae57806323b872dd146102d8576101b6565b806301ffc9a7146101ba57806306fdde03146101f6578063081812fc14610220575b5f5ffd5b3480156101c5575f5ffd5b506101e060048036038101906101db91906119e4565b6106b1565b6040516101ed9190611a29565b60405180910390f35b348015610201575f5ffd5b5061020a610772565b6040516102179190611ab2565b60405180910390f35b34801561022b575f5ffd5b5061024660048036038101906102419190611b05565b6107af565b6040516102539190611b6f565b60405180910390f35b348015610267575f5ffd5b50610282600480360381019061027d9190611bb2565b610827565b005b34801561028f575f5ffd5b5061029861099b565b6040516102a59190611bff565b60405180910390f35b3480156102b9575f5ffd5b506102c26109a0565b6040516102cf9190611bff565b60405180910390f35b3480156102e3575f5ffd5b506102fe60048036038101906102f99190611c18565b6109b2565b005b34801561030b575f5ffd5b5061032660048036038101906103219190611c68565b6109c2565b604051610334929190611ca6565b60405180910390f35b348015610348575f5ffd5b50610363600480360381019061035e9190611b05565b610a0b565b005b348015610370575f5ffd5b50610379610afc565b6040516103869190611bff565b60405180910390f35b34801561039a575f5ffd5b506103a3610b02565b005b3480156103b0575f5ffd5b506103b9610c07565b6040516103c69190611bff565b60405180910390f35b3480156103da575f5ffd5b506103f560048036038101906103f09190611c18565b610c0d565b005b348015610402575f5ffd5b5061041d60048036038101906104189190611df9565b610c2c565b005b34801561042a575f5ffd5b5061044560048036038101906104409190611b05565b610ccd565b6040516104529190611b6f565b60405180910390f35b348015610466575f5ffd5b50610481600480360381019061047c9190611e40565b610cde565b60405161048e9190611bff565b60405180910390f35b3480156104a2575f5ffd5b506104bd60048036038101906104b89190611e6b565b610d6f565b005b3480156104ca575f5ffd5b506104e560048036038101906104e09190611b05565b610e46565b6040516104f29190611ab2565b60405180910390f35b348015610506575f5ffd5b5061050f610efd565b60405161051c9190611b6f565b60405180910390f35b348015610530575f5ffd5b50610539610f24565b6040516105469190611ab2565b60405180910390f35b34801561055a575f5ffd5b50610563610f61565b6040516105709190611bff565b60405180910390f35b610593600480360381019061058e9190611b05565b610f65565b005b3480156105a0575f5ffd5b506105bb60048036038101906105b69190611eef565b61102b565b005b3480156105c8575f5ffd5b506105e360048036038101906105de9190611fcb565b61119d565b005b3480156105f0575f5ffd5b506105f96111ae565b6040516106069190611bff565b60405180910390f35b34801561061a575f5ffd5b5061063560048036038101906106309190611b05565b6111ba565b6040516106429190611ab2565b60405180910390f35b348015610656575f5ffd5b50610671600480360381019061066c919061204b565b6112d6565b60405161067e9190611a29565b60405180910390f35b348015610692575f5ffd5b5061069b611364565b6040516106a89190611bff565b60405180910390f35b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070b57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061073b5750632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061076b5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606040518060400160405280600a81526020017f486f72736520436c756200000000000000000000000000000000000000000000815250905090565b5f6107b982611368565b6107ef576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f61083182611388565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086a575f5ffd5b8073ffffffffffffffffffffffffffffffffffffffff1661088961144c565b73ffffffffffffffffffffffffffffffffffffffff16146108ec576108b5816108b061144c565b6112d6565b6108eb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260095f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600581565b5f6109a9611453565b60065403905090565b6109bd83838361145a565b505050565b5f5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506127106101f4846109f891906120b6565b610a029190612124565b90509250929050565b3373ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a909061219e565b60405180910390fd5b6108ae81610aa56109a0565b610aaf91906121bc565b10610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae690612239565b60405180910390fd5b610af933826117b7565b50565b6108ae81565b3373ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b879061219e565b60405180910390fd5b5f4790505f3390508073ffffffffffffffffffffffffffffffffffffffff168261753090604051610bc090612284565b5f60405180830381858888f193505050503d805f8114610bfb576040519150601f19603f3d011682016040523d82523d5f602084013e610c00565b606091505b5050505050565b60035481565b610c2783838360405180602001604052805f81525061119d565b505050565b3373ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb19061219e565b60405180910390fd5b8060029081610cc99190612495565b5050565b5f610cd782611388565b9050919050565b5f5f610ce98361190c565b03610d20576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16610d8f83610ccd565b73ffffffffffffffffffffffffffffffffffffffff1614610de5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddc906125ae565b60405180910390fd5b60035460045f8481526020019081526020015f20819055508060055f60035481526020019081526020015f209081610e1d9190612495565b50600160035f828254610e3091906121bc565b92505081905550610e42335f846109b2565b5050565b60605f60045f8481526020019081526020015f2054905060055f8281526020019081526020015f208054610e79906122c5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea5906122c5565b8015610ef05780601f10610ec757610100808354040283529160200191610ef0565b820191905f5260205f20905b815481529060010190602001808311610ed357829003601f168201915b5050505050915050919050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600281526020017f4843000000000000000000000000000000000000000000000000000000000000815250905090565b5f81565b5f610f6e61144c565b90506108ae82610f7c6109a0565b610f8691906121bc565b1115610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe90612616565b60405180910390fd5b34670de0b6b3a764000083610fdc91906120b6565b111561101d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110149061267e565b60405180910390fd5b61102781836117b7565b5050565b61103361144c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611097576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a5f6110a361144c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661114c61144c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111919190611a29565b60405180910390a35050565b6111a884848461145a565b50505050565b670de0b6b3a764000081565b60606111c582611368565b6111fb576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60028054611209906122c5565b80601f0160208091040260200160405190810160405280929190818152602001828054611235906122c5565b80156112805780601f1061125757610100808354040283529160200191611280565b820191905f5260205f20905b81548152906001019060200180831161126357829003601f168201915b505050505090505f8151036112a35760405180602001604052805f8152506112ce565b806112ad84611915565b6040516020016112be9291906127b4565b6040516020818303038152906040525b915050919050565b5f600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f81565b5f81611372611453565b11158015611381575060065482105b9050919050565b5f5f82905080611396611453565b1161141557600654811015611414575f60075f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603611412575b5f81036114085760075f836001900393508381526020019081526020015f205490506113e1565b8092505050611447565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f33905090565b5f5f905090565b5f61146482611388565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114cb576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f8573ffffffffffffffffffffffffffffffffffffffff1661151f61144c565b73ffffffffffffffffffffffffffffffffffffffff16148061154e575061154d8661154861144c565b6112d6565b5b8061158b575061155c61144c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050806115c4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6115ce8361190c565b146116075760095f8581526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b60085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6116c88761190c565b171760075f8681526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000841603611747575f6001850190505f60075f8381526020019081526020015f205403611745576006548114611744578360075f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117af868686600161196f565b505050505050565b5f60065490505f82036117f6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160406001901b17820260085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555060e161185860018414611975565b901b60a042901b6118688561190c565b171760075f8381526020019081526020015f20819055505f8190505f83820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061188a578160068190555050506119075f84838561196f565b505050565b5f819050919050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561195b57600183039250600a81066030018353600a8104905061193b565b508181036020830392508083525050919050565b50505050565b5f819050919050565b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6119c38161198f565b81146119cd575f5ffd5b50565b5f813590506119de816119ba565b92915050565b5f602082840312156119f9576119f8611987565b5b5f611a06848285016119d0565b91505092915050565b5f8115159050919050565b611a2381611a0f565b82525050565b5f602082019050611a3c5f830184611a1a565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611a8482611a42565b611a8e8185611a4c565b9350611a9e818560208601611a5c565b611aa781611a6a565b840191505092915050565b5f6020820190508181035f830152611aca8184611a7a565b905092915050565b5f819050919050565b611ae481611ad2565b8114611aee575f5ffd5b50565b5f81359050611aff81611adb565b92915050565b5f60208284031215611b1a57611b19611987565b5b5f611b2784828501611af1565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611b5982611b30565b9050919050565b611b6981611b4f565b82525050565b5f602082019050611b825f830184611b60565b92915050565b611b9181611b4f565b8114611b9b575f5ffd5b50565b5f81359050611bac81611b88565b92915050565b5f5f60408385031215611bc857611bc7611987565b5b5f611bd585828601611b9e565b9250506020611be685828601611af1565b9150509250929050565b611bf981611ad2565b82525050565b5f602082019050611c125f830184611bf0565b92915050565b5f5f5f60608486031215611c2f57611c2e611987565b5b5f611c3c86828701611b9e565b9350506020611c4d86828701611b9e565b9250506040611c5e86828701611af1565b9150509250925092565b5f5f60408385031215611c7e57611c7d611987565b5b5f611c8b85828601611af1565b9250506020611c9c85828601611af1565b9150509250929050565b5f604082019050611cb95f830185611b60565b611cc66020830184611bf0565b9392505050565b5f5ffd5b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611d0b82611a6a565b810181811067ffffffffffffffff82111715611d2a57611d29611cd5565b5b80604052505050565b5f611d3c61197e565b9050611d488282611d02565b919050565b5f67ffffffffffffffff821115611d6757611d66611cd5565b5b611d7082611a6a565b9050602081019050919050565b828183375f83830152505050565b5f611d9d611d9884611d4d565b611d33565b905082815260208101848484011115611db957611db8611cd1565b5b611dc4848285611d7d565b509392505050565b5f82601f830112611de057611ddf611ccd565b5b8135611df0848260208601611d8b565b91505092915050565b5f60208284031215611e0e57611e0d611987565b5b5f82013567ffffffffffffffff811115611e2b57611e2a61198b565b5b611e3784828501611dcc565b91505092915050565b5f60208284031215611e5557611e54611987565b5b5f611e6284828501611b9e565b91505092915050565b5f5f60408385031215611e8157611e80611987565b5b5f611e8e85828601611af1565b925050602083013567ffffffffffffffff811115611eaf57611eae61198b565b5b611ebb85828601611dcc565b9150509250929050565b611ece81611a0f565b8114611ed8575f5ffd5b50565b5f81359050611ee981611ec5565b92915050565b5f5f60408385031215611f0557611f04611987565b5b5f611f1285828601611b9e565b9250506020611f2385828601611edb565b9150509250929050565b5f67ffffffffffffffff821115611f4757611f46611cd5565b5b611f5082611a6a565b9050602081019050919050565b5f611f6f611f6a84611f2d565b611d33565b905082815260208101848484011115611f8b57611f8a611cd1565b5b611f96848285611d7d565b509392505050565b5f82601f830112611fb257611fb1611ccd565b5b8135611fc2848260208601611f5d565b91505092915050565b5f5f5f5f60808587031215611fe357611fe2611987565b5b5f611ff087828801611b9e565b945050602061200187828801611b9e565b935050604061201287828801611af1565b925050606085013567ffffffffffffffff8111156120335761203261198b565b5b61203f87828801611f9e565b91505092959194509250565b5f5f6040838503121561206157612060611987565b5b5f61206e85828601611b9e565b925050602061207f85828601611b9e565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6120c082611ad2565b91506120cb83611ad2565b92508282026120d981611ad2565b915082820484148315176120f0576120ef612089565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61212e82611ad2565b915061213983611ad2565b925082612149576121486120f7565b5b828204905092915050565b7f6e6f74204f776e657200000000000000000000000000000000000000000000005f82015250565b5f612188600983611a4c565b915061219382612154565b602082019050919050565b5f6020820190508181035f8301526121b58161217c565b9050919050565b5f6121c682611ad2565b91506121d183611ad2565b92508282019050808211156121e9576121e8612089565b5b92915050565b7f4d7573742062652062656c6f77204d617820537570706c7900000000000000005f82015250565b5f612223601883611a4c565b915061222e826121ef565b602082019050919050565b5f6020820190508181035f83015261225081612217565b9050919050565b5f81905092915050565b50565b5f61226f5f83612257565b915061227a82612261565b5f82019050919050565b5f61228e82612264565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806122dc57607f821691505b6020821081036122ef576122ee612298565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026123517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612316565b61235b8683612316565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61239661239161238c84611ad2565b612373565b611ad2565b9050919050565b5f819050919050565b6123af8361237c565b6123c36123bb8261239d565b848454612322565b825550505050565b5f5f905090565b6123da6123cb565b6123e58184846123a6565b505050565b5b81811015612408576123fd5f826123d2565b6001810190506123eb565b5050565b601f82111561244d5761241e816122f5565b61242784612307565b81016020851015612436578190505b61244a61244285612307565b8301826123ea565b50505b505050565b5f82821c905092915050565b5f61246d5f1984600802612452565b1980831691505092915050565b5f612485838361245e565b9150826002028217905092915050565b61249e82611a42565b67ffffffffffffffff8111156124b7576124b6611cd5565b5b6124c182546122c5565b6124cc82828561240c565b5f60209050601f8311600181146124fd575f84156124eb578287015190505b6124f5858261247a565b86555061255c565b601f19841661250b866122f5565b5f5b828110156125325784890151825560018201915060208501945060208101905061250d565b8683101561254f578489015161254b601f89168261245e565b8355505b6001600288020188555050505b505050505050565b7f796f75206d757374206f776e20697400000000000000000000000000000000005f82015250565b5f612598600f83611a4c565b91506125a382612564565b602082019050919050565b5f6020820190508181035f8301526125c58161258c565b9050919050565b7f536f6c64204f75740000000000000000000000000000000000000000000000005f82015250565b5f612600600883611a4c565b915061260b826125cc565b602082019050919050565b5f6020820190508181035f83015261262d816125f4565b9050919050565b7f56616c756520746f204c6f7700000000000000000000000000000000000000005f82015250565b5f612668600c83611a4c565b915061267382612634565b602082019050919050565b5f6020820190508181035f8301526126958161265c565b9050919050565b5f81905092915050565b7f697066733a2f2f000000000000000000000000000000000000000000000000005f82015250565b5f6126da60078361269c565b91506126e5826126a6565b600782019050919050565b5f6126fa82611a42565b612704818561269c565b9350612714818560208601611a5c565b80840191505092915050565b7f2f000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61275460018361269c565b915061275f82612720565b600182019050919050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f61279e60058361269c565b91506127a98261276a565b600582019050919050565b5f6127be826126ce565b91506127ca82856126f0565b91506127d582612748565b91506127e182846126f0565b91506127ec82612792565b9150819050939250505056fea2646970667358221220eac720cdeff59f601239ca89f80b403105eed78d8aebb83d06594137362706db64736f6c634300081d0033516d5666654e4d7853386743465243347056636a6d4753356f585059375952397963335776757862436133376b63
Deployed Bytecode
0x6080604052600436106101b6575f3560e01c80636352211e116100eb578063a0712d6811610089578063bf8fbbd211610063578063bf8fbbd2146105e5578063c87b56dd1461060f578063e985e9c51461064b578063ed6661c214610687576101b6565b8063a0712d6814610579578063a22cb46514610595578063b88d4fde146105bd576101b6565b806386f79edb116100c557806386f79edb146104bf5780638da5cb5b146104fb57806395d89b411461052557806398710d1e1461054f576101b6565b80636352211e1461041f57806370a082311461045b5780637641e6f314610497576101b6565b80632a55205a116101585780633ccfd60b116101325780633ccfd60b1461038f57806341db5e12146103a557806342842e0e146103cf57806347064d6a146103f7576101b6565b80632a55205a146103005780632fbba1151461033d57806332cb6b0c14610365576101b6565b8063095ea7b311610194578063095ea7b31461025c5780630f2cdd6c1461028457806318160ddd146102ae57806323b872dd146102d8576101b6565b806301ffc9a7146101ba57806306fdde03146101f6578063081812fc14610220575b5f5ffd5b3480156101c5575f5ffd5b506101e060048036038101906101db91906119e4565b6106b1565b6040516101ed9190611a29565b60405180910390f35b348015610201575f5ffd5b5061020a610772565b6040516102179190611ab2565b60405180910390f35b34801561022b575f5ffd5b5061024660048036038101906102419190611b05565b6107af565b6040516102539190611b6f565b60405180910390f35b348015610267575f5ffd5b50610282600480360381019061027d9190611bb2565b610827565b005b34801561028f575f5ffd5b5061029861099b565b6040516102a59190611bff565b60405180910390f35b3480156102b9575f5ffd5b506102c26109a0565b6040516102cf9190611bff565b60405180910390f35b3480156102e3575f5ffd5b506102fe60048036038101906102f99190611c18565b6109b2565b005b34801561030b575f5ffd5b5061032660048036038101906103219190611c68565b6109c2565b604051610334929190611ca6565b60405180910390f35b348015610348575f5ffd5b50610363600480360381019061035e9190611b05565b610a0b565b005b348015610370575f5ffd5b50610379610afc565b6040516103869190611bff565b60405180910390f35b34801561039a575f5ffd5b506103a3610b02565b005b3480156103b0575f5ffd5b506103b9610c07565b6040516103c69190611bff565b60405180910390f35b3480156103da575f5ffd5b506103f560048036038101906103f09190611c18565b610c0d565b005b348015610402575f5ffd5b5061041d60048036038101906104189190611df9565b610c2c565b005b34801561042a575f5ffd5b5061044560048036038101906104409190611b05565b610ccd565b6040516104529190611b6f565b60405180910390f35b348015610466575f5ffd5b50610481600480360381019061047c9190611e40565b610cde565b60405161048e9190611bff565b60405180910390f35b3480156104a2575f5ffd5b506104bd60048036038101906104b89190611e6b565b610d6f565b005b3480156104ca575f5ffd5b506104e560048036038101906104e09190611b05565b610e46565b6040516104f29190611ab2565b60405180910390f35b348015610506575f5ffd5b5061050f610efd565b60405161051c9190611b6f565b60405180910390f35b348015610530575f5ffd5b50610539610f24565b6040516105469190611ab2565b60405180910390f35b34801561055a575f5ffd5b50610563610f61565b6040516105709190611bff565b60405180910390f35b610593600480360381019061058e9190611b05565b610f65565b005b3480156105a0575f5ffd5b506105bb60048036038101906105b69190611eef565b61102b565b005b3480156105c8575f5ffd5b506105e360048036038101906105de9190611fcb565b61119d565b005b3480156105f0575f5ffd5b506105f96111ae565b6040516106069190611bff565b60405180910390f35b34801561061a575f5ffd5b5061063560048036038101906106309190611b05565b6111ba565b6040516106429190611ab2565b60405180910390f35b348015610656575f5ffd5b50610671600480360381019061066c919061204b565b6112d6565b60405161067e9190611a29565b60405180910390f35b348015610692575f5ffd5b5061069b611364565b6040516106a89190611bff565b60405180910390f35b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070b57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061073b5750632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061076b5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606040518060400160405280600a81526020017f486f72736520436c756200000000000000000000000000000000000000000000815250905090565b5f6107b982611368565b6107ef576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f61083182611388565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086a575f5ffd5b8073ffffffffffffffffffffffffffffffffffffffff1661088961144c565b73ffffffffffffffffffffffffffffffffffffffff16146108ec576108b5816108b061144c565b6112d6565b6108eb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260095f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600581565b5f6109a9611453565b60065403905090565b6109bd83838361145a565b505050565b5f5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506127106101f4846109f891906120b6565b610a029190612124565b90509250929050565b3373ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a909061219e565b60405180910390fd5b6108ae81610aa56109a0565b610aaf91906121bc565b10610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae690612239565b60405180910390fd5b610af933826117b7565b50565b6108ae81565b3373ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b879061219e565b60405180910390fd5b5f4790505f3390508073ffffffffffffffffffffffffffffffffffffffff168261753090604051610bc090612284565b5f60405180830381858888f193505050503d805f8114610bfb576040519150601f19603f3d011682016040523d82523d5f602084013e610c00565b606091505b5050505050565b60035481565b610c2783838360405180602001604052805f81525061119d565b505050565b3373ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb19061219e565b60405180910390fd5b8060029081610cc99190612495565b5050565b5f610cd782611388565b9050919050565b5f5f610ce98361190c565b03610d20576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16610d8f83610ccd565b73ffffffffffffffffffffffffffffffffffffffff1614610de5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddc906125ae565b60405180910390fd5b60035460045f8481526020019081526020015f20819055508060055f60035481526020019081526020015f209081610e1d9190612495565b50600160035f828254610e3091906121bc565b92505081905550610e42335f846109b2565b5050565b60605f60045f8481526020019081526020015f2054905060055f8281526020019081526020015f208054610e79906122c5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea5906122c5565b8015610ef05780601f10610ec757610100808354040283529160200191610ef0565b820191905f5260205f20905b815481529060010190602001808311610ed357829003601f168201915b5050505050915050919050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600281526020017f4843000000000000000000000000000000000000000000000000000000000000815250905090565b5f81565b5f610f6e61144c565b90506108ae82610f7c6109a0565b610f8691906121bc565b1115610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe90612616565b60405180910390fd5b34670de0b6b3a764000083610fdc91906120b6565b111561101d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110149061267e565b60405180910390fd5b61102781836117b7565b5050565b61103361144c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611097576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a5f6110a361144c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661114c61144c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111919190611a29565b60405180910390a35050565b6111a884848461145a565b50505050565b670de0b6b3a764000081565b60606111c582611368565b6111fb576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60028054611209906122c5565b80601f0160208091040260200160405190810160405280929190818152602001828054611235906122c5565b80156112805780601f1061125757610100808354040283529160200191611280565b820191905f5260205f20905b81548152906001019060200180831161126357829003601f168201915b505050505090505f8151036112a35760405180602001604052805f8152506112ce565b806112ad84611915565b6040516020016112be9291906127b4565b6040516020818303038152906040525b915050919050565b5f600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f81565b5f81611372611453565b11158015611381575060065482105b9050919050565b5f5f82905080611396611453565b1161141557600654811015611414575f60075f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603611412575b5f81036114085760075f836001900393508381526020019081526020015f205490506113e1565b8092505050611447565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f33905090565b5f5f905090565b5f61146482611388565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114cb576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f8573ffffffffffffffffffffffffffffffffffffffff1661151f61144c565b73ffffffffffffffffffffffffffffffffffffffff16148061154e575061154d8661154861144c565b6112d6565b5b8061158b575061155c61144c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050806115c4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6115ce8361190c565b146116075760095f8581526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b60085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6116c88761190c565b171760075f8681526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000841603611747575f6001850190505f60075f8381526020019081526020015f205403611745576006548114611744578360075f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117af868686600161196f565b505050505050565b5f60065490505f82036117f6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160406001901b17820260085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555060e161185860018414611975565b901b60a042901b6118688561190c565b171760075f8381526020019081526020015f20819055505f8190505f83820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061188a578160068190555050506119075f84838561196f565b505050565b5f819050919050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561195b57600183039250600a81066030018353600a8104905061193b565b508181036020830392508083525050919050565b50505050565b5f819050919050565b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6119c38161198f565b81146119cd575f5ffd5b50565b5f813590506119de816119ba565b92915050565b5f602082840312156119f9576119f8611987565b5b5f611a06848285016119d0565b91505092915050565b5f8115159050919050565b611a2381611a0f565b82525050565b5f602082019050611a3c5f830184611a1a565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611a8482611a42565b611a8e8185611a4c565b9350611a9e818560208601611a5c565b611aa781611a6a565b840191505092915050565b5f6020820190508181035f830152611aca8184611a7a565b905092915050565b5f819050919050565b611ae481611ad2565b8114611aee575f5ffd5b50565b5f81359050611aff81611adb565b92915050565b5f60208284031215611b1a57611b19611987565b5b5f611b2784828501611af1565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611b5982611b30565b9050919050565b611b6981611b4f565b82525050565b5f602082019050611b825f830184611b60565b92915050565b611b9181611b4f565b8114611b9b575f5ffd5b50565b5f81359050611bac81611b88565b92915050565b5f5f60408385031215611bc857611bc7611987565b5b5f611bd585828601611b9e565b9250506020611be685828601611af1565b9150509250929050565b611bf981611ad2565b82525050565b5f602082019050611c125f830184611bf0565b92915050565b5f5f5f60608486031215611c2f57611c2e611987565b5b5f611c3c86828701611b9e565b9350506020611c4d86828701611b9e565b9250506040611c5e86828701611af1565b9150509250925092565b5f5f60408385031215611c7e57611c7d611987565b5b5f611c8b85828601611af1565b9250506020611c9c85828601611af1565b9150509250929050565b5f604082019050611cb95f830185611b60565b611cc66020830184611bf0565b9392505050565b5f5ffd5b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611d0b82611a6a565b810181811067ffffffffffffffff82111715611d2a57611d29611cd5565b5b80604052505050565b5f611d3c61197e565b9050611d488282611d02565b919050565b5f67ffffffffffffffff821115611d6757611d66611cd5565b5b611d7082611a6a565b9050602081019050919050565b828183375f83830152505050565b5f611d9d611d9884611d4d565b611d33565b905082815260208101848484011115611db957611db8611cd1565b5b611dc4848285611d7d565b509392505050565b5f82601f830112611de057611ddf611ccd565b5b8135611df0848260208601611d8b565b91505092915050565b5f60208284031215611e0e57611e0d611987565b5b5f82013567ffffffffffffffff811115611e2b57611e2a61198b565b5b611e3784828501611dcc565b91505092915050565b5f60208284031215611e5557611e54611987565b5b5f611e6284828501611b9e565b91505092915050565b5f5f60408385031215611e8157611e80611987565b5b5f611e8e85828601611af1565b925050602083013567ffffffffffffffff811115611eaf57611eae61198b565b5b611ebb85828601611dcc565b9150509250929050565b611ece81611a0f565b8114611ed8575f5ffd5b50565b5f81359050611ee981611ec5565b92915050565b5f5f60408385031215611f0557611f04611987565b5b5f611f1285828601611b9e565b9250506020611f2385828601611edb565b9150509250929050565b5f67ffffffffffffffff821115611f4757611f46611cd5565b5b611f5082611a6a565b9050602081019050919050565b5f611f6f611f6a84611f2d565b611d33565b905082815260208101848484011115611f8b57611f8a611cd1565b5b611f96848285611d7d565b509392505050565b5f82601f830112611fb257611fb1611ccd565b5b8135611fc2848260208601611f5d565b91505092915050565b5f5f5f5f60808587031215611fe357611fe2611987565b5b5f611ff087828801611b9e565b945050602061200187828801611b9e565b935050604061201287828801611af1565b925050606085013567ffffffffffffffff8111156120335761203261198b565b5b61203f87828801611f9e565b91505092959194509250565b5f5f6040838503121561206157612060611987565b5b5f61206e85828601611b9e565b925050602061207f85828601611b9e565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6120c082611ad2565b91506120cb83611ad2565b92508282026120d981611ad2565b915082820484148315176120f0576120ef612089565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61212e82611ad2565b915061213983611ad2565b925082612149576121486120f7565b5b828204905092915050565b7f6e6f74204f776e657200000000000000000000000000000000000000000000005f82015250565b5f612188600983611a4c565b915061219382612154565b602082019050919050565b5f6020820190508181035f8301526121b58161217c565b9050919050565b5f6121c682611ad2565b91506121d183611ad2565b92508282019050808211156121e9576121e8612089565b5b92915050565b7f4d7573742062652062656c6f77204d617820537570706c7900000000000000005f82015250565b5f612223601883611a4c565b915061222e826121ef565b602082019050919050565b5f6020820190508181035f83015261225081612217565b9050919050565b5f81905092915050565b50565b5f61226f5f83612257565b915061227a82612261565b5f82019050919050565b5f61228e82612264565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806122dc57607f821691505b6020821081036122ef576122ee612298565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026123517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612316565b61235b8683612316565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61239661239161238c84611ad2565b612373565b611ad2565b9050919050565b5f819050919050565b6123af8361237c565b6123c36123bb8261239d565b848454612322565b825550505050565b5f5f905090565b6123da6123cb565b6123e58184846123a6565b505050565b5b81811015612408576123fd5f826123d2565b6001810190506123eb565b5050565b601f82111561244d5761241e816122f5565b61242784612307565b81016020851015612436578190505b61244a61244285612307565b8301826123ea565b50505b505050565b5f82821c905092915050565b5f61246d5f1984600802612452565b1980831691505092915050565b5f612485838361245e565b9150826002028217905092915050565b61249e82611a42565b67ffffffffffffffff8111156124b7576124b6611cd5565b5b6124c182546122c5565b6124cc82828561240c565b5f60209050601f8311600181146124fd575f84156124eb578287015190505b6124f5858261247a565b86555061255c565b601f19841661250b866122f5565b5f5b828110156125325784890151825560018201915060208501945060208101905061250d565b8683101561254f578489015161254b601f89168261245e565b8355505b6001600288020188555050505b505050505050565b7f796f75206d757374206f776e20697400000000000000000000000000000000005f82015250565b5f612598600f83611a4c565b91506125a382612564565b602082019050919050565b5f6020820190508181035f8301526125c58161258c565b9050919050565b7f536f6c64204f75740000000000000000000000000000000000000000000000005f82015250565b5f612600600883611a4c565b915061260b826125cc565b602082019050919050565b5f6020820190508181035f83015261262d816125f4565b9050919050565b7f56616c756520746f204c6f7700000000000000000000000000000000000000005f82015250565b5f612668600c83611a4c565b915061267382612634565b602082019050919050565b5f6020820190508181035f8301526126958161265c565b9050919050565b5f81905092915050565b7f697066733a2f2f000000000000000000000000000000000000000000000000005f82015250565b5f6126da60078361269c565b91506126e5826126a6565b600782019050919050565b5f6126fa82611a42565b612704818561269c565b9350612714818560208601611a5c565b80840191505092915050565b7f2f000000000000000000000000000000000000000000000000000000000000005f82015250565b5f61275460018361269c565b915061275f82612720565b600182019050919050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f61279e60058361269c565b91506127a98261276a565b600582019050919050565b5f6127be826126ce565b91506127ca82856126f0565b91506127d582612748565b91506127e182846126f0565b91506127ec82612792565b9150819050939250505056fea2646970667358221220eac720cdeff59f601239ca89f80b403105eed78d8aebb83d06594137362706db64736f6c634300081d0033
Deployed Bytecode Sourcemap
16946:21404:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21889:674;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26151:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27816:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27299:451;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17221:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21132:300;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28702:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20137:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;37751:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17173:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38137:210;;;;;;;;;;;;;:::i;:::-;;17593:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28963:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20419:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25940:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22627:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18099:312;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18419:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17049:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26320:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17270:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17783:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28092;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29239:227;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17367:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26436:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28471:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17324:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21889:674;21974:4;22289:10;22274:25;;:11;:25;;;;:102;;;;22366:10;22351:25;;:11;:25;;;;22274:102;:179;;;;22443:10;22428:25;;:11;:25;;;;22274:179;:238;;;;22502:10;22487:25;;:11;:25;;;;22274:238;22254:258;;21889:674;;;:::o;26151:100::-;26205:13;26238:5;;;;;;;;;;;;;;;;;26231:12;;26151:100;:::o;27816:204::-;27884:7;27909:16;27917:7;27909;:16::i;:::-;27904:64;;27934:34;;;;;;;;;;;;;;27904:64;27988:15;:24;28004:7;27988:24;;;;;;;;;;;;;;;;;;;;;27981:31;;27816:204;;;:::o;27299:451::-;27372:13;27404:27;27423:7;27404:18;:27::i;:::-;27372:61;;27454:5;27448:11;;:2;:11;;;27444:25;;27461:8;;;27444:25;27509:5;27486:28;;:19;:17;:19::i;:::-;:28;;;27482:175;;27534:44;27551:5;27558:19;:17;:19::i;:::-;27534:16;:44::i;:::-;27529:128;;27606:35;;;;;;;;;;;;;;27529:128;27482:175;27696:2;27669:15;:24;27685:7;27669:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;27734:7;27730:2;27714:28;;27723:5;27714:28;;;;;;;;;;;;27361:389;27299:451;;:::o;17221:42::-;17262:1;17221:42;:::o;21132:300::-;21185:7;21398:15;:13;:15::i;:::-;21382:13;;:31;21375:38;;21132:300;:::o;28702:190::-;28856:28;28866:4;28872:2;28876:7;28856:9;:28::i;:::-;28702:190;;;:::o;20137:274::-;20236:16;20254:21;20304:6;;;;;;;;;;;20293:17;;20357:5;20350:3;20338:9;:15;;;;:::i;:::-;20337:25;;;;:::i;:::-;20321:41;;20137:274;;;;;:::o;37751:179::-;37987:10;37979:18;;:6;;;;;;;;;;;:18;;;37971:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;17210:4:::1;37838:6;37822:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;37814:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;37897:25;37903:10;37915:6;37897:5;:25::i;:::-;37751:179:::0;:::o;17173:41::-;17210:4;17173:41;:::o;38137:210::-;37987:10;37979:18;;:6;;;;;;;;;;;:18;;;37971:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;38187:15:::1;38205:21;38187:39;;38237:25;38273:10;38237:47;;38295:9;:14;;38316:7;38329:5;38295:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38176:171;;38137:210::o:0;17593:33::-;;;;:::o;28963:205::-;29121:39;29138:4;29144:2;29148:7;29121:39;;;;;;;;;;;;:16;:39::i;:::-;28963:205;;;:::o;20419:91::-;37987:10;37979:18;;:6;;;;;;;;;;;:18;;;37971:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;20497:5:::1;20486:8;:16;;;;;;:::i;:::-;;20419:91:::0;:::o;25940:144::-;26004:7;26047:27;26066:7;26047:18;:27::i;:::-;26024:52;;25940:144;;;:::o;22627:234::-;22691:7;22743:1;22715:24;22733:5;22715:17;:24::i;:::-;:29;22711:70;;22753:28;;;;;;;;;;;;;;22711:70;18685:13;22799:18;:25;22818:5;22799:25;;;;;;;;;;;;;;;;:54;22792:61;;22627:234;;;:::o;18099:312::-;18196:10;18178:28;;:16;18186:7;18178;:16::i;:::-;:28;;;18170:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;18260:14;;18237:11;:20;18249:7;18237:20;;;;;;;;;;;:37;;;;18312:7;18285:8;:24;18294:14;;18285:24;;;;;;;;;;;:34;;;;;;:::i;:::-;;18346:1;18330:14;;:17;;;;;;;:::i;:::-;;;;;;;;18358:45;18371:10;18391:1;18395:7;18358:12;:45::i;:::-;18099:312;;:::o;18419:155::-;18476:13;18501:11;18515;:20;18527:7;18515:20;;;;;;;;;;;;18501:34;;18553:8;:13;18562:3;18553:13;;;;;;;;;;;18546:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18419:155;;;:::o;17049:77::-;17086:7;17112:6;;;;;;;;;;;17105:13;;17049:77;:::o;26320:104::-;26376:13;26409:7;;;;;;;;;;;;;;;;;26402:14;;26320:104;:::o;17270:47::-;17316:1;17270:47;:::o;17783:308::-;17840:15;17858:19;:17;:19::i;:::-;17840:37;;17210:4;17914:6;17898:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;17890:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;17981:9;17398:7;17966:6;:11;;;;:::i;:::-;:24;;17958:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;18061:22;18067:7;18076:6;18061:5;:22::i;:::-;17829:262;17783:308;:::o;28092:::-;28203:19;:17;:19::i;:::-;28191:31;;:8;:31;;;28187:61;;28231:17;;;;;;;;;;;;;;28187:61;28313:8;28261:18;:39;28280:19;:17;:19::i;:::-;28261:39;;;;;;;;;;;;;;;:49;28301:8;28261:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;28373:8;28337:55;;28352:19;:17;:19::i;:::-;28337:55;;;28383:8;28337:55;;;;;;:::i;:::-;;;;;;;;28092:308;;:::o;29239:227::-;29430:28;29440:4;29446:2;29450:7;29430:9;:28::i;:::-;29239:227;;;;:::o;17367:38::-;17398:7;17367:38;:::o;26436:339::-;26509:13;26540:16;26548:7;26540;:16::i;:::-;26535:59;;26565:29;;;;;;;;;;;;;;26535:59;26605:21;26629:8;26605:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26680:1;26661:7;26655:21;:26;:112;;;;;;;;;;;;;;;;;26719:7;26733:18;26743:7;26733:9;:18::i;:::-;26691:70;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26655:112;26648:119;;;26436:339;;;:::o;28471:164::-;28568:4;28592:18;:25;28611:5;28592:25;;;;;;;;;;;;;;;:35;28618:8;28592:35;;;;;;;;;;;;;;;;;;;;;;;;;28585:42;;28471:164;;;;:::o;17324:36::-;17359:1;17324:36;:::o;29721:168::-;29778:4;29834:7;29815:15;:13;:15::i;:::-;:26;;:66;;;;;29868:13;;29858:7;:23;29815:66;29795:86;;29721:168;;;:::o;23455:1129::-;23522:7;23542:12;23557:7;23542:22;;23625:4;23606:15;:13;:15::i;:::-;:23;23602:915;;23659:13;;23652:4;:20;23648:869;;;23697:14;23714:17;:23;23732:4;23714:23;;;;;;;;;;;;23697:40;;23830:1;19041:8;23803:6;:23;:28;23799:699;;24322:113;24339:1;24329:6;:11;24322:113;;24382:17;:25;24400:6;;;;;;;24382:25;;;;;;;;;;;;24373:34;;24322:113;;;24468:6;24461:13;;;;;;23799:699;23674:843;23648:869;23602:915;24545:31;;;;;;;;;;;;;;23455:1129;;;;:::o;35650:105::-;35710:7;35737:10;35730:17;;35650:105;:::o;20655:92::-;20711:7;20738:1;20731:8;;20655:92;:::o;32006:2561::-;32147:27;32177;32196:7;32177:18;:27::i;:::-;32147:57;;32262:4;32221:45;;32237:19;32221:45;;;32217:86;;32275:28;;;;;;;;;;;;;;32217:86;32316:23;32342:15;:24;32358:7;32342:24;;;;;;;;;;;;;;;;;;;;;32316:50;;32379:22;32428:4;32405:27;;:19;:17;:19::i;:::-;:27;;;:91;;;;32453:43;32470:4;32476:19;:17;:19::i;:::-;32453:16;:43::i;:::-;32405:91;:150;;;;32536:19;:17;:19::i;:::-;32517:38;;:15;:38;;;32405:150;32379:177;;32574:17;32569:66;;32600:35;;;;;;;;;;;;;;32569:66;32745:1;32707:34;32725:15;32707:17;:34::i;:::-;:39;32703:103;;32770:15;:24;32786:7;32770:24;;;;;;;;;;;;32763:31;;;;;;;;;;;32703:103;33173:18;:24;33192:4;33173:24;;;;;;;;;;;;;;;;33171:26;;;;;;;;;;;;33242:18;:22;33261:2;33242:22;;;;;;;;;;;;;;;;33240:24;;;;;;;;;;;19169:8;18989:3;33623:15;:41;;33581:21;33599:2;33581:17;:21::i;:::-;:84;:128;33535:17;:26;33553:7;33535:26;;;;;;;;;;;:174;;;;33879:1;19169:8;33829:19;:46;:51;33825:626;;33901:19;33933:1;33923:7;:11;33901:33;;34090:1;34056:17;:30;34074:11;34056:30;;;;;;;;;;;;:35;34052:384;;34194:13;;34179:11;:28;34175:242;;34374:19;34341:17;:30;34359:11;34341:30;;;;;;;;;;;:52;;;;34175:242;34052:384;33882:569;33825:626;34498:7;34494:2;34479:27;;34488:4;34479:27;;;;;;;;;;;;34517:42;34538:4;34544:2;34548:7;34557:1;34517:20;:42::i;:::-;32130:2437;;;32006:2561;;;:::o;30154:1596::-;30219:20;30242:13;;30219:36;;30353:1;30341:8;:13;30337:44;;30363:18;;;;;;;;;;;;;;30337:44;30926:1;18753:2;30897:1;:25;;30896:31;30884:8;:44;30858:18;:22;30877:2;30858:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;19107:3;31327:29;31354:1;31342:8;:13;31327:14;:29::i;:::-;:56;;18989:3;31264:15;:41;;31222:21;31240:2;31222:17;:21::i;:::-;:84;:162;31171:17;:31;31189:12;31171:31;;;;;;;;;;;:213;;;;31401:20;31424:12;31401:35;;31451:11;31480:8;31465:12;:23;31451:37;;31505:111;31557:14;;;;;;31553:2;31532:40;;31549:1;31532:40;;;;;;;;;;;;31611:3;31596:12;:18;31505:111;;31648:12;31632:13;:28;;;;30635:1037;;31682:60;31711:1;31715:2;31719:12;31733:8;31682:20;:60::i;:::-;30208:1542;30154:1596;;:::o;26860:148::-;26924:14;26985:5;26975:15;;26860:148;;;:::o;35861:1882::-;35918:17;36339:3;36332:4;36326:11;36322:21;36315:28;;36426:3;36420:4;36413:17;36526:3;36962:5;37094:1;37089:3;37085:11;37078:18;;37233:2;37227:4;37223:13;37219:2;37215:22;37210:3;37202:36;37275:2;37269:4;37265:13;37257:21;;36859:661;37291:4;36859:661;;;37459:1;37454:3;37450:11;37443:18;;37503:2;37497:4;37493:13;37489:2;37485:22;37480:3;37472:36;37376:2;37370:4;37366:13;37358:21;;36859:661;;;36863:427;37552:3;37547;37543:13;37661:2;37656:3;37652:12;37645:19;;37718:6;37713:3;37706:19;35957:1779;;35861:1882;;;:::o;35232:213::-;;;;;:::o;27095:142::-;27153:14;27214:5;27204:15;;27095:142;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:139::-;1887:6;1882:3;1877;1871:23;1928:1;1919:6;1914:3;1910:16;1903:27;1798:139;;;:::o;1943:102::-;1984:6;2035:2;2031:7;2026:2;2019:5;2015:14;2011:28;2001:38;;1943:102;;;:::o;2051:377::-;2139:3;2167:39;2200:5;2167:39;:::i;:::-;2222:71;2286:6;2281:3;2222:71;:::i;:::-;2215:78;;2302:65;2360:6;2355:3;2348:4;2341:5;2337:16;2302:65;:::i;:::-;2392:29;2414:6;2392:29;:::i;:::-;2387:3;2383:39;2376:46;;2143:285;2051:377;;;;:::o;2434:313::-;2547:4;2585:2;2574:9;2570:18;2562:26;;2634:9;2628:4;2624:20;2620:1;2609:9;2605:17;2598:47;2662:78;2735:4;2726:6;2662:78;:::i;:::-;2654:86;;2434:313;;;;:::o;2753:77::-;2790:7;2819:5;2808:16;;2753:77;;;:::o;2836:122::-;2909:24;2927:5;2909:24;:::i;:::-;2902:5;2899:35;2889:63;;2948:1;2945;2938:12;2889:63;2836:122;:::o;2964:139::-;3010:5;3048:6;3035:20;3026:29;;3064:33;3091:5;3064:33;:::i;:::-;2964:139;;;;:::o;3109:329::-;3168:6;3217:2;3205:9;3196:7;3192:23;3188:32;3185:119;;;3223:79;;:::i;:::-;3185:119;3343:1;3368:53;3413:7;3404:6;3393:9;3389:22;3368:53;:::i;:::-;3358:63;;3314:117;3109:329;;;;:::o;3444:126::-;3481:7;3521:42;3514:5;3510:54;3499:65;;3444:126;;;:::o;3576:96::-;3613:7;3642:24;3660:5;3642:24;:::i;:::-;3631:35;;3576:96;;;:::o;3678:118::-;3765:24;3783:5;3765:24;:::i;:::-;3760:3;3753:37;3678:118;;:::o;3802:222::-;3895:4;3933:2;3922:9;3918:18;3910:26;;3946:71;4014:1;4003:9;3999:17;3990:6;3946:71;:::i;:::-;3802:222;;;;:::o;4030:122::-;4103:24;4121:5;4103:24;:::i;:::-;4096:5;4093:35;4083:63;;4142:1;4139;4132:12;4083:63;4030:122;:::o;4158:139::-;4204:5;4242:6;4229:20;4220:29;;4258:33;4285:5;4258:33;:::i;:::-;4158:139;;;;:::o;4303:474::-;4371:6;4379;4428:2;4416:9;4407:7;4403:23;4399:32;4396:119;;;4434:79;;:::i;:::-;4396:119;4554:1;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4525:117;4681:2;4707:53;4752:7;4743:6;4732:9;4728:22;4707:53;:::i;:::-;4697:63;;4652:118;4303:474;;;;;:::o;4783:118::-;4870:24;4888:5;4870:24;:::i;:::-;4865:3;4858:37;4783:118;;:::o;4907:222::-;5000:4;5038:2;5027:9;5023:18;5015:26;;5051:71;5119:1;5108:9;5104:17;5095:6;5051:71;:::i;:::-;4907:222;;;;:::o;5135:619::-;5212:6;5220;5228;5277:2;5265:9;5256:7;5252:23;5248:32;5245:119;;;5283:79;;:::i;:::-;5245:119;5403:1;5428:53;5473:7;5464:6;5453:9;5449:22;5428:53;:::i;:::-;5418:63;;5374:117;5530:2;5556:53;5601:7;5592:6;5581:9;5577:22;5556:53;:::i;:::-;5546:63;;5501:118;5658:2;5684:53;5729:7;5720:6;5709:9;5705:22;5684:53;:::i;:::-;5674:63;;5629:118;5135:619;;;;;:::o;5760:474::-;5828:6;5836;5885:2;5873:9;5864:7;5860:23;5856:32;5853:119;;;5891:79;;:::i;:::-;5853:119;6011:1;6036:53;6081:7;6072:6;6061:9;6057:22;6036:53;:::i;:::-;6026:63;;5982:117;6138:2;6164:53;6209:7;6200:6;6189:9;6185:22;6164:53;:::i;:::-;6154:63;;6109:118;5760:474;;;;;:::o;6240:332::-;6361:4;6399:2;6388:9;6384:18;6376:26;;6412:71;6480:1;6469:9;6465:17;6456:6;6412:71;:::i;:::-;6493:72;6561:2;6550:9;6546:18;6537:6;6493:72;:::i;:::-;6240:332;;;;;:::o;6578:117::-;6687:1;6684;6677:12;6701:117;6810:1;6807;6800:12;6824:180;6872:77;6869:1;6862:88;6969:4;6966:1;6959:15;6993:4;6990:1;6983:15;7010:281;7093:27;7115:4;7093:27;:::i;:::-;7085:6;7081:40;7223:6;7211:10;7208:22;7187:18;7175:10;7172:34;7169:62;7166:88;;;7234:18;;:::i;:::-;7166:88;7274:10;7270:2;7263:22;7053:238;7010:281;;:::o;7297:129::-;7331:6;7358:20;;:::i;:::-;7348:30;;7387:33;7415:4;7407:6;7387:33;:::i;:::-;7297:129;;;:::o;7432:308::-;7494:4;7584:18;7576:6;7573:30;7570:56;;;7606:18;;:::i;:::-;7570:56;7644:29;7666:6;7644:29;:::i;:::-;7636:37;;7728:4;7722;7718:15;7710:23;;7432:308;;;:::o;7746:148::-;7844:6;7839:3;7834;7821:30;7885:1;7876:6;7871:3;7867:16;7860:27;7746:148;;;:::o;7900:425::-;7978:5;8003:66;8019:49;8061:6;8019:49;:::i;:::-;8003:66;:::i;:::-;7994:75;;8092:6;8085:5;8078:21;8130:4;8123:5;8119:16;8168:3;8159:6;8154:3;8150:16;8147:25;8144:112;;;8175:79;;:::i;:::-;8144:112;8265:54;8312:6;8307:3;8302;8265:54;:::i;:::-;7984:341;7900:425;;;;;:::o;8345:340::-;8401:5;8450:3;8443:4;8435:6;8431:17;8427:27;8417:122;;8458:79;;:::i;:::-;8417:122;8575:6;8562:20;8600:79;8675:3;8667:6;8660:4;8652:6;8648:17;8600:79;:::i;:::-;8591:88;;8407:278;8345:340;;;;:::o;8691:509::-;8760:6;8809:2;8797:9;8788:7;8784:23;8780:32;8777:119;;;8815:79;;:::i;:::-;8777:119;8963:1;8952:9;8948:17;8935:31;8993:18;8985:6;8982:30;8979:117;;;9015:79;;:::i;:::-;8979:117;9120:63;9175:7;9166:6;9155:9;9151:22;9120:63;:::i;:::-;9110:73;;8906:287;8691:509;;;;:::o;9206:329::-;9265:6;9314:2;9302:9;9293:7;9289:23;9285:32;9282:119;;;9320:79;;:::i;:::-;9282:119;9440:1;9465:53;9510:7;9501:6;9490:9;9486:22;9465:53;:::i;:::-;9455:63;;9411:117;9206:329;;;;:::o;9541:654::-;9619:6;9627;9676:2;9664:9;9655:7;9651:23;9647:32;9644:119;;;9682:79;;:::i;:::-;9644:119;9802:1;9827:53;9872:7;9863:6;9852:9;9848:22;9827:53;:::i;:::-;9817:63;;9773:117;9957:2;9946:9;9942:18;9929:32;9988:18;9980:6;9977:30;9974:117;;;10010:79;;:::i;:::-;9974:117;10115:63;10170:7;10161:6;10150:9;10146:22;10115:63;:::i;:::-;10105:73;;9900:288;9541:654;;;;;:::o;10201:116::-;10271:21;10286:5;10271:21;:::i;:::-;10264:5;10261:32;10251:60;;10307:1;10304;10297:12;10251:60;10201:116;:::o;10323:133::-;10366:5;10404:6;10391:20;10382:29;;10420:30;10444:5;10420:30;:::i;:::-;10323:133;;;;:::o;10462:468::-;10527:6;10535;10584:2;10572:9;10563:7;10559:23;10555:32;10552:119;;;10590:79;;:::i;:::-;10552:119;10710:1;10735:53;10780:7;10771:6;10760:9;10756:22;10735:53;:::i;:::-;10725:63;;10681:117;10837:2;10863:50;10905:7;10896:6;10885:9;10881:22;10863:50;:::i;:::-;10853:60;;10808:115;10462:468;;;;;:::o;10936:307::-;10997:4;11087:18;11079:6;11076:30;11073:56;;;11109:18;;:::i;:::-;11073:56;11147:29;11169:6;11147:29;:::i;:::-;11139:37;;11231:4;11225;11221:15;11213:23;;10936:307;;;:::o;11249:423::-;11326:5;11351:65;11367:48;11408:6;11367:48;:::i;:::-;11351:65;:::i;:::-;11342:74;;11439:6;11432:5;11425:21;11477:4;11470:5;11466:16;11515:3;11506:6;11501:3;11497:16;11494:25;11491:112;;;11522:79;;:::i;:::-;11491:112;11612:54;11659:6;11654:3;11649;11612:54;:::i;:::-;11332:340;11249:423;;;;;:::o;11691:338::-;11746:5;11795:3;11788:4;11780:6;11776:17;11772:27;11762:122;;11803:79;;:::i;:::-;11762:122;11920:6;11907:20;11945:78;12019:3;12011:6;12004:4;11996:6;11992:17;11945:78;:::i;:::-;11936:87;;11752:277;11691:338;;;;:::o;12035:943::-;12130:6;12138;12146;12154;12203:3;12191:9;12182:7;12178:23;12174:33;12171:120;;;12210:79;;:::i;:::-;12171:120;12330:1;12355:53;12400:7;12391:6;12380:9;12376:22;12355:53;:::i;:::-;12345:63;;12301:117;12457:2;12483:53;12528:7;12519:6;12508:9;12504:22;12483:53;:::i;:::-;12473:63;;12428:118;12585:2;12611:53;12656:7;12647:6;12636:9;12632:22;12611:53;:::i;:::-;12601:63;;12556:118;12741:2;12730:9;12726:18;12713:32;12772:18;12764:6;12761:30;12758:117;;;12794:79;;:::i;:::-;12758:117;12899:62;12953:7;12944:6;12933:9;12929:22;12899:62;:::i;:::-;12889:72;;12684:287;12035:943;;;;;;;:::o;12984:474::-;13052:6;13060;13109:2;13097:9;13088:7;13084:23;13080:32;13077:119;;;13115:79;;:::i;:::-;13077:119;13235:1;13260:53;13305:7;13296:6;13285:9;13281:22;13260:53;:::i;:::-;13250:63;;13206:117;13362:2;13388:53;13433:7;13424:6;13413:9;13409:22;13388:53;:::i;:::-;13378:63;;13333:118;12984:474;;;;;:::o;13464:180::-;13512:77;13509:1;13502:88;13609:4;13606:1;13599:15;13633:4;13630:1;13623:15;13650:410;13690:7;13713:20;13731:1;13713:20;:::i;:::-;13708:25;;13747:20;13765:1;13747:20;:::i;:::-;13742:25;;13802:1;13799;13795:9;13824:30;13842:11;13824:30;:::i;:::-;13813:41;;14003:1;13994:7;13990:15;13987:1;13984:22;13964:1;13957:9;13937:83;13914:139;;14033:18;;:::i;:::-;13914:139;13698:362;13650:410;;;;:::o;14066:180::-;14114:77;14111:1;14104:88;14211:4;14208:1;14201:15;14235:4;14232:1;14225:15;14252:185;14292:1;14309:20;14327:1;14309:20;:::i;:::-;14304:25;;14343:20;14361:1;14343:20;:::i;:::-;14338:25;;14382:1;14372:35;;14387:18;;:::i;:::-;14372:35;14429:1;14426;14422:9;14417:14;;14252:185;;;;:::o;14443:159::-;14583:11;14579:1;14571:6;14567:14;14560:35;14443:159;:::o;14608:365::-;14750:3;14771:66;14835:1;14830:3;14771:66;:::i;:::-;14764:73;;14846:93;14935:3;14846:93;:::i;:::-;14964:2;14959:3;14955:12;14948:19;;14608:365;;;:::o;14979:419::-;15145:4;15183:2;15172:9;15168:18;15160:26;;15232:9;15226:4;15222:20;15218:1;15207:9;15203:17;15196:47;15260:131;15386:4;15260:131;:::i;:::-;15252:139;;14979:419;;;:::o;15404:191::-;15444:3;15463:20;15481:1;15463:20;:::i;:::-;15458:25;;15497:20;15515:1;15497:20;:::i;:::-;15492:25;;15540:1;15537;15533:9;15526:16;;15561:3;15558:1;15555:10;15552:36;;;15568:18;;:::i;:::-;15552:36;15404:191;;;;:::o;15601:174::-;15741:26;15737:1;15729:6;15725:14;15718:50;15601:174;:::o;15781:366::-;15923:3;15944:67;16008:2;16003:3;15944:67;:::i;:::-;15937:74;;16020:93;16109:3;16020:93;:::i;:::-;16138:2;16133:3;16129:12;16122:19;;15781:366;;;:::o;16153:419::-;16319:4;16357:2;16346:9;16342:18;16334:26;;16406:9;16400:4;16396:20;16392:1;16381:9;16377:17;16370:47;16434:131;16560:4;16434:131;:::i;:::-;16426:139;;16153:419;;;:::o;16578:147::-;16679:11;16716:3;16701:18;;16578:147;;;;:::o;16731:114::-;;:::o;16851:398::-;17010:3;17031:83;17112:1;17107:3;17031:83;:::i;:::-;17024:90;;17123:93;17212:3;17123:93;:::i;:::-;17241:1;17236:3;17232:11;17225:18;;16851:398;;;:::o;17255:379::-;17439:3;17461:147;17604:3;17461:147;:::i;:::-;17454:154;;17625:3;17618:10;;17255:379;;;:::o;17640:180::-;17688:77;17685:1;17678:88;17785:4;17782:1;17775:15;17809:4;17806:1;17799:15;17826:320;17870:6;17907:1;17901:4;17897:12;17887:22;;17954:1;17948:4;17944:12;17975:18;17965:81;;18031:4;18023:6;18019:17;18009:27;;17965:81;18093:2;18085:6;18082:14;18062:18;18059:38;18056:84;;18112:18;;:::i;:::-;18056:84;17877:269;17826:320;;;:::o;18152:141::-;18201:4;18224:3;18216:11;;18247:3;18244:1;18237:14;18281:4;18278:1;18268:18;18260:26;;18152:141;;;:::o;18299:93::-;18336:6;18383:2;18378;18371:5;18367:14;18363:23;18353:33;;18299:93;;;:::o;18398:107::-;18442:8;18492:5;18486:4;18482:16;18461:37;;18398:107;;;;:::o;18511:393::-;18580:6;18630:1;18618:10;18614:18;18653:97;18683:66;18672:9;18653:97;:::i;:::-;18771:39;18801:8;18790:9;18771:39;:::i;:::-;18759:51;;18843:4;18839:9;18832:5;18828:21;18819:30;;18892:4;18882:8;18878:19;18871:5;18868:30;18858:40;;18587:317;;18511:393;;;;;:::o;18910:60::-;18938:3;18959:5;18952:12;;18910:60;;;:::o;18976:142::-;19026:9;19059:53;19077:34;19086:24;19104:5;19086:24;:::i;:::-;19077:34;:::i;:::-;19059:53;:::i;:::-;19046:66;;18976:142;;;:::o;19124:75::-;19167:3;19188:5;19181:12;;19124:75;;;:::o;19205:269::-;19315:39;19346:7;19315:39;:::i;:::-;19376:91;19425:41;19449:16;19425:41;:::i;:::-;19417:6;19410:4;19404:11;19376:91;:::i;:::-;19370:4;19363:105;19281:193;19205:269;;;:::o;19480:73::-;19525:3;19546:1;19539:8;;19480:73;:::o;19559:189::-;19636:32;;:::i;:::-;19677:65;19735:6;19727;19721:4;19677:65;:::i;:::-;19612:136;19559:189;;:::o;19754:186::-;19814:120;19831:3;19824:5;19821:14;19814:120;;;19885:39;19922:1;19915:5;19885:39;:::i;:::-;19858:1;19851:5;19847:13;19838:22;;19814:120;;;19754:186;;:::o;19946:543::-;20047:2;20042:3;20039:11;20036:446;;;20081:38;20113:5;20081:38;:::i;:::-;20165:29;20183:10;20165:29;:::i;:::-;20155:8;20151:44;20348:2;20336:10;20333:18;20330:49;;;20369:8;20354:23;;20330:49;20392:80;20448:22;20466:3;20448:22;:::i;:::-;20438:8;20434:37;20421:11;20392:80;:::i;:::-;20051:431;;20036:446;19946:543;;;:::o;20495:117::-;20549:8;20599:5;20593:4;20589:16;20568:37;;20495:117;;;;:::o;20618:169::-;20662:6;20695:51;20743:1;20739:6;20731:5;20728:1;20724:13;20695:51;:::i;:::-;20691:56;20776:4;20770;20766:15;20756:25;;20669:118;20618:169;;;;:::o;20792:295::-;20868:4;21014:29;21039:3;21033:4;21014:29;:::i;:::-;21006:37;;21076:3;21073:1;21069:11;21063:4;21060:21;21052:29;;20792:295;;;;:::o;21092:1395::-;21209:37;21242:3;21209:37;:::i;:::-;21311:18;21303:6;21300:30;21297:56;;;21333:18;;:::i;:::-;21297:56;21377:38;21409:4;21403:11;21377:38;:::i;:::-;21462:67;21522:6;21514;21508:4;21462:67;:::i;:::-;21556:1;21580:4;21567:17;;21612:2;21604:6;21601:14;21629:1;21624:618;;;;22286:1;22303:6;22300:77;;;22352:9;22347:3;22343:19;22337:26;22328:35;;22300:77;22403:67;22463:6;22456:5;22403:67;:::i;:::-;22397:4;22390:81;22259:222;21594:887;;21624:618;21676:4;21672:9;21664:6;21660:22;21710:37;21742:4;21710:37;:::i;:::-;21769:1;21783:208;21797:7;21794:1;21791:14;21783:208;;;21876:9;21871:3;21867:19;21861:26;21853:6;21846:42;21927:1;21919:6;21915:14;21905:24;;21974:2;21963:9;21959:18;21946:31;;21820:4;21817:1;21813:12;21808:17;;21783:208;;;22019:6;22010:7;22007:19;22004:179;;;22077:9;22072:3;22068:19;22062:26;22120:48;22162:4;22154:6;22150:17;22139:9;22120:48;:::i;:::-;22112:6;22105:64;22027:156;22004:179;22229:1;22225;22217:6;22213:14;22209:22;22203:4;22196:36;21631:611;;;21594:887;;21184:1303;;;21092:1395;;:::o;22493:165::-;22633:17;22629:1;22621:6;22617:14;22610:41;22493:165;:::o;22664:366::-;22806:3;22827:67;22891:2;22886:3;22827:67;:::i;:::-;22820:74;;22903:93;22992:3;22903:93;:::i;:::-;23021:2;23016:3;23012:12;23005:19;;22664:366;;;:::o;23036:419::-;23202:4;23240:2;23229:9;23225:18;23217:26;;23289:9;23283:4;23279:20;23275:1;23264:9;23260:17;23253:47;23317:131;23443:4;23317:131;:::i;:::-;23309:139;;23036:419;;;:::o;23461:158::-;23601:10;23597:1;23589:6;23585:14;23578:34;23461:158;:::o;23625:365::-;23767:3;23788:66;23852:1;23847:3;23788:66;:::i;:::-;23781:73;;23863:93;23952:3;23863:93;:::i;:::-;23981:2;23976:3;23972:12;23965:19;;23625:365;;;:::o;23996:419::-;24162:4;24200:2;24189:9;24185:18;24177:26;;24249:9;24243:4;24239:20;24235:1;24224:9;24220:17;24213:47;24277:131;24403:4;24277:131;:::i;:::-;24269:139;;23996:419;;;:::o;24421:162::-;24561:14;24557:1;24549:6;24545:14;24538:38;24421:162;:::o;24589:366::-;24731:3;24752:67;24816:2;24811:3;24752:67;:::i;:::-;24745:74;;24828:93;24917:3;24828:93;:::i;:::-;24946:2;24941:3;24937:12;24930:19;;24589:366;;;:::o;24961:419::-;25127:4;25165:2;25154:9;25150:18;25142:26;;25214:9;25208:4;25204:20;25200:1;25189:9;25185:17;25178:47;25242:131;25368:4;25242:131;:::i;:::-;25234:139;;24961:419;;;:::o;25386:148::-;25488:11;25525:3;25510:18;;25386:148;;;;:::o;25540:161::-;25680:9;25676:1;25668:6;25664:14;25657:33;25540:161;:::o;25711:416::-;25871:3;25896:84;25978:1;25973:3;25896:84;:::i;:::-;25889:91;;25993:93;26082:3;25993:93;:::i;:::-;26115:1;26110:3;26106:11;26099:18;;25711:416;;;:::o;26137:410::-;26243:3;26275:39;26308:5;26275:39;:::i;:::-;26334:89;26416:6;26411:3;26334:89;:::i;:::-;26327:96;;26436:65;26494:6;26489:3;26482:4;26475:5;26471:16;26436:65;:::i;:::-;26530:6;26525:3;26521:16;26514:23;;26247:300;26137:410;;;;:::o;26557:159::-;26701:3;26697:1;26689:6;26685:14;26678:27;26557:159;:::o;26726:416::-;26886:3;26911:84;26993:1;26988:3;26911:84;:::i;:::-;26904:91;;27008:93;27097:3;27008:93;:::i;:::-;27130:1;27125:3;27121:11;27114:18;;26726:416;;;:::o;27152:163::-;27296:7;27292:1;27284:6;27280:14;27273:31;27152:163;:::o;27325:416::-;27485:3;27510:84;27592:1;27587:3;27510:84;:::i;:::-;27503:91;;27607:93;27696:3;27607:93;:::i;:::-;27729:1;27724:3;27720:11;27713:18;;27325:416;;;:::o;27751:1261::-;28234:3;28260:148;28404:3;28260:148;:::i;:::-;28253:155;;28429:95;28520:3;28511:6;28429:95;:::i;:::-;28422:102;;28545:148;28689:3;28545:148;:::i;:::-;28538:155;;28714:95;28805:3;28796:6;28714:95;:::i;:::-;28707:102;;28830:148;28974:3;28830:148;:::i;:::-;28823:155;;28999:3;28992:10;;27751:1261;;;;;:::o
Swarm Source
ipfs://eac720cdeff59f601239ca89f80b403105eed78d8aebb83d06594137362706db
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.